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

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 2211 | 回復(fù): 6
打印 上一主題 下一主題

[CPU及多核] flush_pfn_alias(), cache alias問題。 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2014-06-30 13:32 |只看該作者 |倒序?yàn)g覽
cache alias:
http://www.72891.cn/forum.php?mod=viewthread&tid=1972593

cache一般有幾種類型:
pipt
vivt
vipt noalias
vipt alias

實(shí)際上armv7 的dcache是vipt noalias的。icache是vipt alias的。
為什么會(huì)有cache alias問題呢,為什么amv7 dcache又沒有呢,這是armv7 硬件能夠自動(dòng)處理dcache alias問題。

一個(gè)cache由 cache line size * num set * way 組成。
一般是 32 * 256 * 4 = 32KB.
如果line size * num set = 8KB大于page size的話那么就有可能有alias問題。
假設(shè)0xf000 0000和0xf000 1000兩段地址都是映射同一個(gè)page的話,那么訪問0xf000 0000和0xf000 1000時(shí),他們?cè)赾ache中的num是不同的,就是有各自的cache line,但是映射的物理地址是一樣的。如果硬件不能自動(dòng)處理的話,軟件一定要處理好。
現(xiàn)在假設(shè)dcache是vipt alias的話,文件系統(tǒng)寫一個(gè)page cache時(shí),由于用戶態(tài)可能映射了該page,所以會(huì)調(diào)用flush_dcache_page()來解決這個(gè)alias問題。
最終會(huì)調(diào)用到flush_pfn_alias(),不過這個(gè)代碼看不懂,請(qǐng)高人幫忙分析下。


void flush_dcache_page(struct page *page)
{
        struct address_space *mapping;

        /*
         * The zero page is never written to, so never has any dirty
         * cache lines, and therefore never needs to be flushed.
         */
        if (page == ZERO_PAGE(0))
                return;

        mapping = page_mapping(page);

        if (!cache_ops_need_broadcast() &&
            mapping && !mapping_mapped(mapping))
                clear_bit(PG_dcache_clean, &page->flags);
        else {
                __flush_dcache_page(mapping, page);
                if (mapping && cache_is_vivt())
                        __flush_dcache_aliases(mapping, page);
                else if (mapping)
                        __flush_icache_all();
                set_bit(PG_dcache_clean, &page->flags);
        }
}


void __flush_dcache_page(struct address_space *mapping, struct page *page)
{
        /*
         * Writeback any data associated with the kernel mapping of this
         * page.  This ensures that data in the physical page is mutually
         * coherent with the kernels mapping.
         */
        if (!PageHighMem(page)) {
                __cpuc_flush_dcache_area(page_address(page), PAGE_SIZE);
        } else {
                void *addr = kmap_high_get(page);
                if (addr) {
                        __cpuc_flush_dcache_area(addr, PAGE_SIZE);
                        kunmap_high(page);
                } else if (cache_is_vipt()) {
                        /* unmapped pages might still be cached */
                        addr = kmap_atomic(page);
                        __cpuc_flush_dcache_area(addr, PAGE_SIZE);
                        kunmap_atomic(addr);
                }
        }

        /*
         * If this is a page cache page, and we have an aliasing VIPT cache,
         * we only need to do one flush - which would be at the relevant
         * userspace colour, which is congruent with page->index.
         */
        if (mapping && cache_is_vipt_aliasing())
                flush_pfn_alias(page_to_pfn(page),
                                page->index << PAGE_CACHE_SHIFT);
}



#define ALIAS_FLUSH_START        0xffff4000
//這個(gè)函數(shù)這個(gè)地址不知道什么意思?
static void flush_pfn_alias(unsigned long pfn, unsigned long vaddr)
{
        unsigned long to = ALIAS_FLUSH_START + (CACHE_COLOUR(vaddr) << PAGE_SHIFT);
        const int zero = 0;

        set_pte_ext(TOP_PTE(to), pfn_pte(pfn, PAGE_KERNEL), 0);
        flush_tlb_kernel_page(to);

        asm(        "mcrr        p15, 0, %1, %0, c14\n"
        "        mcr        p15, 0, %2, c7, c10, 4"
            :
            : "r" (to), "r" (to + PAGE_SIZE - L1_CACHE_BYTES), "r" (zero)
            : "cc");
}

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2014-07-01 09:17 |只看該作者
ding
ding
ding

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2014-07-02 09:12 |只看該作者
在ding一下看看。。。

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2014-07-02 18:58 |只看該作者
看起來沒人知道。還是論壇檔次太低了

論壇徽章:
4
戌狗
日期:2013-08-15 18:22:43技術(shù)圖書徽章
日期:2013-08-21 13:48:45巨蟹座
日期:2013-09-26 17:06:39處女座
日期:2013-12-25 11:26:10
5 [報(bào)告]
發(fā)表于 2014-07-03 13:22 |只看該作者
blake326 發(fā)表于 2014-07-02 18:58
看起來沒人知道。還是論壇檔次太低了


這個(gè)只能怪你不是女的

你要是個(gè)美女的話,早有人告訴你了。而且最好是去你家言傳身教啊

論壇徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16賽季CBA聯(lián)賽之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金雞報(bào)曉
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年紀(jì)念徽章
日期:2016-11-09 13:19:1015-16賽季CBA聯(lián)賽之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-12-03 06:20:002015七夕節(jié)徽章
日期:2015-08-21 11:06:17IT運(yùn)維版塊每日發(fā)帖之星
日期:2015-08-09 06:20:002015亞冠之吉達(dá)阿赫利
日期:2015-07-03 08:39:42
6 [報(bào)告]
發(fā)表于 2014-07-03 14:11 |只看該作者
本帖最后由 amarant 于 2014-07-03 14:33 編輯

不是沒人知道,很多人知道。
一來,人不愿看你的帖子,這么長,都是代碼
二來,大家都很忙,整天解bug,看看論壇也希望看看輕松愉快的


ALIAS_FLUSH_START 這個(gè)地址隨便填,因?yàn)橐运鳛殚_始地址往上刷cache size大小后,就可以全刷。而填一個(gè)偏移,就能刷指定行的cache

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2014-07-03 16:36 |只看該作者
回復(fù) 6# amarant

講的不錯(cuò)

其實(shí)flush_pfn_alias()就是一個(gè)關(guān)鍵

樓主你可以試者去兜起來

1. to 就是解決alias的新VA
2. 13,14bit 就是靠這兩個(gè)去把那同一個(gè)color放在一起  <-- CACHE_COLOUR(vaddr)
3. mcrr   p15,,,,c14 目的就是flush to這個(gè)VA
4. mcr p15, 0,c7, c10, 4 就是做 DSB


   
您需要登錄后才可以回帖 登錄 | 注冊(cè)

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

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP