真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Linux中內(nèi)核頁表和進(jìn)程頁表有什么關(guān)系

這篇文章給大家分享的是有關(guān)Linux中內(nèi)核頁表和進(jìn)程頁表有什么關(guān)系的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

成都創(chuàng)新互聯(lián)主要從事網(wǎng)頁設(shè)計、PC網(wǎng)站建設(shè)(電腦版網(wǎng)站建設(shè))、wap網(wǎng)站建設(shè)(手機(jī)版網(wǎng)站建設(shè))、響應(yīng)式網(wǎng)站建設(shè)、程序開發(fā)、網(wǎng)站優(yōu)化、微網(wǎng)站、重慶小程序開發(fā)公司等,憑借多年來在互聯(lián)網(wǎng)的打拼,我們在互聯(lián)網(wǎng)網(wǎng)站建設(shè)行業(yè)積累了豐富的成都網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計、網(wǎng)絡(luò)營銷經(jīng)驗,集策劃、開發(fā)、設(shè)計、營銷、管理等多方位專業(yè)化運作于一體。

初學(xué)內(nèi)核時,經(jīng)常被“內(nèi)核頁表”和“進(jìn)程頁表”搞暈,不知道這到底是個啥東東,跟我們平時理解的頁表有什么關(guān)系。

內(nèi)核頁表:即書上說的主內(nèi)核頁表,在內(nèi)核中其實就是一段內(nèi)存,存放在主內(nèi)核頁全局目錄init_mm.pgd(swapper_pg_dir)中,硬件并不直接使用。

進(jìn)程頁表:每個進(jìn)程自己的頁表,放在進(jìn)程自身的頁目錄task_struct.pgd中。

在保護(hù)模式下,從硬件角度看,其運行的基本對象為“進(jìn)程”(或線程),而尋址則依賴于“進(jìn)程頁表”,在進(jìn)程調(diào)度而進(jìn)行上下文切換時,會進(jìn)行頁表的切換:即將新進(jìn)程的pgd(頁目錄)加載到CR3寄存器中。從這個角度看,其實是完全沒有用到“內(nèi)核頁表”的,那么“內(nèi)核頁表”有什么用呢?跟“進(jìn)程頁表”有什么關(guān)系呢?

1、內(nèi)核頁表中的內(nèi)容為所有進(jìn)程共享,每個進(jìn)程都有自己的“進(jìn)程頁表”,“進(jìn)程頁表”中映射的線性地址包括兩部分:

用戶態(tài)

內(nèi)核態(tài)

其中,內(nèi)核態(tài)地址對應(yīng)的相關(guān)頁表項,對于所有進(jìn)程來說都是相同的(因為內(nèi)核空間對所有進(jìn)程來說都是共享的),而這部分頁表內(nèi)容其實就來源于“內(nèi)核頁表”,即每個進(jìn)程的“進(jìn)程頁表”中內(nèi)核態(tài)地址相關(guān)的頁表項都是“內(nèi)核頁表”的一個拷貝。

2、“內(nèi)核頁表”由內(nèi)核自己維護(hù)并更新,在vmalloc區(qū)發(fā)生page fault時,將“內(nèi)核頁表”同步到“進(jìn)程頁表”中。以32位系統(tǒng)為例,內(nèi)核頁表主要包含兩部分:

線性映射區(qū)

vmalloc區(qū)

其中,線性映射區(qū)即通過TASK_SIZE偏移進(jìn)行映射的區(qū)域,對32系統(tǒng)來說就是0-896M這部分區(qū)域,映射對應(yīng)的虛擬地址區(qū)域為TASK_SIZE-TASK_SIZE+896M。這部分區(qū)域在內(nèi)核初始化時就已經(jīng)完成映射,并創(chuàng)建好相應(yīng)的頁表,即這部分虛擬內(nèi)存區(qū)域不會發(fā)生page fault。

vmalloc區(qū),為896M-896M+128M,這部分區(qū)域用于映射高端內(nèi)存,有三種映射方式:vmalloc、固定、臨時,這里就不像述了。

以vmalloc為例(最常使用),這部分區(qū)域?qū)?yīng)的線性地址在內(nèi)核使用vmalloc分配內(nèi)存時,其實就已經(jīng)分配了相應(yīng)的物理內(nèi)存,并做了相應(yīng)的映射,建立了相應(yīng)的頁表項,但相關(guān)頁表項僅寫入了“內(nèi)核頁表”,并沒有實時更新到“進(jìn)程頁表中”,內(nèi)核在這里使用了“延遲更新”的策略,將“進(jìn)程頁表”真正更新推遲到第一次訪問相關(guān)線性地址,發(fā)生page fault時,此時在page fault的處理流程中進(jìn)行“進(jìn)程頁表”的更新:

/*

     * 缺頁地址位于內(nèi)核空間。并不代表異常發(fā)生于內(nèi)核空間,有可能是用戶

     * 態(tài)訪問了內(nèi)核空間的地址。

     */

    if (unlikely(fault_in_kernel_space(address))) {

        if (!(error_code & (PF_RSVD | PF_USER | PF_PROT))) {

            //檢查發(fā)生缺頁的地址是否在vmalloc區(qū),是則進(jìn)行相應(yīng)的處理

            if (vmalloc_fault(address) >= 0)

                return;

/*

  * 對于發(fā)生缺頁異常的指針位于vmalloc區(qū)情況的處理,主要是將

  * 主內(nèi)核頁表向當(dāng)前進(jìn)程的內(nèi)核頁表同步。

  */

static noinline __kprobes int vmalloc_fault(unsigned long address)

{

    unsigned long pgd_paddr;

    pmd_t *pmd_k;

    pte_t *pte_k;

 

    /* Make sure we are in vmalloc area: */

    /* 區(qū)域檢查 */

    if (!(address >= VMALLOC_START && address < VMALLOC_END))

        return -1;

 

    WARN_ON_ONCE(in_nmi());

 

    /*

     * Synchronize this task's top level page-table

     * with the 'reference' page table.

     *

     * Do _not_ use "current" here. We might be inside

     * an interrupt in the middle of a task switch..

     */

     /*獲取pgd(最頂級頁目錄)地址,直接從CR3寄存器中讀取。

     *不要通過current獲取,因為缺頁異??赡茉谏舷挛那袚Q的過程中發(fā)生,

     *此時如果通過current獲取,則可能會出問題*/

    pgd_paddr = read_cr3();

    //從主內(nèi)核頁表中,同步vmalloc區(qū)發(fā)生缺頁異常地址對應(yīng)的頁表

    pmd_k = vmalloc_sync_one(__va(pgd_paddr), address);

    if (!pmd_k)

        return -1;

    //如果同步后,相應(yīng)的PTE還不存在,則說明該地址有問題了

    pte_k = pte_offset_kernel(pmd_k, address);

    if (!pte_present(*pte_k))

        return -1;

 

    return 0;

}

感謝各位的閱讀!關(guān)于“Linux中內(nèi)核頁表和進(jìn)程頁表有什么關(guān)系”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!


名稱欄目:Linux中內(nèi)核頁表和進(jìn)程頁表有什么關(guān)系
文章源于:http://weahome.cn/article/pdcdog.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部