操作系统储存管理功能
操作系統的存儲管理功能分為四個部分
- 地址映射
- 虛擬儲存
- 內存分配
- 儲存保護
一:地址映射
1. 固定地址映射
在編程或編譯確定邏輯地址和物理地址的映射關系
特點:程序加載時必須放在指定的內存區域
容易產生地址沖突,運行失敗
2. 靜態地址映射
程序裝入時由操作系統完成邏輯地址到物理地址的映射
MA = VA + BA
特點:程序運行之前確定映射關系,裝入后不能移動,占用連續的內存空間
3. 動態地址映射
在程序執行過程中把邏輯地址轉換為物理地址
MA = VA + BA
特點:程序占用的內存空間可動態變化,不要求連續的內存空間,便于多個進程共享代碼,缺點是硬件支持(MMU),軟件復雜
二:虛擬存儲
借助輔存在邏輯上擴充內存,解決內存不足的問題
過程:
- 遷入:將要運行的部分裝入內存
- 遷出:把不運行的部分暫時放在輔存
前提
短時間內進程不運行的部分往往占大部分
程序局部性原理
時間局部性
空間局部性
實現虛擬存儲的前提:
足夠的輔存
適當容量的內存
地址變換機構
三:內存分配
為程序分配足夠的內存空間
Windows虛擬地址空間分配
在32位的機器上,地址空間從0x00000000~ 0xFFFFFFFF,總大小為4GB。一般而言,低地址空間,從0x00000000~ 0x7FFFFFFF使用戶空間,高地址空間被分配給系統。
總體:
| 0x00000000 ~ 0x0000FFFF | 這段內存為空指針區,不可以同時訪問 |
| 0x00010000 ~ 0x7FFEFFFF | 這段供進程使用,包括所有的數據,靜態或動態加載的exe和dll模塊,以及內存映射文件 |
| 0x7FFF0000 ~ 0x7FFFFFFF | 此64KB是禁止訪問的,因為它挨著內核區域,防止內核區域被覆蓋,以破壞內核的正確性和完整性,試圖改寫此區域,會產生異常,以阻攔進一步改寫內存區域 |
| 0x80000000 ~ 0xFFFFFFFFF | 內核區域,用于線程調度,內存管理,文件系統支持,網絡支持和所有設備驅動的代碼全部在次分區加載,駐留在這個分區中的一切均可被所有進程共享 |
用戶低2GB空間分配:
| 0x0 ~ 0xFFFF | 拒絕訪問區域,用于幫助程序員避免引用錯誤的指針 |
| 0x00010000 ~ 0x7FFEFFFF | 專用進程地址空間 |
| 0x7EFDE000 ~ 0x7EFDEFFF | 用于第一個線程的線程環境塊(TEB),系統會在這一頁的前面創建附加的TEB(從0x7FFDD000開始向上) |
| 0x7FFDF000 ~ 0x7FFDFFFF | 進程環境塊(PEB) |
| 0x7FFE0000 ~ 0x7FFE0FFF | 共享的用戶數據頁,這個只讀方式的頁面被映射到系統空間中包含系統時間,時鐘計數和版本號信息的一個頁面,這個頁面的存在使數據在用戶態下可以直接讀取而不必請求核心態的轉換 |
| 0x7FFE1000 ~ 0x7FFEFFFF | 拒絕訪問區域 |
| 0x7FFF0000 ~ 0x7FFFFFFF | 拒絕訪問區域,用于防止線程跨越用戶/系統空間邊界傳送緩存區,在變量MmUserProbeAddress中包含此頁的起始地址 |
核心高2GB空間分配:
| 0x80000000 ~ 0xc0000000 | 內核執行體,HAL和硬件驅動程序 |
| 0xc0000000 ~ 0xc0800000 | 進程頁和超空間 |
| 0xc0800000 ~ 0xFFBE000 | 系統高速緩存,分頁緩沖池,非分頁緩沖池 |
| 0xFFBE000 ~ 0xFFC0000 | 崩潰儲存驅動程序區域 |
| 0xFFC0000 ~ 0xFFFFFFF | 留給HAL使用 |
內存管理
每個進程都擁有自己的4G(32位機)虛擬內存地址,各個進程之間是相互獨立的,每個進程的數據可由其中線程共享。虛擬內存地址本身不對應任何物理地址,直接引用會引發錯誤,虛擬內存地址必須映射物理地址后才能儲存數據。內存分配其實指的是虛擬內存地址映射物理內存,內存回收就是指解除映射關系。
四:儲存保護
保證在內存中的多道程序只能在給定的儲存區域內活動并互不干擾
方法:界址寄存器
在CPU中設置一對下限寄存器和上限寄存器存放程序在內存中的下限地址和上限地址
程序訪問內存時硬件自動將目的地址與下限寄存器和上限寄存器中存放的地址界限進行比較,判斷是否越界
關于計算機硬件存儲系統詳細見計算機存儲系統
總結
以上是生活随笔為你收集整理的操作系统储存管理功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C程序多线程同时画圆画方
- 下一篇: 原码、反码、补码解析,保证一次搞懂