免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3441 | 回复: 9
打印 上一主题 下一主题

[内存管理] 更改 page table entry屬性,卻未生效 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-06-06 22:31 |显示全部楼层 |倒序浏览
本帖最后由 wth0722 于 2014-06-06 22:39 编辑

各位先進好,

小弟用ioremap()要了一塊記憶體使用

ioreamp()初始化是要了一塊non-cache的記憶體

我後來有去找該address所在的page table entry

找到 ptep = pte_offset_map(pmd, addr);

把ptep的prot改為 PROT_PTE_DEVICE | L_PTE_MT_DEV_CACHED

上面即為ioremap_cached的屬性

改完之後,以為那一塊記憶體就有cache了,但還是沒有

請教各位大大有什麼想法嗎? 謝謝

论坛徽章:
0
2 [报告]
发表于 2014-06-06 22:42 |显示全部楼层
本帖最后由 wth0722 于 2014-06-06 22:43 编辑

還是我需要用下列這方式

set_pte_at(&init_mm, addr, pte, pfn_pte(pfn, prot));

去set那page table entry的屬性才是真正寫入成功???



论坛徽章:
0
3 [报告]
发表于 2014-06-07 14:46 |显示全部楼层
我有一個測試程式利用dma
不去做flush cache就可以看到不一樣結果

论坛徽章:
0
4 [报告]
发表于 2014-06-09 13:19 |显示全部楼层
已經找出原因了

單純只是去修改記憶體上的page table並沒有用

必需要使用set_pte_at()設定page table entry才有用

论坛徽章:
0
5 [报告]
发表于 2014-06-09 15:13 |显示全部楼层
看了一下 set_pte_at()之後

發現為什麼直接改memory上的page table entry是無效了

因為set_pte_at()有去變更h/w pte,而上面的變更只是linux pte

论坛徽章:
0
6 [报告]
发表于 2014-06-09 16:49 |显示全部楼层
Linux 3.4.5

论坛徽章:
0
7 [报告]
发表于 2014-06-10 10:21 |显示全部楼层
回复 12# l4rmbr

先感謝你的回應

flush_cache_page(vma, addr, pfn);             <--- 沖刷數據/指令緩存
set_pte(pte_pointer, new_pte_val);             <--- 更新頁表項
flush_tlb_page(vma, addr);                          <--- 沖刷tlb緩存

我無法用上面那些,因為ioremap()後,那塊記憶體是沒有vma的
我試過find_vma()是找不到的


我這邊是ARM arch,並沒有set_pte(),只有set_pte_at()
再來其實一開始我是有flush all cache 以及 鎖TLB,但還是沒有解決問題
後來才知道是因為我是只有更改Linux pte,並沒有改道h/w pte
所以才會需要set_pte_at()幫我去修改他


還有其實ARM arch的d-cache 是VIPT non-aliasing
i-cache才是VIVT


   

论坛徽章:
0
8 [报告]
发表于 2014-06-10 11:51 |显示全部楼层
回复 14# chenyu105

不好意思,請問跟我講哪一點有矛盾?

set_pte_at() -> cpu_v7_set_pte_ext() 這邊若是UP則會flush cache

我從頭到尾就一直說問題的點是在於只有寫入到Linux pte,並沒有寫到h/w pte

TLB、cache的問題我不認為問題點在那邊阿,因為我試過flush也沒用
   

论坛徽章:
0
9 [报告]
发表于 2014-06-10 11:58 |显示全部楼层
回复 15# l4rmbr


我用是ARM arch的,這邊是有兩份pte的

原因是Linux所要的pte資訊,ARM並沒有提供,所以要多一份保存

請參考arch/arm/include/asm/pgtable-2level.h

31  * This leads to the page tables having the following layout:
32  *
33  *    pgd             pte
34  * |        |
35  * +--------+
36  * |        |                 +------------+ +0
37  * +- - - - +               | Linux pt 0 |
38  * |        |                 +------------+ +1024
39  * +--------+     +0    | Linux pt 1 |
40  * |        |----->       +------------+ +2048
41  * +- - - - + +4          |  h/w pt 0  |
42  * |        |----->       +------------+ +3072
43  * +--------+     +8    |  h/w pt 1  |
44  * |        |                +------------+ +4096
45  *

论坛徽章:
0
10 [报告]
发表于 2014-06-10 13:08 |显示全部楼层
回复 19# chenyu105


set_pte_at()  --->  cpu_v7_set_pte_ext()

cpu_v7_set_pte_ext()這裡面會去寫入到h/w pte


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP