今天聊聊進(jìn)程地址空間這點(diǎn)小事。
說(shuō)到進(jìn)程的地址空間,大家可能都知道這樣一張圖:
這張圖就是Linux程序運(yùn)行起來(lái)后所謂的進(jìn)程地址空間,這里包括我們熟悉的代碼區(qū)、數(shù)據(jù)區(qū)、以及堆區(qū)和棧區(qū),今天我們不講解這些區(qū)域,而是重點(diǎn)關(guān)注這個(gè)地址空間中最上面的一塊區(qū)域——內(nèi)核,這里的問(wèn)題是:
為什么進(jìn)程地址空間中要包括操作系統(tǒng)(內(nèi)核)呢?要想知道這個(gè)問(wèn)題的答案,你需要知道操作系統(tǒng)到底是如何管理內(nèi)存的。
現(xiàn)代操作系統(tǒng)大都利用虛擬內(nèi)存系統(tǒng)來(lái)管理內(nèi)存,我們看的上圖,這一段連續(xù)的內(nèi)存區(qū)域其實(shí)只是一個(gè)假象,物理內(nèi)存中并不一定真的存在這樣一個(gè)內(nèi)存布局,利用虛擬內(nèi)存系統(tǒng)將一些非連續(xù)的內(nèi)存塊(頁(yè))映射到一段連續(xù)的地址空間——也就是我們看到的上圖,這就是所謂的虛擬內(nèi)存。
我們看到的地址都是虛擬地址,物理內(nèi)存與虛擬內(nèi)存的映射關(guān)系維護(hù)在頁(yè)表中,當(dāng)CPU執(zhí)行機(jī)器指令時(shí)需要根據(jù)頁(yè)表將虛擬地址轉(zhuǎn)為物理內(nèi)存地址,但這個(gè)過(guò)程對(duì)程序員來(lái)說(shuō)是透明的,我們看不到這樣的一個(gè)轉(zhuǎn)換過(guò)程。
那么為什么內(nèi)核要將自己映射到進(jìn)程的地址空間呢? 我們知道CPU在執(zhí)行指令時(shí)是有權(quán)限狀態(tài)的,x86處理器有4個(gè)權(quán)限狀態(tài),操作系統(tǒng)一般使用其中兩個(gè),這就是所謂的用戶態(tài)與內(nèi)核態(tài),我們寫(xiě)的程序運(yùn)行在用戶態(tài),操作系統(tǒng)運(yùn)行在內(nèi)核態(tài)。
在一些場(chǎng)景下,像我們讀寫(xiě)文件、收發(fā)網(wǎng)絡(luò)數(shù)據(jù)等都需要操作系統(tǒng)的幫助,也就是調(diào)用操作系統(tǒng)提供的服務(wù),這個(gè)過(guò)程就是所謂的系統(tǒng)調(diào)用,關(guān)于系統(tǒng)調(diào)用我們?cè)谥暗奈恼轮幸呀?jīng)多次講解過(guò)了,在系統(tǒng)調(diào)用這個(gè)場(chǎng)景下就涉及從用戶態(tài)切換到內(nèi)核態(tài)。 此外還有其它場(chǎng)景涉及用戶態(tài)與內(nèi)核態(tài)的切換,像中斷處理以及異常處理等。
既然你知道我們的程序運(yùn)行時(shí)需要頻繁的進(jìn)行用戶態(tài)與內(nèi)核態(tài)切換那么剩下的就簡(jiǎn)單了。
如果內(nèi)核與用戶態(tài)程序位于不同的地址空間,那么當(dāng)用戶態(tài)與內(nèi)核態(tài)進(jìn)行切換時(shí)就勢(shì)必涉及頁(yè)表的切換——從用戶態(tài)進(jìn)入內(nèi)核態(tài)需要將用戶進(jìn)程的頁(yè)表切換為內(nèi)核頁(yè)表,而如果從內(nèi)核態(tài)退出回到用戶態(tài)就涉及將內(nèi)核頁(yè)表切換為用戶進(jìn)程頁(yè)表,切換頁(yè)表對(duì)于計(jì)算機(jī)系統(tǒng)來(lái)說(shuō)算是一個(gè)不小的開(kāi)銷。
而如果內(nèi)核與用戶態(tài)程序位于同一個(gè)地址空間中,那么上述頁(yè)表切換的開(kāi)銷就可以避免了,這就是為什么內(nèi)核要將自己映射到進(jìn)程地址空間的重要原因。 好啦,這篇就到這里,希望對(duì)大家理解進(jìn)程地址空間有所幫助。
審核編輯:劉清
-
處理器
+關(guān)注
關(guān)注
68文章
20069瀏覽量
242742 -
操作系統(tǒng)
+關(guān)注
關(guān)注
37文章
7258瀏覽量
127862 -
Linux系統(tǒng)
+關(guān)注
關(guān)注
4文章
608瀏覽量
29382
原文標(biāo)題:為什么進(jìn)程地址空間中包括操作系統(tǒng)?
文章出處:【微信號(hào):良許Linux,微信公眾號(hào):良許Linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
linux操作系統(tǒng)下的進(jìn)程通信設(shè)計(jì)
什么是QNX操作系統(tǒng)
開(kāi)發(fā)必讀,操作系統(tǒng)的進(jìn)程和線程
開(kāi)發(fā)必讀,操作系統(tǒng)的進(jìn)程和線程
操作系統(tǒng)為什么分內(nèi)核態(tài)和用戶態(tài)?這兩者如何切換?
為何將Linux操作系統(tǒng)劃分為用戶和內(nèi)核
有關(guān)Linux系統(tǒng)的PBC (進(jìn)程控制塊)基礎(chǔ)知識(shí)介紹
什么是操作系統(tǒng)內(nèi)核
為什么要選擇微內(nèi)核操作系統(tǒng)?
深入淺出Linux的進(jìn)程地址空間
高性能混合微內(nèi)核操作系統(tǒng)RT-Thread Smart達(dá)到業(yè)界領(lǐng)先的技術(shù)水準(zhǔn)

淺談鴻蒙操作系統(tǒng)的微內(nèi)核
Linux系統(tǒng)為什么需要區(qū)分內(nèi)核空間與用戶空間?

以32位系統(tǒng)為例介紹內(nèi)核空間和用戶空間

Linux系統(tǒng)為什么需要引入虛擬地址

評(píng)論