開始」對映「之旅,在上面的講解中經常提及到「」對映「的概念,那到底什麼是對映?
乙個線性區可以和磁碟上的某個檔案關聯或者是某個檔案的一部分來關聯,這也就意味著核心把線性區的訪問頁內某個位元組的訪問轉換成對於檔案的中相應頁面的訪問,這種技術稱之為「記憶體對映」。
使用strace hello得到:
open("/usr/lib/locale/en_au.utf-8/lc_time", o_rdonly) = -1 enoent (no such file or directory)
open("/usr/lib/locale/en_au.utf8/lc_time", o_rdonly) = 3
fstat64(3, ) = 0
mmap2(null, 2454, prot_read, map_private, 3, 0) = 0xb80bf000
...
看linux核心很容易被struct address_space這個結構迷惑,它是代表某個位址空間嗎?實際上不是的,它是用於管理檔案(struct inode)對映到記憶體的頁面(struct page)的;與之對應,address_space_operations就是用來操作該檔案對映到記憶體的頁面,比如把記憶體中的修改寫回檔案、從檔案中讀入資料到頁面緩衝等。
task_struct--->
vm_area_struct--->
file--->
address_space--->
pages(該檔案實際指向的記憶體頁面)
當乙個程序需要建立乙個記憶體對映時,發出系統呼叫mmap,mmap系統呼叫返回的是第乙個單元位置的線性單元。mmap函式的主要操作主要是
初始化程序task_struct結構的vm_file欄位,具體就是:呼叫檔案的file結構初始化vm_file欄位,呼叫generic_file_mmap函式。
generic_file_mmap函式執行下面的步驟:
使用generic_file_vm_ops表位址初始化vm_area_struct結構的vm_ops欄位,其實在這個表中除了nopage和populate方法之外,其他的方法全是空的。nopage方法是由函式filemap_nopage來實現,populate是有filemap_populate來實現。
其實真個的「對映」的工作已經完成,在這個時候,hello檔案其實還沒有被載入到記憶體中,當試圖訪問沒有在記憶體中頁面時,發生缺頁中斷,然後呼叫上面再vm_ops欄位中的nopage方法,來將實際的檔案讀到記憶體中。
總結上面的過程的話:我將「對映」大致分為兩個過稱,首先僅僅是標記了在程序的某個虛擬記憶體位址上」對應「了磁碟上的某個檔案(在這個情景中是hello可執行程式),然後核心開始執行其他的事情,當這個程序試圖開始對剛才標記的頁面來定址時,產生缺頁異常,然後才是實際的記憶體(ram)的分配,並將對映的檔案載入到記憶體中,注意的是判斷乙個頁框是否是屬於某個程序需要看看對應的頁表是否設定了,在上面的缺頁處理中,在函式vm_ops->nopage()函式中呼叫do_no_page函式,在do_no_page函式中實際才設定頁表項。
深入淺出Spring IOC 4
前言 今天我們來學習實際開發中經常會使用到的ioc技術 通過ioc容器架構程式的分層。實現有兩種方式 基於xml配置檔案,基於註解。思路 我們把程式分為3層 controller層,service層,dao層。關係為controller層呼叫service層,service層呼叫dao層,並且ser...
深入淺出sizeof
int佔 位元組,short佔 位元組 1.0 回答下列問題 答案在文章末尾 1.sizeof char 2.sizeof a 3.sizeof a 4.strlen a 如果你答對了全部四道題,那麼你可以不用細看下面關於sizeof的論述。如果你答錯了部分題目,那麼就跟著我來一起 關於sizeof...
深入淺出ShellExecute
ipconfig c log.txt應如何處理?二樓的朋友,開啟拔號網路這樣 shellexecute null,open c windows rundll32.exe shell32.dll,control rundll c windows system telephon.cpl null,sw ...