搜尋
首頁運維linux運維詳解Linux的使用者空間與核心空間

推薦:《linux影片教學

  • #Linux 作業系統和驅動程式運行在核心空間,應用程式運行在用戶空間。
  • 兩者不能簡單地使用指標傳遞數據,因為Linux使用的虛擬記憶體機制,使用者空間的資料可能被換出,當核心空間使用使用者空間指標時,對應的資料可能不在記憶體中。使用者空間的記憶體映射採用段頁式,而核心空間有自己的規則;本文旨在探討核心空間的位址映射。
  • os分配給每個進程一個獨立的、連續的、虛擬的位址記憶體空間,該大小一般是4G(32位元作業系統,即2的32次方),其中將高位址值的記憶體空間分配給os佔用,linux os佔用1G,window os佔用2G;其餘記憶體位址空間分配給進程使用。
  • 通常32位元Linux核心虛擬位址空間劃分0~3G為用戶空間,3~4G為核心空間(注意,核心可以使用的線性位址只有1G)。注意這裡是32位元核心位址空間劃分,64位元核心位址空間劃分是不同的。

 

 
  • #程式尋址空間0~4G
  • 程式在使用者狀態只能存取0~3G,只有進入核心態才能存取3G~4G  
  • 程式透過系統呼叫進入核心態
  • 每個行程虛擬空間的3G~4G部分是相同的 
  • 進程從使用者狀態進入核心狀態不會造成CR3的改變但會造成堆疊的改變

二. Linux核心高階記憶體

# 1. 由來當核心模組程式碼或執行緒存取記憶體時,程式碼中的記憶體位址都是邏輯位址,而對應到真正的實體記憶體位址,需要位址一對一的映射,如邏輯位址0xc0000003對應的實體位址為0×3,0xc0000004對應的實體位址為0×4,… …,邏輯位址與實體位址對應的關係為實體位址= 邏輯位址– 0xC0000000 :這是核心位址空間的位址轉換關係,注意核心的虛擬位址在“高端”,但是ta映射的實體記憶體位址在低端。 邏輯位址#實體記憶體位址 0xc00000000×0
#########0xc0000001######0×1#############0xc0000002################0xc0000002##### #0×2############0xc0000003#######0×3###########…#####…######################################################################################################### ########0xe0000000######0×20000000############…######…###################################################################### ###0xffffffff############0×40000000 ??###############

假 設依照上述簡單的位址映射關係,那麼核心邏輯位址空間存取為0xc0000000 ~ 0xffffffff,那麼對應的物理記憶體範圍就為0×0 ~ 0×40000000,即只能存取1G物理記憶體。若機器中安裝8G物理內存,那麼核心就只能訪問前1G物理內存,後面7G物理內存將會無法訪問,因為內核 的地址空間已經全部映射到物理內存地址範圍0×0 ~ 0×40000000。即使安裝了8G物理內存,那麼物理位址為0×40000001的內存,核心該怎麼去存取呢?程式碼中必須要有記憶體邏輯位址 的,0xc0000000 ~ 0xffffffff的位址空間已經被用完了,所以無法存取實體位址0×40000000以後的記憶體。

顯 然不能將核心位址空間0xc0000000 ~ 0xfffffff全部用來簡單的位址對映。因此x86架構中將核心位址空間分割三個部分:ZONE_DMA、ZONE_NORMAL和 ZONE_HIGHMEM。 ZONE_HIGHMEM即為高階內存,這就是記憶體高階記憶體概念的由來。


在x86結構中,三種類型的區域(從3G開始計算)如下:

ZONE_DMA        記憶體開始的16MB

ZONE_NORMAL       16MB~896MB

ZONE_HIGHMEM       896MB ~ 結束(1G)

 

2. 理解

前面我們解釋了高階記憶體的由來。 Linux將核心位址空間分割為三部分ZONE_DMA、ZONE_NORMAL和ZONE_HIGHMEM,高階記憶體HIGH_MEM位址空間範圍為 0xF8000000 ~ 0xFFFFFFFF(896MB~1024MB)。那麼如核心是如何借助128MB高階記憶體位址空間是如何實現存取可以所有實體記憶體

當核心想存取高於896MB實體位址記憶體時,從0xF8000000 ~ 0xFFFFFFFF位址空間範圍內找一段對應大小空閒的邏輯位址空間,借用一會。借用這段邏輯位址空間,建立映射到想存取的那段實體記憶體(即填滿核心PTE頁面表),暫時用一會,用完後歸還。這樣別人也可以藉用這段位址空間來存取其他實體內存,實現了使用有限的位址空間,存取所有所有實體記憶體。如下圖。

範例 如核心想存取2G開始的一段大小為1MB的物理內存,即物理位址範圍為0×80000000 ~ 0x800FFFFF。造訪前先找到一段1MB大小的空閒位址空間,假設找到的空閒位址空間為0xF8700000 ~ 0xF87FFFFF,用這1MB的邏輯位址空間對應到物理位址空間0×80000000 ~ 0x800FFFFF的記憶體。映射關係如下:

##0×800000000xF8700001#0×800000010xF8700020×80000002…0x800FFFFF
邏輯位址 #物理記憶體位址
0xF8700000
0xF870002
0xF87FFFFF
######

當核心存取完0×80000000 ~ 0x800FFFFF實體記憶體後,就將0xF8700000 ~ 0xF87FFFFF核心線性空間釋放。這樣其他進程或程式碼也可以使用0xF8700000 ~ 0xF87FFFFF這段位址存取其他實體記憶體。

從上面的描述,我們可以知道高階記憶體的最基本想法:借一段位址空間,建立臨時位址映射,用完後釋放,達到這段位址空間可以循環使用,存取所有實體記憶體。

看到這裡,不禁有人會問:萬一有核心行程或模組一直佔用某段邏輯位址空間不釋放,怎麼辦?若真的出現的這種情況,則核心的高端記憶體位址空間越來越緊張,若都被佔用不釋放,則沒有建立映射到實體記憶體都無法存取了。

 

3. 分割

核心將高階記憶體劃分為3部分:VMALLOC_START~VMALLOC_END、KMAP_BASE~FIXADDR_START和FIXADDR_START~4G。


對於高階內存,可以透過alloc_page() 或其它函數取得對應的page,但是要存取實際實體內存,還得把page 轉為線性位址才行(為什麼?想想MMU 是如何存取實體記憶體的),也就是說,我們需要為高階記憶體對應的page 找一個線性空間,這個過程稱為高階記憶體映射。

對應高階記憶體的3部分,高階記憶體映射有三種方式:
對應到」內核動態映射空間」(noncontiguous memory allocation)
這種方式很簡單,因為透過vmalloc() ,在」內核動態映射空間」申請記憶體的時候,就可能從高階記憶體獲得頁面(參考vmalloc 的實作),因此說高階記憶體有可能映射到」內核動態映射空間」。

持久內核映射(permanent kernel mapping)
如果是透過 alloc_page() 獲得了高階記憶體對應的 page,如何給它找個線性空間?
核心專門為此留出一塊線性空間,從 PKMAP_BASE 到 FIXADDR_START ,用於映射高階記憶體。在 2.6核心上,這個位址範圍是 4G-8M 到 4G-4M 之間。這個空間起叫」內核永久映射空間」或」永久內核映射空間」。這個空間和其它空間使用同樣的頁目錄表,對於核心來說,就是 swapper_pg_dir,對普通進程來說,透過 CR3 暫存器指向。通常情況下,這個空間是 4M 大小,因此只需要一個頁表即可,核心會透過來 pkmap_page_table 尋找這個頁表。透過 kmap(),可以把一個 page 映射到這個空間來。由於這個空間是 4M 大小,最多能同時對應 1024 個 page。因此,對於不使用的的 page,及應該時從這個空間釋放掉(也就是解除映射關係),透過 kunmap() ,可以把一個 page 對應的線性位址從這個空間釋放出來。

暫時映射(temporary kernel mapping)
核心在 FIXADDR_START 到 FIXADDR_TOP 之間保留了一些線性空間用於特殊需求。這個空間稱為”固定映射空間」在這個空間中,有一部分用於高端記憶體的臨時映射。

這塊空間有以下特點:
(1)每個CPU 佔用一塊空間
(2)在每個CPU 佔用的那塊空間中,又分成多個小空間,每個小空間大小是1 個page,每個小空間用於一個目的,這些目的定義在kmap_types.h 中的km_type 中。

當要進行一次暫時映射的時候,需要指定映射的目的,根據映射目的,可以找到對應的小空間,然後把這個空間的位址當作映射位址。這意味著一次臨時映射會導致先前的映射被覆蓋。透過 kmap_atomic() 可實現臨時映射。

 

三. 其他

1、使用者空間(進程)是否有高階記憶體概念?

使用者進程沒有高階記憶體概念。只有在核心空間才存在高端記憶體。使用者進程最多只可以存取3G物理內存,而內核進程可以存取所有實體內存。

2、64位元核心中有高階記憶體嗎?

目前現實中,64位元Linux核心不存在高階內存,因為64位元核心可以支援超過512GB記憶體。若機器安裝的實體記憶體超過核心位址空間範圍,就會存在高階記憶體。

3、使用者行程能存取多少實體記憶體?內核程式碼能存取多少實體記憶體?

32位元系統使用者行程最大可以存取3GB,核心程式碼可以存取所有實體記憶體。

64位元系統使用者進程最大可以存取超過512GB,核心程式碼可以存取所有實體記憶體。

4、高階記憶體和實體位址、邏輯位址、線性位址的關係?

高階記憶體只和邏輯位址有關係,和邏輯位址、實體位址沒有直接關係。

以上是詳解Linux的使用者空間與核心空間的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:csdn。如有侵權,請聯絡admin@php.cn刪除
Linux:如何進入恢復模式(和維護)Linux:如何進入恢復模式(和維護)Apr 18, 2025 am 12:05 AM

進入Linux恢復模式的步驟是:1.重啟系統並按特定鍵進入GRUB菜單;2.選擇帶有(recoverymode)的選項;3.在恢復模式菜單中選擇操作,如fsck或root。恢復模式允許你以單用戶模式啟動系統,進行文件系統檢查和修復、編輯配置文件等操作,幫助解決系統問題。

Linux的基本要素:為初學者解釋Linux的基本要素:為初學者解釋Apr 17, 2025 am 12:08 AM

Linux的核心組件包括內核、文件系統、Shell和常用工具。 1.內核管理硬件資源並提供基本服務。 2.文件系統組織和存儲數據。 3.Shell是用戶與系統交互的接口。 4.常用工具幫助完成日常任務。

Linux:看看其基本結構Linux:看看其基本結構Apr 16, 2025 am 12:01 AM

Linux的基本結構包括內核、文件系統和Shell。 1)內核管理硬件資源,使用uname-r查看版本。 2)EXT4文件系統支持大文件和日誌,使用mkfs.ext4創建。 3)Shell如Bash提供命令行交互,使用ls-l列出文件。

Linux操作:系統管理和維護Linux操作:系統管理和維護Apr 15, 2025 am 12:10 AM

Linux系統管理和維護的關鍵步驟包括:1)掌握基礎知識,如文件系統結構和用戶管理;2)進行系統監控與資源管理,使用top、htop等工具;3)利用系統日誌進行故障排查,借助journalctl等工具;4)編寫自動化腳本和任務調度,使用cron工具;5)實施安全管理與防護,通過iptables配置防火牆;6)進行性能優化與最佳實踐,調整內核參數和養成良好習慣。

了解Linux的維護模式:必需品了解Linux的維護模式:必需品Apr 14, 2025 am 12:04 AM

Linux維護模式通過在啟動時添加init=/bin/bash或single參數進入。 1.進入維護模式:編輯GRUB菜單,添加啟動參數。 2.重新掛載文件系統為讀寫模式:mount-oremount,rw/。 3.修復文件系統:使用fsck命令,如fsck/dev/sda1。4.備份數據並謹慎操作,避免數據丟失。

Debian如何提升Hadoop數據處理速度Debian如何提升Hadoop數據處理速度Apr 13, 2025 am 11:54 AM

本文探討如何在Debian系統上提升Hadoop數據處理效率。優化策略涵蓋硬件升級、操作系統參數調整、Hadoop配置修改以及高效算法和工具的運用。一、硬件資源強化確保所有節點硬件配置一致,尤其關注CPU、內存和網絡設備性能。選擇高性能硬件組件對於提升整體處理速度至關重要。二、操作系統調優文件描述符和網絡連接數:修改/etc/security/limits.conf文件,增加系統允許同時打開的文件描述符和網絡連接數上限。 JVM參數調整:在hadoop-env.sh文件中調整

Debian syslog如何學習Debian syslog如何學習Apr 13, 2025 am 11:51 AM

本指南將指導您學習如何在Debian系統中使用Syslog。 Syslog是Linux系統中用於記錄系統和應用程序日誌消息的關鍵服務,它幫助管理員監控和分析系統活動,從而快速識別並解決問題。一、Syslog基礎知識Syslog的核心功能包括:集中收集和管理日誌消息;支持多種日誌輸出格式和目標位置(例如文件或網絡);提供實時日誌查看和過濾功能。二、安裝和配置Syslog(使用Rsyslog)Debian系統默認使用Rsyslog。您可以通過以下命令安裝:sudoaptupdatesud

Debian中Hadoop版本怎麼選Debian中Hadoop版本怎麼選Apr 13, 2025 am 11:48 AM

選擇適合Debian系統的Hadoop版本,需要綜合考慮以下幾個關鍵因素:一、穩定性與長期支持:對於追求穩定性和安全性的用戶,建議選擇Debian穩定版,例如Debian11(Bullseye)。該版本經過充分測試,擁有長達五年的支持週期,能夠確保系統穩定運行。二、軟件包更新速度:如果您需要使用最新的Hadoop功能和特性,則可以考慮Debian的不穩定版(Sid)。但需注意,不穩定版可能存在兼容性問題和穩定性風險。三、社區支持與資源:Debian擁有龐大的社區支持,可以提供豐富的文檔和

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前By尊渡假赌尊渡假赌尊渡假赌
威爾R.E.P.O.有交叉遊戲嗎?
1 個月前By尊渡假赌尊渡假赌尊渡假赌

熱工具

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器