我最近正在深入研究Linux内存管理的细节,因为我想为自己的玩具内核实现类似的东西,所以我希望熟悉细节的人能帮助我理解一件事.显然,物理内存管理器是伙伴算法,它进一步专门用于返回特定顺序的页面块(0到9,其中0只是一个页面).对于每个订单,块都存储为链接列表.假设如果请求了一个5阶块但在5阶块列表中找不到,则该算法按顺序搜索一个块,将其分成两部分,给出所请求的一半并将另一半的顺序移动到较低的位置(如它的大小只有一半).
我没有得到的是内核如何存储这些结构,或者它如何为它们分配空间.因为对于订单0页面,您需要1M条目(每个是4KiB页面),这是否意味着内核分配1MiB * sizeof(结构页面)?订单1及以上的块怎么样?内核是否通过将它们标记为更高的顺序来重用已分配的块,并且当它需要将它分成两个时,只返回块并获得一个未使用的块?
解决方法:
What I don’t get is how the kernel stores these structures, or how it allocates space for them. Since for order 0 pages you would need 1M entries (each is a 4KiB page), does it mean that the kernel allocates 1MiB * sizeof(struct page)?
690 /*
691 * paging_init() sets up the page tables - note that the first 8MB are
692 * already mapped by head.S.
...*/
697 void __init paging_init(void)
698 {
699 pagetable_init();
...
711 zone_sizes_init();
712 }
pagetable_init()在1024 pgd_ts的swapper_pg_dir数组中创建内核页表.
> calculate_node_totalpages()打印dmesg中每个节点的页数
> alloc_node_mem_map()为该节点中的每个物理页面分配struct页面的实际工作;它们的内存由bootmem分配器doc1 doc2分配(您可以通过bootmem_debug = 1内核引导选项查看其调试):
4936 size =(end – start)* sizeof(struct page);
4937 map = alloc_remap(pgdat-> node_id,size);
if(!map)map = memblock_virt_alloc_node_nopanic(size,pgdat-> node_id);
free_area_init_core() The memory map is built, and the freelists and buddy bitmaps initialized, in free_area_init_core().
初始化每个区域中的免费订单列表,并将订单标记为没有任何免费页面:free_area_init_core() – > init_currently_empty_zone() – > zone_init_free_lists:
4147 static void __meminit zone_init_free_lists(struct zone *zone)
4148 {
4149 unsigned int order, t;
4150 for_each_migratetype_order(order, t) {
4151 INIT_LIST_HEAD(&zone->free_area[order].free_list[t]);
4152 zone->free_area[order].nr_free = 0;
4153 }
4154 }
PS:内核中有init(),名为start_kernel(),LXR(Linux交叉引用)将帮助您在函数之间导航(我发布了链接到lxr.free-electrons.com,但有几个在线LXR) :
501 asmlinkage __visible void __init start_kernel(void)
...
528 boot_cpu_init();
529 page_address_init();
530 pr_notice("%s", linux_banner);
531 setup_arch(&command_line);
标签:memory-management,c-3,linux,linux-kernel,kernel
来源: https://codeday.me/bug/20190623/1275132.html