發表日期: 2007-02-15 10:04
1. mips 與 x86 的 tlb 差別
其在於對 tlb 不命中時的處理上:
mips 會觸發tlb refill 異常,核心的 tlb_refill_handler 會以 pgd_current 為當前程序的 pgd 基址,索引獲得轉換失敗的虛址對應的 pte,並將其填入 tlb,完了cpu 把剛剛轉換失敗的虛位址再走一下 tlb 就ok了。
而 x86 在 tlb 不命中時,是由硬體 mmu 以 cr3 為當前程序的 pgd 基址,索引獲得 pfn 後,直接輸出 pa。同時 mmu 會填充 tlb 以加快下次轉換的速度。
另外轉換失敗的虛址,mips 使用 badvaddr 暫存器存放,x86 使用 cr2 存放。
2. 關於 mips32 頁表的大小問題
系統每 fork 乙個程序或者 clone 乙個程序沒有clone_vm標誌,核心都會呼叫 __get_free_pages 為新程序分配乙個頁給頁目錄表,前512項初始化都指向invalid_pte_table(空頁表,共有 page_size/sizeof(pte_t) 項),後面的都從 init 程序繼承。而後核心會根據新程序所需的儲存空間大小,為其分配頁表(大小為乙個頁),分配記憶體頁,設定相應的頁表項,設定對應的頁目錄表項。
可以看到,只要程序數目固定頁目錄表所需的空間是固定的,每個程序頁目錄表為乙個頁大小;而程序總頁表的大小要依賴於程序**、資料的大小。
乙個典型的 mips32 系統,頁大小為4kb,單使用者模式,僅有bash程序,其頁表大小為 48kb 左右(cat /proc/meminfo|grep pagetables);頁目錄的大小可由下式計算:
pgd_size = nr_process(exclude kernel thread) * page_size
3. mips tlb
mips tlb 的每項的主要資料有: | g | asid | vpn | pfn | ,其中 vpn 為 virtual page number, pfn 為 physical frame number。 項與項之間沒有次序,cpu 轉換時是直接匹配的。不能稱為 page table 。
而 page table 當年設計成 陣列結構,以陣列的下標作為虛頁號是經過考慮的,即使今天看來,我們依然能夠體會它的巧妙。
4. 核心在從組合語言跳到c語言中時,其棧的棧頂是在**設定的?
核心在進入 start_kernel 前,將 esp 指向了 init_thread_union + thread_size, init_thread_union 位於 .data.init_task 節,是個 union 結構,其大小為 thread_size,定義的比較巧妙:
union thread_union ;
5. 核心態執行緒、核心執行緒以及程序的核心棧問題
linux 下執行緒庫的實現,以常用的 linuxthread 或者 nptl 為例,這些庫建立執行緒是使用這些標誌 clone_vm | clone_fs | clone_files | clone_sighand 呼叫 clone() 來實現的,就是乙個輕量級程序。
在使用 fork, vfork, clone 這些函式建立程序或者輕量級程序時,核心都會呼叫 alloc_task_struct() 為其分配乙個 task_struct; 呼叫 alloc_thread_info() ,表面上看好像是分配 thread_info 結構,實際上:
#define alloc_thread_info(tsk) kmalloc(thread_size, gfp_kernel)
分配了 thread_size 的空間,底端為 thread_info ,指向它的指標儲存於 task_struct->thread_info 中。可以看到,task_struct->thread_info + thread_size 即為程序或者輕量級程序的核心棧棧底。
無論是使用 clone 生成輕量級程序,還是使用 kernel_thread 建立核心執行緒,他們都會進入 do_fork,進而呼叫 alloc_thread_info(),因此他們都有核心棧,大小為 thread_size,底端為 thread_info 。
因此linux 下,每個執行緒都會有乙個核心棧,這個當執行緒數目很大時是個問題。
儲存管理分析總結
儲存管理分析總結 1 定義 為了保證cpu執行指令時可正確訪問儲存單元,需將使用者程式中的邏輯位址轉換為執行時由機器直接定址的實體地址,此過程即為位址對映。a.靜態重定位 當使用者程式被裝入記憶體時,一次性實現邏輯位址到實體地址的轉換,以後不再轉換 一般在裝入記憶體時由軟體完成 b.動態重定位 在程...
linux儲存管理 下
linux儲存管理 上 檔案系統的型別 windows fat16 fat32 ntfs linux ext4 ext3 xfs 索引 目錄,字典的前十幾頁 ext4檔案系統 inode 記錄檔案的屬性 檔案的元資料metadata 乙個檔案占用乙個inode,同時記錄此檔案所在的block num...
Linux儲存管理之管理磁碟
1 ll dev sd 檢視dev下面的所有磁碟 sd是sata介面 hd是ide介面 2 lsblk name maj min rm size ro type mountpoint 裝置名稱 裝置型別 序號 磁碟大小 是否唯讀 磁碟或分割槽 掛載點 1 進入分割槽 fdisk dev 磁碟名 先按...