用libreoffice畫表真時有點蛋疼,效率很低.. 深入理解電腦系統->虛擬儲存空間 核心虛擬儲存空間
作業系統處理進程時分為使用者態和核心態.虛擬儲存空間中,進程虛擬儲存空間佔大部分空間,核心虛擬儲存空間佔小部分空間. 與進程相關的資料結構
每個進程都不相同.所以並不是每個進程的核心虛擬儲存空間都相同,裡邊有各個進程不同的部分.
這塊地區相關聯:
1.task_struct
(1) state:進程狀態
(2)thread_info:進程資訊和核心堆棧
(3)run_list,array:用於進程調度
(4)mm:進程地址空間
(5)pid:進程id
(6)group_info:群組管理
(7)user:使用者管理
(8)fs:工作目錄,根目錄
(9)signal:訊號資訊
(10)sighand:訊號處理
(11)程式計數器
等等….
其中最重要的時mm,就是mm_struct
2.mm_struct
(1)pgd:指向第一級頁表基址
(2)mmap:指向一個vm_area_struct(地區結構)的鏈表,每個vm_area_struct都描述了當前虛擬位址空間的一個地區(area).
等等…
重點mmap.
3.vm_area_struct
(1)vm_end
(2)vm_start
(3)vm_prot:讀寫許可許可權
(4)vm_flags:是私人還是共用的
(5)vm_next:指向鏈表中的下一個地區結構 實體儲存體器與核心代碼和資料
相關知識點:何時從使用者態轉變成核心態. 進程虛擬儲存空間 共用庫的儲存空間映射地區
linux通過將一個虛擬儲存空間地區與一個磁碟上的對象關聯起來,以初始化這個虛擬儲存空間的內容,這個過程稱為儲存空間映射.
如果系統的可執行檔依賴共用庫,則被映射到該地區.譬如printf函數等等… 未初始化資料.bss,已初始化資料.data和程式檔案.text
這三部分分別稱為BSS段,資料區段和程式碼片段.
BSS段:未初始化或者初值=0的全域變數和靜態變數.
資料區段:已初始化且初值!=0的全域變數和靜態變數.
程式碼片段:可執行代碼,字串字面值,唯讀變數.
注:局部變數在棧中. 棧和堆 棧
1.由編譯器自動分配釋放.
2.本函數中棧的用途
把局部變數壓入棧儲存
3.調用函數時棧的用途
(1)儲存被調用函數的參數值
(2)返回地址入棧
(3)被調用函數使用的非靜態局部變數以及編譯器自動產生的其他臨時變數.
(4)儲存上下文,儲存函數調用前後需要保持不變的寄存器.
4.函數被調用時,資料入棧順序
(1)被調用的函數的參數(C編譯器中,參數從右至左入棧)
(2)返回地址
(3)舊的%ebp地址,用於還原.
(4)儲存的寄存器
(5)新函數的局部變數和其他資料.
注意:靜態變數不入棧.本次函數結束後,還原現場.具體看<<深入理解電腦系統>> 第3.7節.
5.跟資料結構的棧特性相同,後進先出.見圖可知,入棧時,向低地址擴充. 堆
1.一般由程式員分配釋放.
相關知識點還包括記憶體回收.
2.程式員使用new,delete(動態分配指令)時,就會在進程的堆地區產生資料.
3.堆的知識點,主要時動態儲存裝置器分配時的知識點,包括
(1)分配器類型:隱式分配器和顯式分配器.
(2)對齊問題
(3)片段問題
(4)實現分配器:如何記錄空閑塊,如何放置,如何分割,如何合并
(5)隱式空閑鏈表
(6)顯式空閑鏈表
(7)分離空閑鏈表
(8)記憶體回收
以上內容全部來源<<深入理解電腦系統>>.這裡只是做個小小的總結,也可以說是小小的筆記.詳細內容請閱讀書本.