ARM64內(nèi)核的內(nèi)存布局
進(jìn)程有用戶態(tài)和內(nèi)核態(tài),同樣進(jìn)程的地址空間包括用戶地址空間和內(nèi)核地址空間呻逆,用戶態(tài)訪問用戶地址空間请唱,內(nèi)核態(tài)訪問內(nèi)核地址空間,通過ION SMMU CAM分配的一塊buffer床蜘,映射到用戶地址空間禾进,才能在用戶態(tài)訪問歪赢,映射到內(nèi)核地址空間,才能在內(nèi)核態(tài)訪問
一戴已、兩種進(jìn)程地址空間的布局介紹
1、在x86_32,虛擬地址空間從0到0xc0000000,每個用戶進(jìn)程有3GB可用碑隆。TASK_UNMAPPED_BASE一般起始于0x4000000(即1GB)恭陡。這意味著堆只有1GB的空間可供使用,繼續(xù)增長則進(jìn)入到mmap區(qū)域上煤。這時mmap區(qū)域是自底向上擴(kuò)展的休玩。
2、使用固定值限制棧的最大長度劫狠。由于棧是有界的拴疤,因此安置內(nèi)存映射的區(qū)域可以在棧末端的下方立即開始。這時mmap區(qū)是自頂向下擴(kuò)展的独泞。由于堆仍然位于虛擬地址空間中較低的區(qū)域并向上增長呐矾,因此mmap區(qū)域和堆可以相對擴(kuò)展,直至耗盡虛擬地址空間中剩余的區(qū)域
二懦砂、進(jìn)程的內(nèi)存布局選擇的工作由arch_pick_mmap_layout完成蜒犯。其中arch_get_unmapped_area()完成從低地址向高地址創(chuàng)建新的映射,而arch_get_unmapped_area_topdown()完成從高地址向低地址創(chuàng)建新的映射荞膘。
kernel/msm-4.19/arch/arm64/mm/mmap.c
/*
* This function, called very early during the creation of a new process VM
* image, sets up which VM layout function to use:
*/
void arch_pick_mmap_layout(struct mm_struct *mm, struct rlimit *rlim_stack)
{
unsigned long random_factor = 0UL;
if (current->flags & PF_RANDOMIZE)
random_factor = arch_mmap_rnd();
/*
* Fall back to the standard layout if the personality bit is set, or
* if the expected stack growth is unlimited:
*/
if (mmap_is_legacy(rlim_stack)) {
mm->mmap_base = TASK_UNMAPPED_BASE + random_factor;
mm->get_unmapped_area = arch_get_unmapped_area;
} else {
mm->mmap_base = mmap_base(random_factor, rlim_stack);
mm->get_unmapped_area = arch_get_unmapped_area_topdown;
}
}
三罚随、arch_pick_mmap_layout什么時候調(diào)用
<4>[ 167.681299][02-14 21:01:39] Call trace:
<4>[ 167.681313][02-14 21:01:39] dump_backtrace+0x0/0x188
<4>[ 167.681320][02-14 21:01:39] show_stack+0x14/0x20
<4>[ 167.681329][02-14 21:01:39] dump_stack+0xc4/0xfc
<4>[ 167.681337][02-14 21:01:39] arch_pick_mmap_layout+0x198/0x1a8
<4>[ 167.681345][02-14 21:01:39] setup_new_exec+0x54/0x190
<4>[ 167.681354][02-14 21:01:39] load_elf_binary+0x328/0x1508
<4>[ 167.681359][02-14 21:01:39] search_binary_handler+0xac/0x218
<4>[ 167.681364][02-14 21:01:39] __do_execve_file+0x6ec/0x9d8
<4>[ 167.681369][02-14 21:01:39] set_binfmt+0x8c/0x1d8
<4>[ 167.681375][02-14 21:01:39] __arm_smccc_hvc+0x154/0x49c
<4>[ 167.681381][02-14 21:01:39] __arm_smccc_hvc+0x98/0x49c
<4>[ 167.681388][02-14 21:01:39] el0_svc+0x8/0xc