原帖由 独孤九贱 于 2008-1-15 16:32 发表
物理地址(physical address)
用于内存芯片级的单元寻址,与处理器和CPU连接的地址总线相对应。
——这个概念应该是这几个概念中最好理解的一个,但是值得一提的是,虽然可以直接把物理地址理解成插在机器上那根内存本身,把内存看成一个从0字节一直到最大空量逐字节的编号的大数组,然后把这个数组叫做物理地址,但是事实上,这只是一个硬件提供给软件的抽像,内存的寻址方式并不是这样。所以,说它是“与地址总线相对应”,是更贴切一些,不过抛开对物理内存寻址方式的考虑,直接把物理地址与物理的内存一一对应,也是可以接受的。也许错误的理解更利于形而上的抽像。
原帖由 yamir 于 2008-1-18 14:44 发表
相当不错的文章,如果在物理地址这里能再说清楚点就完美了
把物理地址与物理内存一一对应在刚开始学的时候是可以接受,不过再更深入到x86的体系架构中,这样理解,容易会产生很多混淆了,还是应该把北桥 ...
原帖由 vestige 于 2008-1-20 21:18 发表
感谢楼主分享!不过我对于这句话有点疑问:
2、这样的二级模式是否真的节约了空间;
也就是算一下页目录项和页表项共占空间 (2^10 * 4 + 2 ^10 *4) = 8KB。哎,……怎么说呢!!!
这样计算的结果应该是 ...
原帖由 softchinacom 于 2008-1-22 14:19 发表
从硬件设计的角度来看!
物理地址: 内存单元的编号,逻辑上是将将内存单元按照一定的度量单位划分,如字节,字等,80x86 可以按字节也可以按字编址。所谓的总线只是一个存取通路,插座相当于一个设备开关。地址空 ...
原帖由 softchinacom 于 2008-1-22 14:19 发表
从硬件设计的角度来看!
物理地址: 内存单元的编号,逻辑上是将将内存单元按照一定的度量单位划分,如字节,字等,80x86 可以按字节也可以按字编址。所谓的总线只是一个存取通路,插座相当于一个设备开关。地址空 ...
61254_080216010548.gif (14.25 KB, 下载次数: 78)
原帖由 vestige 于 2008-3-29 12:42 发表
我对这里还有一点疑问:
从软件的角度上来讲,因为它的项只有一个,32位,刚好可以存放与PGD中长度一样的地址指针。那么所谓先到PUD,到到PMD中做映射转换,就变成了保持原值不变,一一转手就可以了。这样,就 ...
/* 代码中所有和pud有关的部分都是假的,被实现成空函数,例如pud_alloc_one()、pgd_cmpxchg_rel()等等 */ pgd = pgd_offset(mm, mpaddr); again_pgd: if (unlikely(pgd_none(*pgd))) { // acquire semantics pud_t *old_pud = NULL; pud = pud_alloc_one(mm, mpaddr); if (unlikely(!pgd_cmpxchg_rel(mm, pgd, old_pud, pud))) { pud_free(pud); goto again_pgd; } } pud = pud_offset(pgd, mpaddr); //这里仍然返回指向PGD的指针 again_pud: if (unlikely(pud_none(*pud))) { // acquire semantics pmd_t* old_pmd = NULL; pmd = pmd_alloc_one(mm, mpaddr); if (unlikely(!pud_cmpxchg_rel(mm, pud, old_pmd, pmd))) { pmd_free(pmd); goto again_pud; } } pmd = pmd_offset(pud, mpaddr); again_pmd: if (unlikely(pmd_none(*pmd))) { // acquire semantics pte_t* old_pte = NULL; pte_t* pte = pte_alloc_one_kernel(mm, mpaddr); if (unlikely(!pmd_cmpxchg_kernel_rel(mm, pmd, old_pte, pte))) { pte_free_kernel(pte); goto again_pmd; } } |
原帖由 vestige 于 2008-3-29 15:49 发表
Thanks 楼上 a lot!
我看ULK里讲到:
The kernel keeps a position for the Page Upper Directory and the Page Middle Directory by setting the number of entries in them to 1 and mapping these ...
嗯,先根据0000100000(32),在页目录数组中索引,找到其元素中的地址,取其高20位,找到页表的地址,页表的地址是由内核动态分配的,接着,再加一个offset,就是最终的物理地址了。
欢迎光临 Chinaunix (http://bbs.chinaunix.net/) | Powered by Discuz! X3.2 |