亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区
Chinaunix
標(biāo)題:
vmalloc時(shí)會(huì)不會(huì)page fault?
[打印本頁(yè)]
作者:
mrpre
時(shí)間:
2016-11-24 15:24
標(biāo)題:
vmalloc時(shí)會(huì)不會(huì)page fault?
本帖最后由 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)核頁(yè)表共享原理;
系統(tǒng)啟動(dòng)時(shí),init_mm 中的頁(yè)目錄初始化時(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的頁(yè)目錄, 進(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)程的例子了,說簡(jiǎ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)做頁(yè)目錄,不是使用進(jìn)程的頁(yè)目錄。
結(jié)貼。
作者:
futex
時(shí)間:
2016-11-25 10:38
嘗試回一下, mips不太清楚,以arm為例子:
1:是,virt_to_phys是用于內(nèi)核地址空間通過物理地址快速計(jì)算虛擬地址,之所以可以這樣計(jì)算是因?yàn)樵趦?nèi)核地址空間物理地址和虛擬地址之間就是按照這種方式map的,其相關(guān)頁(yè)目錄表和頁(yè)表也是是按這種方式在操作系統(tǒng)啟動(dòng)時(shí)就設(shè)置好的。
2:vmalloc執(zhí)行中已經(jīng)分配好page,并設(shè)置好了相關(guān)的頁(yè)目錄表和頁(yè)表,因此不會(huì)發(fā)生page fault。內(nèi)核中使用vmalloc分配的內(nèi)存不能使用virt_to_phys或phys_to_virt進(jìn)行虛實(shí)地址轉(zhuǎn)化。
作者:
futex
時(shí)間:
2016-11-25 10:49
另外,就32位arm而言,內(nèi)核地址空間也分為好幾部分,其中從0xc0000000起大概將近890M是使用上述1的方式直接map的,剩余部分地址空間用于vmalloc, pkmap, fixmap等。
作者:
nswcfd
時(shí)間:
2016-11-25 12:05
vmalloc調(diào)用的時(shí)候,只是初始化了init_mm的頁(yè)表,而不是當(dāng)前進(jìn)程(或者后續(xù)使用進(jìn)程)的頁(yè)表。
作者:
futex
時(shí)間:
2016-11-25 13:32
init_mm內(nèi)核空間頁(yè)表和其他所有進(jìn)程在內(nèi)核空間的頁(yè)表是相同的
作者:
futex
時(shí)間:
2016-11-25 13:38
看pgd_alloc函數(shù)
作者:
mrpre
時(shí)間:
2016-11-25 15:00
回復(fù)
2#
futex
謝謝回復(fù);
“vmalloc執(zhí)行中已經(jīng)分配好page,并設(shè)置好了相關(guān)的頁(yè)目錄表和頁(yè)表,因此不會(huì)發(fā)生page fault”
我看代碼,確實(shí)vmalloc時(shí)設(shè)置好了頁(yè)目錄,我的問題是,因?yàn)樗械刂范夹枰?jīng)過MMU,MMU是硬件吧,他會(huì)去讀 init_mm ?
那不同的進(jìn)程都有不同的頁(yè)目錄,MMU怎么區(qū)分要去讀哪個(gè)頁(yè)目錄,難道是判斷當(dāng)前處于用戶態(tài),則讀當(dāng)前進(jìn)程的頁(yè)目錄,處于內(nèi)核態(tài)則讀init_mm ?
作者:
mrpre
時(shí)間:
2016-11-25 15:16
回復(fù)
5#
futex
還有一個(gè)疑問;正如您所說,所有的基礎(chǔ)頁(yè)表的后半部分拷貝自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í),自己的頁(yè)目錄拷貝自當(dāng)前的init_mm,那后續(xù)如果init_mm被修改(比如進(jìn)程B通過系統(tǒng)調(diào)用在內(nèi)核態(tài)使用了vmallc新開辟了某塊內(nèi)存,更新了init_mm頁(yè)目錄,并且寫了數(shù)據(jù)),由于進(jìn)程A的內(nèi)核部分頁(yè)目錄并未被修改,豈不是無法完成內(nèi)核態(tài)的內(nèi)存共享?
作者:
futex
時(shí)間:
2016-11-25 15:20
本帖最后由 futex 于 2016-11-25 15:22 編輯
進(jìn)程切換時(shí)如果需要切換內(nèi)存則將新進(jìn)程mm中頁(yè)目錄地址放在一個(gè)特定的寄存器中, 因此該寄存器內(nèi)容總是保存當(dāng)前進(jìn)程mm的頁(yè)目錄表地址, 這樣mmu就能根據(jù)該地址利用頁(yè)表完成虛擬地址到物理地址的轉(zhuǎn)換。
作者:
futex
時(shí)間:
2016-11-25 15:37
vmallc不會(huì)更新init_mm內(nèi)核地址空間頁(yè)目錄表,只會(huì)更新內(nèi)核地址空間頁(yè)表,而內(nèi)核地址空間頁(yè)表是所有進(jìn)程mm共享的(pgd_alloc中只復(fù)制了頁(yè)目錄表而未復(fù)制頁(yè)表),因此不存在你說的問題。
作者:
futex
時(shí)間:
2016-11-25 20:19
抱歉,好久沒弄這個(gè)了,上面回答有錯(cuò)誤,更正為vmalloc會(huì)發(fā)生page fault,但由于其目錄表項(xiàng)和頁(yè)表項(xiàng)已經(jīng)分配,fault中只需將init mm中的頁(yè)目錄項(xiàng)拷貝到當(dāng)前進(jìn)程的對(duì)應(yīng)的頁(yè)目錄項(xiàng)中。
作者:
futex
時(shí)間:
2016-11-26 10:49
arm版本的fault處理在do_translation_fault函數(shù)中。
作者:
sditmaner
時(shí)間:
2016-11-26 12:50
回復(fù) 2# futex
作者:
mordorwww
時(shí)間:
2016-11-28 09:30
futex 發(fā)表于 2016-11-26 10:49
arm版本的fault處理在do_translation_fault函數(shù)中。
arm的內(nèi)核頁(yè)表和用戶態(tài)頁(yè)表是分開的
TBBR0和TBBR1, 所以arm應(yīng)該不需要vmalloc pagefault
作者:
mrpre
時(shí)間:
2016-11-28 09:52
回復(fù)
10#
futex
不是很理解;系統(tǒng)啟動(dòng)時(shí),init_mm 中的頁(yè)目錄初始化時(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的頁(yè)目錄, 進(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ì)嗎?
歡迎光臨 Chinaunix (http://72891.cn/)
Powered by Discuz! X3.2