网站编程多少钱,注册微信公众号详细步骤,网站建设 陕icp,推进网站集约化建设 网络安全从linux-2.4内核开始#xff0c;在建立临时页表的时候#xff0c;一般的教科书都说是映射了8M的物理内存#xff0c;但是为什么是映射8M呢#xff1f;当时网上有资料说#xff0c;8M足够了#xff0c;但为什么就足够了#xff0c;一直没有彻底搞清楚#xff0c;今天又重…从linux-2.4内核开始在建立临时页表的时候一般的教科书都说是映射了8M的物理内存但是为什么是映射8M呢当时网上有资料说8M足够了但为什么就足够了一直没有彻底搞清楚今天又重新分析这部分的代码(linux-2.6.24)。 先看下面内存布局图在建立临时页表时到底映射多大的内存取决于以下几个方面(1)保护模式下内核的尺寸 毫无疑问内核代码必须被映射(2)临时页表所占的空间尺寸 假设临时页表映射整个4G的线性地址空间那么页面个数 4G/4k 1M个页面每个页面对应一个页表项占4个字节,那么总共占有4M的空间(3)bootmem allocator是用来在真正的页表建立好之前用于内存管理的他用一个位图表来管理整个内存,每一bit代表一个页框假设有4G的物理内存那么1M个页面共占有空间 1M/8 128K。(4)由于对齐占有的空间(可以忽略感觉k的数量级吧)综合上述几个方面需要映射的物理内存大约等于保护模式内核尺寸 临时页表占用空间尺寸 bootmem allocator位图表尺寸 现在内核大约4M 最大4M 128K 8M 128K在linux内核的head_32.S中下面代码movl $(pg0 - __PAGE_OFFSET), %edimovl $(swapper_pg_dir - __PAGE_OFFSET), %edxmovl $0x007, %eax /* 0x007 PRESENTRWUSER */10:leal 0x007(%edi),%ecx /* Create PDE entry */movl %ecx,(%edx) /* Store identity PDE entry */movl %ecx,page_pde_offset(%edx) /* Store kernel PDE entry */addl $4,%edxmovl $1024, %ecx11:stosladdl $0x1000,%eaxloop 11b/* End condition: we must map up to and including INIT_MAP_BEYOND_END *//* bytes beyond the end of our own page tables; the 0x007 is the attribute bits */leal (INIT_MAP_BEYOND_END0x007)(%edi),%ebpcmpl %ebp,%eaxjb 10bmovl %edi,(init_pg_tables_end - __PAGE_OFFSET)红字部分与映射内存有关INIT_MAP_BEYOND_END BOOTBITMAP_SIZE (PAGE_TABLE_SIZE ALLOCATOR_SLOP)*PAGE_SIZE_asm 128K (4K 4 )*4K 128K 16M 4K所以是映射了8M物理内存 即10之后的代码执行了两次,这完全满足前面分析的需要映射的物理内存的大小。