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

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

Chinaunix

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

[內(nèi)存管理] vmalloc時(shí)會(huì)不會(huì)page fault? [復(fù)制鏈接]

論壇徽章:
1
2015年辭舊歲徽章
日期:2015-03-03 16:54:15
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2016-11-24 15:24 |只看該作者 |倒序?yàn)g覽
本帖最后由 mrpre 于 2016-12-02 10:39 編輯

最近在學(xué)習(xí)內(nèi)存相關(guān)的知識(shí),疑問頗多。

教科書上對(duì)虛擬地址到物理地址的映射說是通過MMU進(jìn)行轉(zhuǎn)換的,為了提高性能同時(shí)也使用了TLB。
     疑問來了
     (1)是不是CPU所有要訪問的地址都需要經(jīng)過MMU轉(zhuǎn)換?之所以這么問,是因?yàn)槲以倏碝IPS體系結(jié)構(gòu)時(shí),說到MIPS將地址空間分為好幾個(gè)部分,
            一部分需要映射,一部分直接減去page_offset得到物理地址。MMU會(huì)判斷當(dāng)前處理的地址屬于不同部分進(jìn)行不同的操作嗎?既然所有地址都會(huì)進(jìn)行
            轉(zhuǎn)換,那么內(nèi)核中virt_to_phys宏豈不是沒必要(驅(qū)動(dòng)程序需要?我沒接觸過),說明時(shí)候需要。
      

不是很理解進(jìn)程的內(nèi)核頁表共享原理;
系統(tǒng)啟動(dòng)時(shí),init_mm 中的頁目錄初始化時(shí)都是invalid_pmd_table,
即 pgd[0] = pgd[1] = ..... = invalid_pmd_table。

如果進(jìn)程A創(chuàng)建了地址:0xc0000000,那么pgd[0]由于是invalid_pmd_table,進(jìn)程A肯定會(huì)創(chuàng)建pud/pmd;
此時(shí)進(jìn)程B fork了,拷貝init_mm的頁目錄, 進(jìn)程B自然能訪問進(jìn)程A創(chuàng)建的0xc0000000。
但是進(jìn)程B此時(shí)創(chuàng)建了地址0xcffff000,顯然會(huì)在 pgd[x](x>0)處創(chuàng)建自己的pud/pmd,然后進(jìn)程B能夠訪問自己的0xcffff000。
但是由于進(jìn)程A的pgd[x]處是invalid_pmd_table(因?yàn)檫M(jìn)程A拷貝的是原始的init_mm),他會(huì)創(chuàng)建自己的pud/pmd,兩者就不能共享0xcffff000,我的推算不對(duì)嗎?即一個(gè)進(jìn)程在內(nèi)核態(tài)vmalloc時(shí)獲取到的內(nèi)存,另一個(gè)進(jìn)程在其內(nèi)核態(tài)無法讀?
不說兩個(gè)進(jìn)程的例子了,說簡單點(diǎn),一個(gè)進(jìn)程創(chuàng)建了,然后執(zhí)行系統(tǒng)調(diào)用,在內(nèi)核態(tài)調(diào)用vmalloc,vmalloc函數(shù)只是更新了init_mm,并未更新進(jìn)程mm->pgd。請(qǐng)問是如何也目錄是何時(shí)被更新的?


================================================



=
找到了,build_tlb_refill_handler函數(shù)中,根據(jù)不同類型cpu設(shè)置tlb/mmu查找的方式。
build_get_pgd_vmalloc64
類型是default的cpu且是mips64 ,vmalloc使用的就是swapper_pg_dir當(dāng)做頁目錄,不是使用進(jìn)程的頁目錄。

結(jié)貼。

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2016-11-25 10:38 |只看該作者
嘗試回一下, mips不太清楚,以arm為例子:
1:是,virt_to_phys是用于內(nèi)核地址空間通過物理地址快速計(jì)算虛擬地址,之所以可以這樣計(jì)算是因?yàn)樵趦?nèi)核地址空間物理地址和虛擬地址之間就是按照這種方式map的,其相關(guān)頁目錄表和頁表也是是按這種方式在操作系統(tǒng)啟動(dòng)時(shí)就設(shè)置好的。
2:vmalloc執(zhí)行中已經(jīng)分配好page,并設(shè)置好了相關(guān)的頁目錄表和頁表,因此不會(huì)發(fā)生page fault。內(nèi)核中使用vmalloc分配的內(nèi)存不能使用virt_to_phys或phys_to_virt進(jìn)行虛實(shí)地址轉(zhuǎn)化。

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2016-11-25 10:49 |只看該作者
另外,就32位arm而言,內(nèi)核地址空間也分為好幾部分,其中從0xc0000000起大概將近890M是使用上述1的方式直接map的,剩余部分地址空間用于vmalloc, pkmap, fixmap等。

論壇徽章:
20
程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-08-17 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-07-16 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-07-18 06:20:00每日論壇發(fā)貼之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16賽季CBA聯(lián)賽之江蘇
日期:2017-06-26 11:05:5615-16賽季CBA聯(lián)賽之上海
日期:2017-07-21 18:12:5015-16賽季CBA聯(lián)賽之青島
日期:2017-09-04 17:32:0515-16賽季CBA聯(lián)賽之吉林
日期:2018-03-26 10:02:16程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-07-15 06:20:0015-16賽季CBA聯(lián)賽之江蘇
日期:2016-07-07 18:37:512015亞冠之薩濟(jì)拖拉機(jī)
日期:2015-08-17 12:21:08
4 [報(bào)告]
發(fā)表于 2016-11-25 12:05 |只看該作者
vmalloc調(diào)用的時(shí)候,只是初始化了init_mm的頁表,而不是當(dāng)前進(jìn)程(或者后續(xù)使用進(jìn)程)的頁表。

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2016-11-25 13:32 |只看該作者
init_mm內(nèi)核空間頁表和其他所有進(jìn)程在內(nèi)核空間的頁表是相同的

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2016-11-25 13:38 |只看該作者
看pgd_alloc函數(shù)

論壇徽章:
1
2015年辭舊歲徽章
日期:2015-03-03 16:54:15
7 [報(bào)告]
發(fā)表于 2016-11-25 15:00 |只看該作者
回復(fù) 2# futex

謝謝回復(fù);
“vmalloc執(zhí)行中已經(jīng)分配好page,并設(shè)置好了相關(guān)的頁目錄表和頁表,因此不會(huì)發(fā)生page fault”
我看代碼,確實(shí)vmalloc時(shí)設(shè)置好了頁目錄,我的問題是,因?yàn)樗械刂范夹枰?jīng)過MMU,MMU是硬件吧,他會(huì)去讀 init_mm ?
那不同的進(jìn)程都有不同的頁目錄,MMU怎么區(qū)分要去讀哪個(gè)頁目錄,難道是判斷當(dāng)前處于用戶態(tài),則讀當(dāng)前進(jìn)程的頁目錄,處于內(nèi)核態(tài)則讀init_mm ?






論壇徽章:
1
2015年辭舊歲徽章
日期:2015-03-03 16:54:15
8 [報(bào)告]
發(fā)表于 2016-11-25 15:16 |只看該作者
回復(fù) 5# futex

還有一個(gè)疑問;正如您所說,所有的基礎(chǔ)頁表的后半部分拷貝自init_mm
mips:
                init = pgd_offset(&init_mm, 0UL);
                pgd_init((unsigned long)ret);
                memcpy(ret + USER_PTRS_PER_PGD, init + USER_PTRS_PER_PGD,
                       (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t));


x86:
                clone_pgd_range(pgd + KERNEL_PGD_BOUNDARY,
                                swapper_pg_dir + KERNEL_PGD_BOUNDARY,
                                KERNEL_PGD_PTRS);


有個(gè)問題,一個(gè)進(jìn)程A新建時(shí),自己的頁目錄拷貝自當(dāng)前的init_mm,那后續(xù)如果init_mm被修改(比如進(jìn)程B通過系統(tǒng)調(diào)用在內(nèi)核態(tài)使用了vmallc新開辟了某塊內(nèi)存,更新了init_mm頁目錄,并且寫了數(shù)據(jù)),由于進(jìn)程A的內(nèi)核部分頁目錄并未被修改,豈不是無法完成內(nèi)核態(tài)的內(nèi)存共享?

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2016-11-25 15:20 |只看該作者
本帖最后由 futex 于 2016-11-25 15:22 編輯

進(jìn)程切換時(shí)如果需要切換內(nèi)存則將新進(jìn)程mm中頁目錄地址放在一個(gè)特定的寄存器中, 因此該寄存器內(nèi)容總是保存當(dāng)前進(jìn)程mm的頁目錄表地址, 這樣mmu就能根據(jù)該地址利用頁表完成虛擬地址到物理地址的轉(zhuǎn)換。

論壇徽章:
0
10 [報(bào)告]
發(fā)表于 2016-11-25 15:37 |只看該作者
vmallc不會(huì)更新init_mm內(nèi)核地址空間頁目錄表,只會(huì)更新內(nèi)核地址空間頁表,而內(nèi)核地址空間頁表是所有進(jìn)程mm共享的(pgd_alloc中只復(fù)制了頁目錄表而未復(fù)制頁表),因此不存在你說的問題。
您需要登錄后才可以回帖 登錄 | 注冊(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