1.临时内核页表的初始化(setup_32.s)
2.启动分页机制(head_32.s)
3.建立低端内存和高端内存固定映射区的页表( init_memory_mapping())
4.建立高端内存永久映射区的页表并获取固定映射区的临时映射区页表(paging_init())
具体分析低端内存页表的建立
在setup_arch()中内核通过调用init_memory_mapping()来建立低端内存页表
[cpp] view plaincopy
void __init setup_arch(char **cmdline_p)
...
...
/* max_pfn_mapped is updated here */
max_low_pfn_mapped = init_memory_mapping(0, max_low_pfn<<PAGE_SHIFT)
max_pfn_mapped = max_low_pfn_mapped
...
...
内核将低端内存的起始地址(0),和低端内存的结束地址(max_low_pfn<<PAGE_SHIFT)传递给init_memory_mapping(),下面来看Init_memory_mapping()的具体实现,简单起见,只分析32位系统的情况。
64位的linux采用4级页表,支持的最大物理内存为64T。对于虚拟地址空间的划分,将0x0000,0000,0000,0000 – 0x0000,7fff,ffff,f000这128T地址用于用户空间;而0xffff,8000,0000,0000以上的128T为系统空间地址。
具体的不是一两句能说清楚了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)