- 論壇徽章:
- 0
|
本帖最后由 l4rmbr 于 2014-06-09 22:54 編輯
[非常抱歉,網(wǎng)絡(luò)原因發(fā)了相同內(nèi)容兩次,麻煩版主刪除這個(gè)帖子吧。謝謝!]
看了樓主的表述,樓主你應(yīng)該是在更新頁(yè)表項(xiàng)后忘了沖刷tlb緩存。正確用法應(yīng)該像這樣:
flush_cache_page(vma, addr, pfn); <--- 沖刷數(shù)據(jù)/指令緩存
set_pte(pte_pointer, new_pte_val); <--- 更新頁(yè)表項(xiàng)
flush_tlb_page(vma, addr); <--- 沖刷tlb緩存
此外,多說(shuō)兩點(diǎn).
1.
set_pte_at() 與 set_pte()功能基本相同,不過(guò)前者用來(lái)實(shí)現(xiàn)鉤子,用以
沖刷相應(yīng)的數(shù)據(jù)/指令緩存。
在大多數(shù)體系架構(gòu)下,這兩個(gè)函數(shù)一樣。不過(guò)arm是個(gè)例外。因?yàn)樗莢ivt
架構(gòu)(virtual indexed and virtual tagged), 所以更新了虛擬地址的頁(yè)表項(xiàng),
也要相應(yīng)地刷新緩存。 x86就不用,因?yàn)樗莗ipi(physical indexed and physical tagged)
緩存一致性由cpu內(nèi)在地保證,不需要程序員干預(yù)。
2.
我大概翻了下代碼,發(fā)現(xiàn)set_pte一般用在第一次創(chuàng)建一個(gè)表項(xiàng)時(shí),此時(shí)無(wú)所謂“更新”一說(shuō)。
如果是要更新一個(gè)舊頁(yè)表項(xiàng),則用的是set_pte_at。
這也符合這兩個(gè)接口的設(shè)計(jì)目的。 |
|