成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

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

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

成都創(chuàng)新互聯(lián)主要從事網(wǎng)頁設(shè)計、PC網(wǎng)站建設(shè)(電腦版網(wǎng)站建設(shè))、wap網(wǎng)站建設(shè)(手機版網(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)核頁表”和“進程頁表”搞暈,不知道這到底是個啥東東,跟我們平時理解的頁表有什么關(guān)系。

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

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

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

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

用戶態(tài)

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

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

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

線性映射區(qū)

vmalloc區(qū)

其中,線性映射區(qū)即通過TASK_SIZE偏移進行映射的區(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)核頁表”,并沒有實時更新到“進程頁表中”,內(nèi)核在這里使用了“延遲更新”的策略,將“進程頁表”真正更新推遲到第一次訪問相關(guān)線性地址,發(fā)生page fault時,此時在page fault的處理流程中進行“進程頁表”的更新:

/*

     * 缺頁地址位于內(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ū),是則進行相應(yīng)的處理

            if (vmalloc_fault(address) >= 0)

                return;

/*

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

  * 主內(nèi)核頁表向當(dāng)前進程的內(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獲取,因為缺頁異常可能在上下文切換的過程中發(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)核頁表和進程頁表有什么關(guān)系”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

當(dāng)前名稱:Linux中內(nèi)核頁表和進程頁表有什么關(guān)系
網(wǎng)站網(wǎng)址:http://jinyejixie.com/article6/pdcdog.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃全網(wǎng)營銷推廣、虛擬主機、網(wǎng)站導(dǎo)航網(wǎng)站營銷、建站公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運營
合山市| 河西区| 苍梧县| 汝阳县| 通江县| 城口县| 玉环县| 牙克石市| 郧西县| 福建省| 怀仁县| 正宁县| 潼南县| 进贤县| 武隆县| 贡山| 德安县| 赫章县| 静海县| 胶州市| 江达县| 房产| 招远市| 鄄城县| 保山市| 贵阳市| 易门县| 陕西省| 白玉县| 曲松县| 广宁县| 卢氏县| 金山区| 三都| 彰化县| 台北县| 海口市| 沂水县| 博野县| 改则县| 十堰市|