原帖由 獨孤九賤 于 2008-1-15 16:32 發(fā)表
物理地址(physical address)
用于內(nèi)存芯片級的單元尋址,與處理器和CPU連接的地址總線相對應(yīng)。
——這個概念應(yīng)該是這幾個概念中最好理解的一個,但是值得一提的是,雖然可以直接把物理地址理解成插在機器上那根內(nèi)存本身,把內(nèi)存看成一個從0字節(jié)一直到最大空量逐字節(jié)的編號的大數(shù)組,然后把這個數(shù)組叫做物理地址,但是事實上,這只是一個硬件提供給軟件的抽像,內(nèi)存的尋址方式并不是這樣。所以,說它是“與地址總線相對應(yīng)”,是更貼切一些,不過拋開對物理內(nèi)存尋址方式的考慮,直接把物理地址與物理的內(nèi)存一一對應(yīng),也是可以接受的。也許錯誤的理解更利于形而上的抽像。
原帖由 yamir 于 2008-1-18 14:44 發(fā)表
相當(dāng)不錯的文章,如果在物理地址這里能再說清楚點就完美了
把物理地址與物理內(nèi)存一一對應(yīng)在剛開始學(xué)的時候是可以接受,不過再更深入到x86的體系架構(gòu)中,這樣理解,容易會產(chǎn)生很多混淆了,還是應(yīng)該把北橋 ...
原帖由 vestige 于 2008-1-20 21:18 發(fā)表
感謝樓主分享!不過我對于這句話有點疑問:
2、這樣的二級模式是否真的節(jié)約了空間;
也就是算一下頁目錄項和頁表項共占空間 (2^10 * 4 + 2 ^10 *4) = 8KB。哎,……怎么說呢!!
這樣計算的結(jié)果應(yīng)該是 ...
原帖由 softchinacom 于 2008-1-22 14:19 發(fā)表
從硬件設(shè)計的角度來看!
物理地址: 內(nèi)存單元的編號,邏輯上是將將內(nèi)存單元按照一定的度量單位劃分,如字節(jié),字等,80x86 可以按字節(jié)也可以按字編址。所謂的總線只是一個存取通路,插座相當(dāng)于一個設(shè)備開關(guān)。地址空 ...
原帖由 softchinacom 于 2008-1-22 14:19 發(fā)表
從硬件設(shè)計的角度來看!
物理地址: 內(nèi)存單元的編號,邏輯上是將將內(nèi)存單元按照一定的度量單位劃分,如字節(jié),字等,80x86 可以按字節(jié)也可以按字編址。所謂的總線只是一個存取通路,插座相當(dāng)于一個設(shè)備開關(guān)。地址空 ...
61254_080216010548.gif (14.25 KB, 下載次數(shù): 81)
原帖由 vestige 于 2008-3-29 12:42 發(fā)表
我對這里還有一點疑問:
從軟件的角度上來講,因為它的項只有一個,32位,剛好可以存放與PGD中長度一樣的地址指針。那么所謂先到PUD,到到PMD中做映射轉(zhuǎn)換,就變成了保持原值不變,一一轉(zhuǎn)手就可以了。這樣,就 ...
/* 代碼中所有和pud有關(guān)的部分都是假的,被實現(xiàn)成空函數(shù),例如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 發(fā)表
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 ...
原帖由 pro_mise 于 2008-4-13 16:29 發(fā)表
呵呵,九賤兄幸苦了啊。
to 44:
您提到總線地址是邏輯地址?在x86平臺,對應(yīng)PCI總線,總線地址應(yīng)該是物理地址吧?
嗯,先根據(jù)0000100000(32),在頁目錄數(shù)組中索引,找到其元素中的地址,取其高20位,找到頁表的地址,頁表的地址是由內(nèi)核動態(tài)分配的,接著,再加一個offset,就是最終的物理地址了。
歡迎光臨 Chinaunix (http://72891.cn/) | Powered by Discuz! X3.2 |