
创建页表是通过函数__create_page_tables来实现的;这里,我们使用的是arm的L1主页表,L1主页表也称为段页表(sectionpage table)L1主页表将4 GB的地址空间分成若干个1MB的段(section),因此L1页表包含4096个页表项(sectionentry).。每个页表项是32 bits(4bytes),因而L1主页表占用4096*4=16k的内存空间。
启动MMU后会重新分配,在start_kernel的paging_init(struct machine_desc *mdesc)这个函数中,这也是分析内核的一个难点了
不能插图啊,望见谅!!!
Linux将物理内存按固定大小的页面(一般为4K)划分内存,在内核初始化时,会建立一个全局structpage结构数组mem_map[
]。如系统中有76G物理内存,则物理内存页面数为76*1024*1024k/4K=
19922944个页面,mem_map[
]数组大小19922944,即为数组中每个元素和物理内存页面一一对应,整个数组就代表着系统中的全部物理页面。
在服务器中,存在NUMA架构(如Nehalem、Romly等),Linux将NUMA中内存访问速度一致(如按照内存通道划分)的部分称为一个节点(Node),用struct
pglist_data数据结构表示,通常使用时用它的typedef定义pg_data_t。系统中的每个结点都通过pgdat_list链表pg_data_t->node_next连接起来,该链接以NULL为结束标志。每个结点又进一步分为许多块,称为区域(zones)。区域表示内存中的一块范围。区域用struct
zone_struct数据结构表示,它的typedef定义为zone_t。更多详细的解答可以查看《Linux就该这么学》。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)