Chinaunix

标题: linux内核建立临时页表时到底映射了多大的内存? [打印本页]

作者: liujunwei1234    时间: 2010-08-08 20:28
标题: linux内核建立临时页表时到底映射了多大的内存?
以前的教程都说linux建立了8M的临时页表,两个页目录项。今天在看linux-2.6.34的时候,没看出内核到底映射了多大的内存,希望高手指教。
下面代码中红色部分是计算到底映射多大内存的,但是具体数值是多少啊?
page_pde_offset = (__PAGE_OFFSET >> 20);

        movl $pa(__brk_base), %edi
        movl $pa(swapper_pg_dir), %edx /*%edx = 页目录的起始地址*/
        
       /* #define PTE_IDENT_ATTR         0x003*/                /* PRESENT+RW */
        movl $PTE_IDENT_ATTR, %eax
10:
       /* #define PDE_IDENT_ATTR         0x067 */                /* PRESENT+RW+USER+DIRTY+ACCESSED */
        leal PDE_IDENT_ATTR(%edi),%ecx                /* Create PDE entry */
        movl %ecx,(%edx)                        /* Store identity PDE entry */
        movl %ecx,page_pde_offset(%edx)                /* Store kernel PDE entry */
        addl $4,%edx                         /*页目录项加1*/
        movl $1024, %ecx
11:
        stosl
        addl $0x1000,%eax /* %eax中存放的是页的物理地址*/
        loop 11b
        /*
         * End condition: we must map up to the end + MAPPING_BEYOND_END.
         */
        movl $pa(_end) + MAPPING_BEYOND_END + PTE_IDENT_ATTR, %ebp
        cmpl %ebp,%eax
        jb 10b
        addl $__PAGE_OFFSET, %edi
        movl %edi, pa(_brk_end)
        shrl $12, %eax
        movl %eax, pa(max_pfn_mapped)

作者: liujunwei1234    时间: 2010-08-09 18:51
回复 1# liujunwei1234


    为什么每次发帖都没人回答我啊!
作者: accessory    时间: 2010-08-10 00:32
因为你已经是高手了. 新手的问题我一般都可以回答 :p

/*
         * End condition: we must map up to the end + MAPPING_BEYOND_END.
         */

这里已经说了 end + MAPPING_BEYOND_END 啊. 把这2个找出来就可以了.

而且,这个END很有可能是动态算的. 比如万一内核代码本身很大,超过了8M (虽然一般是 3M多). 那么这时候也会多映射些.
作者: etoux    时间: 2010-08-10 14:35
今天看了书上写的是8mb,两个目录项。一页是4kb,两个目录项就是4k*1k*2 = 8mb (一个目录框下有2^10个页表)。
我是新手,帮顶顺便瞎说几句。
作者: liujunwei1234    时间: 2010-08-14 10:24
回复 1# liujunwei1234


    抽时间又看了下启动阶段的内存管理,有点弄明白了为什么要映射8M的物理内存,和大家交流下。
   具体的内容见:
    [url=http://blog.chinaunix.net/u3/95743/showart_2297352.html]http://blog.chinaunix.net/u3/95743/showart_2297352.html[/url]
作者: accessory    时间: 2010-08-14 23:26
不错。。。。。
作者: zhangsuozhu    时间: 2010-08-25 14:13
分二步第一步是8M.     第二步是896M.

第一步的8M是为第二步的896M的页表准备空间。
作者: liujunwei1234    时间: 2010-08-25 18:22
回复 7# zhangsuozhu


    第一步的8M是为第二步的896M准备空间说法不太确切吧,总体感觉8M就够用了,太大了也是浪费,而不仅仅就是为了896M准备空间吧,准备的话,多大不行啊,非得8M啊。
作者: zhangsuozhu    时间: 2010-08-25 20:59
前1M不用. 第2M或3M内核用,根据不同内核的裁剪大小不同.如果只影射4M的话, 还剩不到1M的空间.

1G的大小的页表大小约1M.为了以后扩展, 所以分了8M.  即分了二个页目录项下的所有页表项.

因为建页目录分二步,所以我觉的临时页表就是为了建立内核的1G的页表准备的.




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2