歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux內核

邊學邊干Linux內核指導——虛擬存儲

    虛擬地址由操作系統維護,由MMU可以進行轉換。擴大了內存空間分頁管理,把內存分為頁和頁桢,大小一樣,一個在磁盤,一個在內存。頁表就像一個函數,輸入是頁號,輸出是頁桢號。

    頁表可以是多級頁表,可以用TLB(Translation Lookaside Buffer)緩存。速度和成本介於內存和寄存器

    頁表項:禁止緩存,訪問位,保護位,修改位,存在位——頁桢號

    頁面置換:最優算法,先進先出和最近最少使用 (Leaset Recently Used)

    Linux 虛擬內存的管理

    1.缺省頁面大小8K,每一個進程維護自己的一張頁表。所以,不同進程的虛擬地址可能一樣

    2.虛擬地址:0x2194 ——> 因為頁面大小0x2000,所以此地址在頁面1處。頁內偏移地址是0x194如果頁1映射為頁桢4,那麼它的物理地址是0x8000+0x194=0x8194

    3.換頁,paging ondemand

    4.交換 thrashing LRU

    5.Linux 總假定處理器支持三級頁表結構,PGD, PMD, PTE在Intel X86的微機上,linux表結構只有兩級 PGD, PTE (PMD 只有一個表項)

    6.每當啟動一個新線程,linux都會為它分配一個task_strUCt結構體,內含ldt(local descriptor table),tss(task state segment),mm等內存管理信息。其中,mm_struct結構體,包含了用戶進程中的存儲相關的信息

    7.vma程序執行時,並將執行映像調入進程虛擬地址空間中,共享庫也是。但是,實際上沒有進入到物理內存中。

    在mm_struct,包含一些指向vm_area_struct數據結構描述了虛擬內存的起始與結束位置,進程對此內存區域的權限以及一組內存操作。所以,操作系統對虛擬內存的管理,就是對這個數據結構的管理。而且,vma不是一個是一組,所以需要通過紅黑樹算法來進行管理,分配和取消

    8.頁面分配,用Buddy算法來進行,內存分配代碼在free_area數組維護的鏈表中尋找一個滿足要求,同時又盡可能小的空閒塊分割的同時,剩余的進行再分配

    9.asmlinkage do_page_fault(struct pt_regs *regs, unsigned long error_code);編譯器不要使用寄存器,而是使用堆棧來傳遞參數當MMS發現錯誤了,就調用這個函數。當缺頁時,CPU將會發生缺頁異常的地址拷貝到cr2控制寄存器中,然後進入缺頁異常的處理過程。

    如果發生異常時的系統狀態EFLAGS的中斷位置位,那麼在保存了cr2之後便可以允許終端發生,底層過程調用sti指令開中斷。

    handle_fault_mm()->handle_pte_fault()->do_no_page()->do_swap_page()

    Trackback: http://tb.blog.csdn.net/TrackBack.ASPx?PostId=1475737

更多內容請看內核技術專題,或




Copyright © Linux教程網 All Rights Reserved