精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

保護模式下的內存管理

程序員cxuan ? 來源:程序員cxuan ? 2023-04-12 09:53 ? 次閱讀

我們知道,內存可以看做一個非常大的數組,我們想要查找內存中某個元素的話,會通過數組的下標來指定,內存也是如此,不過這有一個前提是這個數組是由一組有序的字節組成的,在這個有序的字節數組中,每個字節都有一個唯一的地址,這個地址也叫做內存地址

內存中存儲著很多對象,每個對象是由不同字節組成的,比如一個 char 對象,一個 byte 對象,一個 int 對象等等,它們都分部在內存的各個位置中,CPU 對內存中這些對象的地址進行定位的操作就叫做內存尋址。內存從 0 地址處開始編址,總共能查找到多少位的內存地址呢?答:是根據總線寬度來定位的。由于 80X86 是 32 位的,所以總線寬度也是 32 位,因此一共有 2 ^ 32 個內存地址,所以總共可以存放 4GB 的內存地址。由于內存地址是連續的,于是可以連續的取出多個字節的數據類型,例如 int、long、double。

雖然能夠尋址到對象,但是這些對象存放的字節順序是不同的,這里分為兩種存放方式,即大端法小端法

比如現在有一個 int 類型的對象,位于地址 0x100 處,它的十六進制數值是 0x01234567,我給你畫一幅圖你就明白這兩個存放順序的區別了。

cd185db2-d8ce-11ed-bfe3-dac502259ad0.png

這個其實很好理解,0x01234567 的 int 數據類型可以拆分為 01 23 45 67 個字節,并且 01 是高位,67 是低位,于是可以解釋小端法和大端法的存儲順序:即小端法是低位在前,而大端法是高位在前。大端法和小端法只是存儲順序的區別,和對象的位數、數值無關。大多數 Intel 機器都采用的是小端模式,所以 80X86 也是小端存儲,而一些 IBM 和 Oracle 的大多數機器都是使用的大端存儲方式。

由于計算機是無法直接將內存中的數據一次性全部尋址完畢,因為它相對實在太過龐大,所以內存一般會進行分段,這里就涉及一個疑問:即內存為什么要分段。我上面只是籠統的介紹了下。

內存為什么要分段?

分段機制把內存空間分成一個或多個段的線性區域,這部分線性區域可以使用段基址 + 段內偏移來確定。段基址部分由 16 位的段選擇符來指定,其中 14 位是可以選擇 2 ^ 14 次方即 16384 個段,段內偏移地址部分使用 32 位的值來指定,因此段內地址可以是 0 - 4G ,一個段的最大長度是 4 GB,這也就和上面所說的 4 GB 的內存地址相呼應。由 16 位段和 32 位段內偏移構成的 48 位地址或長指針稱為一個邏輯地址,邏輯地址就是虛擬地址。

X86 有幾個專門存放段基址的寄存器:CS、DS、ES、SS、FS 和 GS。其中 CS 用于尋址代碼段,SS 用于尋址堆棧段,其他寄存器用于尋址數據段。在任何指定時刻由 CS 尋址的段稱為當前代碼段。此時 EIP 寄存器中就包含了當前代碼段內下一條需要執行指令的偏移地址。此時的段基址:偏移地址就可以表示為 CS:EIP 了。

由段寄存器 SS 尋址的段稱為當前堆棧段,棧頂由 ESP 寄存器給出,在任何時刻 SS:ESP 都指向棧頂,并且沒有例外情況,其他四個是通用數據段寄存器,當指令中默認沒有數據段時,由 DS 給出。

地址轉換

一個完整的內存管理系統一般都會包含兩部分:訪問保護地址轉換。訪問保護是為了防止一個應用程序訪問的內存地址是另一塊程序所使用的;地址轉換就是給不同的應用程序提供一個動態的地址分配方式。訪問保護和地址轉換是相輔相成的。

地址轉換通常以內存塊作為基本單位,這里解釋下什么是塊,大家知道在 Linux 中,一切都是文件,而文件就是由一個個的塊構成的,塊(block)是用于描述文件系統的組成單位,也是數據處理的基本單位。雖說塊是基本單位,但是其本質也是由一個個扇區構成的,常見的塊有 512B、1KB、4KB 等。

地址轉換有兩種實現方式:分段機制分頁機制。x86 在內存管理的實現方式結合了分段和分頁機制,下面是虛擬地址經過分段和分頁后轉換為物理地址的映射圖

cd2f1430-d8ce-11ed-bfe3-dac502259ad0.png

針對這張圖,有必要解釋一下:

首先,這張圖包含三個地址和這三個地址的轉換過程,從大體上來看,邏輯地址會經過分段基址轉換后變為線性地址,線性地址是保護模式下的段基址 + 段內偏移,因此這張圖是保護模式下的地址轉換圖。線性地址會經過分頁機制后轉換為物理地址,前提是需要開啟分頁機制;如果沒有開啟分頁機制,線性地址 = 物理地址。

需要再說一下邏輯地址,邏輯地址里面包含段選擇子和段內偏移,段選擇子這個概念我剛開始接觸也比較模糊,簡單一點來說可以把它理解為是保護模式下的段基址,大家知道段基址是 16 位的,而段內偏移是 32 位的。

很多書或者文章中都提到了段選擇符,其實段選擇子就是段選擇符,這完全是翻譯問題,英文都是 selector。

后面會提到段描述符,段描述符和段選擇子不是一回事,但段選擇子是一個 16 位的段描述符。

再和大家說一下這個圖上沒有寫出來的內容,現在大家知道邏輯地址可以轉換為線性地址,線性地址可以轉換為物理地址,那么根源是如何轉換的呢?實際上這里使用的方式是 MMU(內存管理單元)進行轉換;而線性地址轉換為物理地址使用的是分頁單元的硬件電路。具體的轉換過程不是此篇文章討論的重點,我們把重點還是放在分段和分頁這兩個機制上。

下面來詳細聊一聊分段和分頁這兩個機制。

分段機制

這里推薦大家先看一下我寫的 "內存為什么要分段" 的那段描述。

分段提供了隔絕代碼、數據和堆棧區域的機制,這才使得多個程序能夠運行在同一個內存空間中不會相互干擾。如果 CPU 中有多個程序或者任務正在運行,那么每個程序都可以分配各自的一套段(包含程序代碼、數據和堆棧),CPU 通過加強段之間的界限來達到防止應用程序相互干擾的目的。

一個系統中所有使用的段都包含在 CPU 的線性地址空間中。為了定位指定段中的字節,程序必須提供邏輯地址才能進行轉換。邏輯地址包含段選擇子和段內偏移,每個段都有一個段描述符,段描述符用于指出段的大小、訪問權限和段的特權級、段類型以及段第一個字節在線性地址空間中的位置(段基址)。邏輯地址的偏移量部分加到段基址上就可以定位段中某個字節的位置,因此段基址 + 偏移量形成了 CPU 線性地址空間中的地址。

線性地址空間與物理地址空間具有相同的結構,但是它們所能容納的段相差甚遠,虛擬地址也就是邏輯地址空間可包含最多 16 K 的段,而每個段可容納的大小為 4 GB ,所以虛擬地址總共能查找到 64TB(2 ^ 46) 的段,線性地址和物理地址的空間是 4GB (2 ^ 32)。所以,如果禁用了分頁機制,那么線性地址空間就是物理地址空間。

cd50d2d2-d8ce-11ed-bfe3-dac502259ad0.png

這幅圖就是邏輯地址 -> 線性地址 -> 物理地址的映射圖,GDT 表和 LDT 表各占一半的地址空間,各為 8192 個段,每個段最長為 4 G,從 GDT 表還是 LDT 表查詢,具體從哪個表查還是要看段選擇子的 TI 屬性,段選擇子的結構如下所示

cd6db492-d8ce-11ed-bfe3-dac502259ad0.png

段選擇子總共分為三個部分:

RPL(Request Privilege Level):請求特權級,表示進程應該以什么權限來訪問段,數值越大權限越小。

TI(Table Indicator):表示應該查詢哪個表,TI = 0 查 GDT 表;TI = 1 查 LDT 表。

Index:CPU 會自動將 Index * 8,在加上 GDT 和 LDT 中的段基址,就是要加載的段描述符。

這里沒有太細致的詳解一下段描述符,因為此篇還是偏向于內存管理,沒有太執著于某個細節。

邏輯地址由兩部分組成,段選擇子和偏移量,段選擇字可以合成段描述符,然后它們會直接保存在 GDTR 中。段選擇子和段內偏移經過 MMU 后可以轉換成為線性地址。

分頁機制

上面我們說到,線性地址是由邏輯地址轉換過來的,如果禁用了分頁機制,線性地址就是物理地址,如果開啟分頁機制,線性地址和邏輯地址空間的數量還是不同的。一般程序都是多任務的,而多任務通常定義的線性地址空間要比物理內存容量大得多,為什么呢?地址轉換映射圖上畫著明明線性地址和物理地址都是 4G 的大小啊。那是因為,線性地址被虛擬存儲技術所虛擬化了。

虛擬存儲是一種內存管理技術,使用這項技術可以讓我們產生內存空間要比實際的物理內存容量大的多的錯覺,其本質是把內存虛擬化了,就是說內存可能只有 4G,但是你以為內存有 64 G,所以我為什么能開那么多應用程序的原因。

分頁機制其實就是虛擬化的一種實現,在虛擬化的環境中,大量的線性地址空間會映射到一小塊物理內存(RAM 或者 ROM)中。當使用分頁時,每個段被劃分成頁面(一般為 4K),這個頁面會存儲在物理內存或硬盤上。操作系統通過使用一個頁目錄和頁表來維護這些頁面。當程序試圖訪問線性地址空間中的某一個地址位置時,CPU 就會使用頁目錄和頁表把這個線性地址轉換成物理地址,再存儲在物理內存上。

如果當前訪問的頁面不在物理內存中,CPU 就會執行中斷,一般錯誤就是頁面異常,然后操作系統會把這個頁面從硬盤上讀入物理內存中,然后繼續從中斷處執行程序。操作系統經常會進行頻繁的頁面換入換出操作,這也是一個性能瓶頸所在。

分段中的每個段長度是不固定的,最大位 4G,而分頁中的每個頁面大小是固定的。不論在物理內存還是磁盤上,使用固定大小的頁面更適合管理物理內存;而分段機制使用大小可變的塊更適合處理復雜系統的邏輯分區。

雖然分段和分頁是兩種不同的地址轉換機制,但是它們對整個地址變換是獨立處理的,每個過程都是獨立的。這兩種機制都使用了一種中間表來存儲表項映射,但是這個中間表的結構是不同的。段表存在線性地址空間中,頁表則存儲在物理地址空間。

保護機制

80x86 包含兩種保護機制,第一種是為每個任務分配不同的虛擬地址空間來完全隔離各個任務。這是通過給每個任務邏輯地址到物理地址的不同變換得到的,每個應用程序只能訪問自己虛擬空間內的數據和指令,只能通過它自己的映射得到物理地址;第二種機制是保護任務,保護操作系統的內存段和一些特殊寄存器不會被應用程序所訪問。下面我們就來具體探討一下這兩個任務。

任務之間的保護

每個任務會單獨的放在自己的虛擬地址空間中,再經過硬件映射成為物理地址,不同的虛擬地址會變換成為不同的物理地址,不會存在 A 的虛擬地址會映射到 B 所在的物理地址的范圍內,這樣就會把所有的任務都隔絕開,且不同任務之間不會相互干擾。

每個任務都有各自的映射表、段表和頁表,當 CPU 切換不同的應用程序或任務時,這些表也會進行切換。

虛擬地址是操作系統的抽象,也就是說虛擬地址完全是操作系統所抽象出來能夠更好管理應用程序和任務的一個載體,每個任務都可以把邏輯地址映射成為虛擬地址,這也表明每個任務都可以訪問操作系統,操作系統可以被所有的任務所共享。這個所有任務都具有相同虛擬地址空間的部分被稱為全局地址空間(Global address space),Linux 就使用到了全局地址空間。

全局地址空間中每個任務都有自己的唯一的虛擬地址空間,這個虛擬地址空間叫做局部地址空間(Local address space)。

內存段和寄存器的特殊保護

如果說操作系統在不同任務之間的保護是橫向的話,那么對內存段和寄存器的等級保護就是縱向的。操作系統定義了 4 個特權級來對每個任務提供保護,來限制對任務中各段的訪問。

優先級分為 4 個等級,0 最高,3 最低。一般最敏感的數據會被賦予最高優先級,它們只能被任務中最受信任的部分訪問,不太敏感的數據會賦予低優先級;內核操作系統訪問一般是 0 級,應用程序數據一般是 3 級。每個內存段都與一個特權級相關聯。

我們知道 CPU 通過 CS 從段中取得指令和數據執行,從段中取得的指令和數據是具有特權級的,一般用當前特權級(Current Privilege Level)來訪問,CPL 就是當前活動代碼的特權級。每當有應用程序試圖訪問段時,就會與這個特權級進行比較,只有比段的特權級低才能夠訪問。

審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 寄存器
    +關注

    關注

    31

    文章

    5317

    瀏覽量

    120003
  • cpu
    cpu
    +關注

    關注

    68

    文章

    10824

    瀏覽量

    211140
  • 內存
    +關注

    關注

    8

    文章

    2999

    瀏覽量

    73882
  • 內存管理
    +關注

    關注

    0

    文章

    168

    瀏覽量

    14125
  • 數組
    +關注

    關注

    1

    文章

    415

    瀏覽量

    25908

原文標題:保護模式下的內存管理

文章出處:【微信號:cxuangoodjob,微信公眾號:程序員cxuan】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    深度解析Linux的內存管理體系

    Linux內存管理的整體模式是虛擬內存管理(分頁內存管理
    發表于 08-06 16:55 ?1702次閱讀

    TPA3255上電后直接進入欠壓保護模式,是什么原因?

    我自己做了幾塊TPA3255的開發板,輸出采用2*BTL,在調試的時候。不加輸入信號,就給電路板采用+24V的電源電壓供電,板子上電后直接進入欠壓保護模式,即FAULT的指示燈亮,OTW指示燈
    發表于 08-22 08:19

    TAS5630B M1、M2、M3到底是設置硬件模式的還是保護模式的?

    關于TAS5630B的幾個問題 1.M1、M2、M3到底是設置硬件模式的還是保護模式的?從上表看是由這三位決定輸出是SE還是BTL或PBTL,可是翻看論壇有關TAS5630的問題貼,有個說是
    發表于 10-09 06:20

    LED開關電源有哪些重要的保護模式

    led開關電源的保護模式如下:1、過流電路:通常要先知道當出現負載短路、過載或者控制電路失效等意外情況時,會引起流過開關管的電流過大,使管子功耗增大、發熱,假如沒有過流保護裝置,大功率開關管就有幾率
    發表于 04-27 10:26

    DOS保護模式的匯編示范源程序(使用Tasm3.0)

    DOS保護模式的匯編示范源程序(使用Tasm3.0) ;名稱:PENTIUM.INC;功能:符號常量等的定義;----------------------------------------------------------------------------;IF
    發表于 05-06 16:38 ?39次下載

    Linux系統引導部分保護模式研究與分析

    本文結合內存管理項目深入研究了Linux在系統引導過程中的保護模式的工作,對于實現內存管理有重
    發表于 07-14 17:08 ?28次下載

    80386保護模式編程深入學習

    以前看了很多本關于 80386 保護模式編程的書,網上也搜集了很多保護模式相關的電子文檔,看得時候似乎看懂了,可以時間一長就發現概念很模糊!正巧在學習linux 的時候,網站上找
    發表于 07-13 17:38 ?0次下載
    80386<b class='flag-5'>保護模式</b>編程深入學習

    嵌入式遠程調試器保護模式下調試功能

    嵌入式遠程調試器為嵌入式系統開發者提供了一個友好的軟件調試平臺。探討了保護模式的用戶目標程序的調試方法。并詳細闡述如何運用運行在遠程設備上的監控程序實現實模式
    發表于 12-01 16:01 ?36次下載
    嵌入式遠程調試器<b class='flag-5'>保護模式</b>下調試功能

    匯編語言學習課件_32位CPU及Windows基礎

    第九章 32位CPU及Windows基礎 9.1 保護模式基礎 9.2 內存管理 9.3 Windows環境
    發表于 12-31 10:41 ?0次下載

    匯編語言學習課件_保護模式及其應用

    第十二章 保護模式及其應用 12.1 特權級保護 12.2 任務 12.3 中斷和異常 12.4 虛擬8086模式 12.5 操作系統類指令
    發表于 12-31 10:41 ?0次下載

    如何在DOS實模式下直接訪問整個4GB內存空間

    雖然有許多書籍對保護模式作解釋,但沒有一本能簡單明了地解釋清楚,冗長煩雜的術語讓人看著想打瞌睡,甚至還有許多用匯編寫的(可能根本不能運行的)保護模式試驗程序,事實上用C語言本身就可以做保護模式的進出工作。
    發表于 04-04 11:46 ?2236次閱讀
    如何在DOS實<b class='flag-5'>模式</b>下直接訪問整個4GB<b class='flag-5'>內存</b>空間

    X86匯編語言從實模式保護模式PDF電子書免費下載

    《x86匯編語言:從實模式保護模式》主要講述INTEL x86處理器的16位實模式、32位保護模式,至于虛擬8086模式,則是為了兼容傳統
    發表于 07-26 08:00 ?190次下載
    X86匯編語言從實<b class='flag-5'>模式</b>到<b class='flag-5'>保護模式</b>PDF電子書免費下載

    變頻空調器的保護模式_變頻空調器運行模式

    制冷狀態,若室內風扇轉速慢或室內空氣過濾器臟,使室內熱交換器無法吸收足夠的熱量,它內部的制冷劑不能汽化,不僅會降低制冷效果,甚至可能會導致壓縮機因液擊而損壞,所以變頻空調器都具有室內熱交換器防凍結保護模式
    的頭像 發表于 01-06 15:12 ?5649次閱讀

    在變頻器啟動過載時我們要怎么調參數?過載時的保護模式有哪些?

    在變頻器啟動過載時我們要怎么調參數?過載時的保護模式有哪些? 當變頻器啟動過載時,需要經過一系列的檢查和調整參數才能恢復正常使用。本文將詳細介紹如何調整變頻器參數以及過載時的保護模式。 一、變頻器
    的頭像 發表于 10-22 14:25 ?7078次閱讀

    功放進入削峰保護模式?教你如何排查問題

    功放進入削峰保護模式?教你如何排查問題? 功放進入削峰保護模式可能是由多種原因引起的。在排查問題之前,我們首先需要了解什么是功放的削峰保護模式。 功放的削峰保護模式是一種
    的頭像 發表于 02-05 10:32 ?1045次閱讀