0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

為什么進(jìn)程地址空間中要包括操作系統(tǒng)(內(nèi)核)呢?

dyquk4xk2p3d ? 來源:碼農(nóng)的荒島求生 ? 2023-04-18 09:09 ? 次閱讀

今天聊聊進(jìn)程地址空間這點(diǎn)小事。

說到進(jìn)程的地址空間,大家可能都知道這樣一張圖:

2b7bd68c-dd79-11ed-bfe3-dac502259ad0.png

這張圖就是Linux程序運(yùn)行起來后所謂的進(jìn)程地址空間,這里包括我們熟悉的代碼區(qū)、數(shù)據(jù)區(qū)、以及堆區(qū)和棧區(qū),今天我們不講解這些區(qū)域,而是重點(diǎn)關(guān)注這個(gè)地址空間中最上面的一塊區(qū)域——內(nèi)核,這里的問題是:

為什么進(jìn)程地址空間中要包括操作系統(tǒng)(內(nèi)核)呢?要想知道這個(gè)問題的答案,你需要知道操作系統(tǒng)到底是如何管理內(nèi)存的。

現(xiàn)代操作系統(tǒng)大都利用虛擬內(nèi)存系統(tǒng)來管理內(nèi)存,我們看的上圖,這一段連續(xù)的內(nèi)存區(qū)域其實(shí)只是一個(gè)假象,物理內(nèi)存中并不一定真的存在這樣一個(gè)內(nèi)存布局,利用虛擬內(nèi)存系統(tǒng)將一些非連續(xù)的內(nèi)存塊(頁)映射到一段連續(xù)的地址空間——也就是我們看到的上圖,這就是所謂的虛擬內(nèi)存。

我們看到的地址都是虛擬地址,物理內(nèi)存與虛擬內(nèi)存的映射關(guān)系維護(hù)在頁表中,當(dāng)CPU執(zhí)行機(jī)器指令時(shí)需要根據(jù)頁表將虛擬地址轉(zhuǎn)為物理內(nèi)存地址,但這個(gè)過程對(duì)程序員來說是透明的,我們看不到這樣的一個(gè)轉(zhuǎn)換過程。

那么為什么內(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),我們寫的程序運(yùn)行在用戶態(tài),操作系統(tǒng)運(yùn)行在內(nèi)核態(tài)。

2b875dd6-dd79-11ed-bfe3-dac502259ad0.png

在一些場(chǎng)景下,像我們讀寫文件、收發(fā)網(wǎng)絡(luò)數(shù)據(jù)等都需要操作系統(tǒng)的幫助,也就是調(diào)用操作系統(tǒng)提供的服務(wù),這個(gè)過程就是所謂的系統(tǒng)調(diào)用,關(guān)于系統(tǒng)調(diào)用我們?cè)谥暗奈恼轮幸呀?jīng)多次講解過了,在系統(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)單了。

2b93e6f0-dd79-11ed-bfe3-dac502259ad0.png

如果內(nèi)核與用戶態(tài)程序位于不同的地址空間,那么當(dāng)用戶態(tài)與內(nèi)核態(tài)進(jìn)行切換時(shí)就勢(shì)必涉及頁表的切換——從用戶態(tài)進(jìn)入內(nèi)核態(tài)需要將用戶進(jìn)程的頁表切換為內(nèi)核頁表,而如果從內(nèi)核態(tài)退出回到用戶態(tài)就涉及將內(nèi)核頁表切換為用戶進(jìn)程頁表,切換頁表對(duì)于計(jì)算機(jī)系統(tǒng)來說算是一個(gè)不小的開銷。

而如果內(nèi)核與用戶態(tài)程序位于同一個(gè)地址空間中,那么上述頁表切換的開銷就可以避免了,這就是為什么內(nèi)核要將自己映射到進(jìn)程地址空間的重要原因。 好啦,這篇就到這里,希望對(duì)大家理解進(jìn)程地址空間有所幫助。






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 處理器
    +關(guān)注

    關(guān)注

    68

    文章

    19387

    瀏覽量

    230518
  • 操作系統(tǒng)
    +關(guān)注

    關(guān)注

    37

    文章

    6862

    瀏覽量

    123513
  • Linux系統(tǒng)
    +關(guān)注

    關(guān)注

    4

    文章

    595

    瀏覽量

    27451

原文標(biāo)題:為什么進(jìn)程地址空間中包括操作系統(tǒng)?

文章出處:【微信號(hào):良許Linux,微信公眾號(hào):良許Linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    linux操作系統(tǒng)下的進(jìn)程通信設(shè)計(jì)

    信號(hào)量值大于0,進(jìn)程被喚醒,轉(zhuǎn)入步驟(1)。(4) 當(dāng)進(jìn)程不再使用一個(gè)信號(hào)量控制的資源時(shí),信號(hào)量值加1。如果此時(shí)有進(jìn)程正在睡眠等待此信號(hào)量,則喚醒此進(jìn)程。維護(hù)信號(hào)量狀態(tài)的是Linux
    發(fā)表于 04-16 09:17

    什么是QNX操作系統(tǒng)

    網(wǎng)絡(luò)通信和中斷處理,其進(jìn)程在獨(dú)立的地址空間中運(yùn)行。所有其他操作系統(tǒng)服務(wù)都實(shí)現(xiàn)為協(xié)作的用戶進(jìn)程,因此QNX
    發(fā)表于 06-07 14:16

    開發(fā)必讀,操作系統(tǒng)進(jìn)程和線程

    模式中用戶的線程對(duì)操作系統(tǒng)不可見。優(yōu)點(diǎn):用戶線程開幾個(gè)都沒問題,且上下文切換發(fā)生用戶空間,切換的效率較高;缺點(diǎn):一個(gè)用戶線程如果阻塞了,則整個(gè)進(jìn)程都將會(huì)阻塞,另外在多核 CPU中,是
    發(fā)表于 06-18 09:35

    開發(fā)必讀,操作系統(tǒng)進(jìn)程和線程

    模式中用戶的線程對(duì)操作系統(tǒng)不可見。優(yōu)點(diǎn):用戶線程開幾個(gè)都沒問題,且上下文切換發(fā)生用戶空間,切換的效率較高;缺點(diǎn):一個(gè)用戶線程如果阻塞了,則整個(gè)進(jìn)程都將會(huì)阻塞,另外在多核 CPU中,是
    發(fā)表于 07-01 06:30

    操作系統(tǒng)為什么分內(nèi)核態(tài)和用戶態(tài)?這兩者如何切換?

    操作系統(tǒng)為什么分內(nèi)核態(tài)和用戶態(tài),這兩者如何切換?進(jìn)程地址空間會(huì)劃分為哪些區(qū)域?堆和棧有什么區(qū)別?
    發(fā)表于 07-23 09:01

    為何將Linux操作系統(tǒng)劃分為用戶和內(nèi)核

    :使用Linux操作系統(tǒng)提供的功能2、Linux操作系統(tǒng)的組成:用戶和內(nèi)核空間——為何將Linux操作系統(tǒng)劃分為用戶和
    發(fā)表于 12-15 08:35

    有關(guān)Linux系統(tǒng)的PBC (進(jìn)程控制塊)基礎(chǔ)知識(shí)介紹

    ,比如打開的文件,掛起的信號(hào),處理器狀態(tài),內(nèi)核數(shù)據(jù)結(jié)構(gòu),內(nèi)存映射地址空間等。在操作系統(tǒng)中,內(nèi)核的調(diào)度對(duì)象時(shí)線程,而不是
    發(fā)表于 06-23 16:27

    什么是操作系統(tǒng)內(nèi)核

    什么是操作系統(tǒng)內(nèi)核 操作系統(tǒng)內(nèi)核是指大多數(shù)操作系統(tǒng)的核心部分。它由操作系統(tǒng)中用于管理存儲(chǔ)器、文
    發(fā)表于 06-17 07:23 ?9962次閱讀

    為什么選擇微內(nèi)核操作系統(tǒng)

    例如原來在宏內(nèi)核操作系統(tǒng)中,用戶應(yīng)用程序是通過系統(tǒng)調(diào)用,陷入到內(nèi)核中,然后再讀取、訪問文件。而在微內(nèi)核操作系統(tǒng)中,則是用戶應(yīng)用程序通過發(fā)送I
    的頭像 發(fā)表于 06-03 14:35 ?4161次閱讀

    深入淺出Linux的進(jìn)程地址空間

    我們知道,在32位機(jī)器上linux操作系統(tǒng)中的進(jìn)程地址空間大小是4G,其中0-3G是用戶空間,3G-4G是
    的頭像 發(fā)表于 06-20 09:57 ?1954次閱讀

    高性能混合微內(nèi)核操作系統(tǒng)RT-Thread Smart達(dá)到業(yè)界領(lǐng)先的技術(shù)水準(zhǔn)

    通常來講操作系統(tǒng)分為宏內(nèi)核和微內(nèi)核兩種不同的架構(gòu),如下圖所示,操作系統(tǒng)中分為了用戶域和核心域兩個(gè)地址空間
    的頭像 發(fā)表于 09-11 15:33 ?2990次閱讀
    高性能混合微<b class='flag-5'>內(nèi)核操作系統(tǒng)</b>RT-Thread Smart達(dá)到業(yè)界領(lǐng)先的技術(shù)水準(zhǔn)

    淺談鴻蒙操作系統(tǒng)的微內(nèi)核

    獲取用戶所有權(quán)限的做法,在安全性上大大提升。 什么是微內(nèi)核? 微內(nèi)核結(jié)構(gòu)由一個(gè)非常簡(jiǎn)單的硬件抽象層和一組比較關(guān)鍵的原語或系統(tǒng)調(diào)用組成;這些原語,僅僅
    的頭像 發(fā)表于 10-13 12:36 ?6195次閱讀

    Linux系統(tǒng)為什么需要區(qū)分內(nèi)核空間與用戶空間?

    ,或叫線性地址空間)為 4G(2的32次方)。也就是說一個(gè)進(jìn)程的最大地址空間為 4G。 操作系統(tǒng)
    的頭像 發(fā)表于 10-14 14:38 ?3632次閱讀
    Linux<b class='flag-5'>系統(tǒng)</b>為什么需要區(qū)分<b class='flag-5'>內(nèi)核</b><b class='flag-5'>空間</b>與用戶<b class='flag-5'>空間</b>?

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

    4G(2的32次方)。也就是說一個(gè)進(jìn)程的最大地址空間為 4G。 操作系統(tǒng)的核心是內(nèi)核(kernel),它獨(dú)立于普通的應(yīng)用程序,可以訪問受保
    的頭像 發(fā)表于 11-12 17:41 ?3021次閱讀
    以32位<b class='flag-5'>系統(tǒng)</b>為例介紹<b class='flag-5'>內(nèi)核</b><b class='flag-5'>空間</b>和用戶<b class='flag-5'>空間</b>

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

    在 Linux 系統(tǒng)中,采用了虛擬內(nèi)存管理技術(shù),事實(shí)上大多數(shù)現(xiàn)在操作系統(tǒng)都是如此!在 Linux 系統(tǒng)中,每一個(gè)進(jìn)程都在自己獨(dú)立的地址
    的頭像 發(fā)表于 10-07 17:28 ?995次閱讀
    Linux<b class='flag-5'>系統(tǒng)</b>為什么需要引入虛擬<b class='flag-5'>地址</b>