亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
12345下一頁
最近訪問板塊 發(fā)新帖
查看: 23271 | 回復(fù): 46
打印 上一主題 下一主題

一個cache相關(guān)的問題 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2010-11-04 21:47 |只看該作者 |倒序瀏覽
這周碰到的一個問題,在解決的過程中得到不少高手的熱心幫助,把一些總結(jié)貼出來,歡迎大家指點。

寫一個屏驅(qū)動的時候,需要把一塊內(nèi)核中用kmalloc分配的內(nèi)存映射到應(yīng)用層中使用。這是一個很simple的需求,很輕松的就可以通過mmap搞定:

驅(qū)動部分代碼:
1698         if((mmap_addr = kmalloc(PAGE_SIZE, GFP_KERNEL)) == NULL){
1699                 ret = -ENOMEM;
1700                 goto out;
1701         }
1702         SetPageReserved(virt_to_page((mmap_addr)));

....

899         long length = vma->vm_end - vma->vm_start;
900
901         if (length > PAGE_SIZE)
902                 return -EIO;
903
904         if ((ret = remap_pfn_range(vma,vma->vm_start,virt_to_phys((void *)mmap_addr) >> PAGE_SHIFT,length,vma->vm_page_prot)) < 0) {
905                 return ret;

....


應(yīng)用層通過
401         if( ( addr = mmap(NULL, 4096, PROT_WRITE|PROT_READ, MAP_SHARED, fd, 0 )) == (void *)-1)
402         {
403                 perror("mmap error\n");
404                 return -1;
405         }
獲得地址, 然后往內(nèi)寫入

這是一種通過普通內(nèi)存設(shè)為保留,當(dāng)成io內(nèi)存映射并map出去的一種方式。經(jīng)過測試,發(fā)現(xiàn)大部分時候數(shù)據(jù)是對的,但偶爾數(shù)據(jù)會出錯。隨后嘗試不采用remap_pfn_range建立頁表,而是通過缺頁時返回分配頁的動態(tài)方式來處理,結(jié)果仍然一樣。

我們猜測是由于cache的原因?qū)е碌,于是在mmap的時候使其nocache,仍然無法解決。在實在沒有辦法的情況下,我們嘗試采用在內(nèi)核讀取共享內(nèi)存時執(zhí)行flush_all_cache,果然,解決了問題,證明了確實是cache導(dǎo)致的。

那么為什么一開始我們種種嘗試未能成功呢?因為我們弄反了方向。我們以為是應(yīng)用層在讀cache,內(nèi)核讀內(nèi)存,實際上,由于采用remap_pfn_range,或者我們在mmap的時候指定了nocache的方式,應(yīng)用層讀取這片vma的時候是根據(jù)其指定的nocache屬性去讀內(nèi)存,而內(nèi)核訪問kmalloc的時候卻是讀內(nèi)存。如何讓內(nèi)核也讀內(nèi)存呢,很簡單,通過ioremap_nocache把kmalloc得到的地址再做一次映射,然后給內(nèi)核用就可以了。

這就是傳說中的Cache Coherence ---緩存一致性。由于cache和內(nèi)存在某些時候的不一致而導(dǎo)致的不同地址空間分別讀寫導(dǎo)致的問題。并不是所有體系結(jié)構(gòu)都存在這種問題,比如x86.我曾經(jīng)在x86上用過mmap并且使用良好,因為x86的體系結(jié)構(gòu)確保了緩存一致性:其總線監(jiān)聽技術(shù)使當(dāng)某片被cache的內(nèi)存被其他請求操作時,會被立刻回寫,確保cache與內(nèi)存的一致性。但這種監(jiān)聽技術(shù)會帶來性能上的損耗,所以arm是由軟件來確保這個一致性的:一些時候,比如進(jìn)程切換,必須通過flush整個cache獲得正確的內(nèi)存訪問。

在這里例子里,我們是通過內(nèi)核和應(yīng)用都nocache的方式來進(jìn)行內(nèi)存共享的。那么雙方能不能通過cache的方式來訪問呢?我們必須知道,有兩種cache:物理cache和邏輯cache,對于armv6以下的arm芯片,采用的是邏輯cache的方式,即cache在mmu之前,而armv6及以上的cpu,cache在mmu之后,cpu送出的要訪問的地址先通過mmu進(jìn)行虛擬/物理的轉(zhuǎn)換,再送到cache。這意味著什么呢?意味著對于我們的cpu(v5),當(dāng)應(yīng)用層用其地址空間的地址把共享區(qū)從內(nèi)存加到cache后,內(nèi)核同樣訪問這片區(qū)域的時候,也可以按照其kmalloc分配的地址將同一片內(nèi)存中的數(shù)據(jù)加載到cache的另一行中,這就意味著一個內(nèi)存塊會有2個cache拷貝,也就是傳說中的別名。簡單地說,如果你用arm11,由于使用物理cache,所以不會有問題,而arm9的話,就很麻煩了。

那為什么有時候訪問正確,有時候訪問錯誤呢?這就和cache的替換策略有關(guān)了。不像x86由于總線監(jiān)視的原因,可以在相關(guān)內(nèi)存被touch的時候回寫,arm的cache只有當(dāng)是dirty,并且被cache輪轉(zhuǎn)策略選中需要換出的時候,才會被回寫。所以有時候,某些加載共享內(nèi)存的cache塊沒有被替換,而相應(yīng)的內(nèi)存塊又被內(nèi)核加載到cache形成別名,錯誤就自然產(chǎn)生了。

這就是cache導(dǎo)致的問題。如果雙方采用一樣的cache策略,自然cache就是透明的,但是如果是不一樣的方式,那么可能就會有問題。具體會有哪些問題,如前所述,就和cpu,體系結(jié)構(gòu)有著密切的關(guān)系了。

論壇徽章:
0
2 [報告]
發(fā)表于 2010-11-04 22:23 |只看該作者
本帖最后由 sep 于 2010-11-04 22:24 編輯

受教了!拔覀円詾槭菓(yīng)用層在讀cache,內(nèi)核讀內(nèi)存”,開始我也這樣以為的,本來還對snail同學(xué)存在一些疑問。嵌入式版塊里一個tx的問題估計跟你的問題類似。

論壇徽章:
7
丑牛
日期:2013-10-18 14:43:21技術(shù)圖書徽章
日期:2013-11-03 09:58:03辰龍
日期:2014-01-15 22:57:50午馬
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亞洲杯之伊朗
日期:2015-03-16 10:24:352015亞冠之城南
日期:2015-05-31 09:52:32
3 [報告]
發(fā)表于 2010-11-04 22:26 |只看該作者
謝謝分享
王齊在 linux  powerpc詳解 提到了物理cache 和虛擬cache一說.
是不是就是lz說的物理cache和邏輯cache?
也就是你說的不一致實際原因是.虛擬cache根本不從物理cache裝載數(shù)據(jù)?而是直接從物理內(nèi)存裝載數(shù)據(jù)?

論壇徽章:
0
4 [報告]
發(fā)表于 2010-11-04 22:37 |只看該作者
受教了!拔覀円詾槭菓(yīng)用層在讀cache,內(nèi)核讀內(nèi)存”,開始我也這樣以為的,本來還對snail同學(xué)存在一些疑問 ...
sep 發(fā)表于 2010-11-04 22:23


是的 這個想法誤導(dǎo)了我很長時間 。也是我sx了, 設(shè)nocache就是給vma設(shè)的 居然認(rèn)為會影響到內(nèi)核

論壇徽章:
0
5 [報告]
發(fā)表于 2010-11-04 22:52 |只看該作者
謝謝分享
王齊在 linux  powerpc詳解 提到了物理cache 和虛擬cache一說.
是不是就是lz說的物理cache和邏輯 ...
smalloc 發(fā)表于 2010-11-04 22:26



應(yīng)該就是那個邏輯和物理cache吧
虛擬,也就是邏輯cache不是虛擬的cache的意思 而是指在cache中用邏輯地址尋址  物理cache同樣   也就是離cpu之間隔一個mmu  而邏輯cache隔開cpu和mmu

論壇徽章:
7
丑牛
日期:2013-10-18 14:43:21技術(shù)圖書徽章
日期:2013-11-03 09:58:03辰龍
日期:2014-01-15 22:57:50午馬
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亞洲杯之伊朗
日期:2015-03-16 10:24:352015亞冠之城南
日期:2015-05-31 09:52:32
6 [報告]
發(fā)表于 2010-11-04 22:58 |只看該作者
回復(fù) 5# duanius


    恩.你看看這句是不是筆誤
應(yīng)用層讀取這片vma的時候是根據(jù)其指定的nocache屬性去讀內(nèi)存,而內(nèi)核訪問kmalloc的時候卻是讀內(nèi)存。
看了半天不理解

論壇徽章:
7
丑牛
日期:2013-10-18 14:43:21技術(shù)圖書徽章
日期:2013-11-03 09:58:03辰龍
日期:2014-01-15 22:57:50午馬
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亞洲杯之伊朗
日期:2015-03-16 10:24:352015亞冠之城南
日期:2015-05-31 09:52:32
7 [報告]
發(fā)表于 2010-11-04 23:02 |只看該作者
還有你現(xiàn)在出問題的板子上2種cache同時實現(xiàn)了嗎?同時作用?
我看你前面的描述感覺并不是同時實現(xiàn),好象說有的只實現(xiàn)物理 有的只實現(xiàn)邏輯
如果2個都是物理的或者邏輯的,那么一開始就不會出問題了,是這意思?

論壇徽章:
0
8 [報告]
發(fā)表于 2010-11-04 23:25 |只看該作者
回復(fù)  duanius


    恩.你看看這句是不是筆誤
應(yīng)用層讀取這片vma的時候是根據(jù)其指定的nocache屬性去讀 ...
smalloc 發(fā)表于 2010-11-04 22:58



    我們的需求是內(nèi)核讀  應(yīng)用層讀寫  ,我可能描述的不準(zhǔn)確吧,總之,應(yīng)用層訪問那塊vma是根據(jù)prog flag指定的來做的 比如不cache,不用寫緩沖之類
不過說讀也可以  因為arm只有讀分配cache,寫一般不分配,除非命中

論壇徽章:
0
9 [報告]
發(fā)表于 2010-11-04 23:27 |只看該作者
還有你現(xiàn)在出問題的板子上2種cache同時實現(xiàn)了嗎?同時作用?
我看你前面的描述感覺并不是同時實現(xiàn),好象說有的 ...
smalloc 發(fā)表于 2010-11-04 23:02



不不  邏輯cache和物理cache只是一種cache的組織形式 沒法同時存在
比如x86,arm11 用的是物理cache,而arm9用的是邏輯cache  只會有一種cache存在
對于arm11 只要同時cache或者同時nocache就可以了
而arm9,則必須只能同時nocache 原因就是我倒數(shù)第三段所說的別名的原因

論壇徽章:
7
丑牛
日期:2013-10-18 14:43:21技術(shù)圖書徽章
日期:2013-11-03 09:58:03辰龍
日期:2014-01-15 22:57:50午馬
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亞洲杯之伊朗
日期:2015-03-16 10:24:352015亞冠之城南
日期:2015-05-31 09:52:32
10 [報告]
發(fā)表于 2010-11-05 13:07 |只看該作者
回復(fù) 9# duanius


    我還有點疑問.可否告知下,前面說內(nèi)核中讀會出錯,大概錯了多少字節(jié)?
另一個就是這個內(nèi)核讀是什么發(fā)動的?在硬件中斷中?軟中斷中?內(nèi)核線程?還是本進(jìn)程的某個系統(tǒng)調(diào)用?
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP