當前位置:首頁 » 操作系統 » linux內核態

linux內核態

發布時間: 2022-10-19 10:59:34

1. 在unix/linux系統中,什麼是用戶態,什麼是內核態

究竟什麼是用戶態,什麼是內核態,這兩個基本概念以前一直理解得不是很清楚,根本原因個人覺得是在於因為大部分時候我們在寫程序時關注的重點和著眼的角度放在了實現的功能和代碼的邏輯性上,先看一個例子:

1)例子

C代碼
1. void testfork(){
2. if(0 = = fork()){
3. printf(「create new process success!\n」);
4. }
5. printf(「testfork ok\n」);
6. }

這段代碼很簡單,從功能的角度來看,就是實際執行了一個fork(),生成一個新的進程,從邏輯的角度看,就是判斷了如果fork()返回的是則列印相關語句,然後函數最後再列印一句表示執行完整個testfork()函數。代碼的執行邏輯和功能上看就是如此簡單,一共四行代碼,從上到下一句一句執行而已,完全看不出來哪裡有體現出用戶態和進程態的概念。

如果說前面兩種是靜態觀察的角度看的話,我們還可以從動態的角度來看這段代碼,即它被轉換成CPU執行的指令後載入執行的過程,這時這段程序就是一個動態執行的指令序列。而究竟載入了哪些代碼,如何載入就是和操作系統密切相關了。

2)特權級

熟悉Unix/Linux系統的人都知道,fork的工作實際上是以系統調用的方式完成相應功能的,具體的工作是由sys_fork負責實施。其實無論是不是Unix或者Linux,對於任何操作系統來說,創建一個新的進程都是屬於核心功能,因為它要做很多底層細致地工作,消耗系統的物理資源,比如分配物理內存,從父進程拷貝相關信息,拷貝設置頁目錄頁表等等,這些顯然不能隨便讓哪個程序就能去做,於是就自然引出特權級別的概念,顯然,最關鍵性的權力必須由高特權級的程序來執行,這樣才可以做到集中管理,減少有限資源的訪問和使用沖突。

特權級顯然是非常有效的管理和控製程序執行的手段,因此在硬體上對特權級做了很多支持,就Intel x86架構的CPU來說一共有0~3四個特權級,0級最高,3級最低,硬體上在執行每條指令時都會對指令所具有的特權級做相應的檢查,相關的概念有 CPL、DPL和RPL,這里不再過多闡述。硬體已經提供了一套特權級使用的相關機制,軟體自然就是好好利用的問題,這屬於操作系統要做的事情,對於 Unix/Linux來說,只使用了0級特權級和3級特權級。也就是說在Unix/Linux系統中,一條工作在級特權級的指令具有了CPU能提供的最高權力,而一條工作在3級特權級的指令具有CPU提供的最低或者說最基本權力。

3)用戶態和內核態

現在我們從特權級的調度來理解用戶態和內核態就比較好理解了,當程序運行在3級特權級上時,就可以稱之為運行在用戶態,因為這是最低特權級,是普通的用戶進程運行的特權級,大部分用戶直接面對的程序都是運行在用戶態;反之,當程序運行在級特權級上時,就可以稱之為運行在內核態。

雖然用戶態下和內核態下工作的程序有很多差別,但最重要的差別就在於特權級的不同,即權力的不同。運行在用戶態下的程序不能直接訪問操作系統內核數據結構和程序,比如上面例子中的testfork()就不能直接調用 sys_fork(),因為前者是工作在用戶態,屬於用戶態程序,而sys_fork()是工作在內核態,屬於內核態程序。

當我們在系統中執行一個程序時,大部分時間是運行在用戶態下的,在其需要操作系統幫助完成某些它沒有權力和能力完成的工作時就會切換到內核態,比如testfork()最初運行在用戶態進程下,當它調用fork()最終觸發 sys_fork()的執行時,就切換到了內核態。

2. 用戶態和內核態的轉換

1)用戶態切換到內核態的3種方式

a. 系統調用

這是用戶態進程主動要求切換到內核態的一種方式,用戶態進程通過系統調用申請使用操作系統提供的服務程序完成工作,比如前例中fork()實際上就是執行了一個創建新進程的系統調用。而系統調用的機制其核心還是使用了操作系統為用戶特別開放的一個中斷來實現,例如Linux的int 80h中斷。

b. 異常

當CPU在執行運行在用戶態下的程序時,發生了某些事先不可知的異常,這時會觸發由當前運行進程切換到處理此異常的內核相關程序中,也就轉到了內核態,比如缺頁異常。

c. 外圍設備的中斷

當外圍設備完成用戶請求的操作後,會向CPU發出相應的中斷信號,這時CPU會暫停執行下一條即將要執行的指令轉而去執行與中斷信號對應的處理程序,如果先前執行的指令是用戶態下的程序,那麼這個轉換的過程自然也就發生了由用戶態到內核態的切換。比如硬碟讀寫操作完成,系統會切換到硬碟讀寫的中斷處理程序中執行後續操作等。

這3種方式是系統在運行時由用戶態轉到內核態的最主要方式,其中系統調用可以認為是用戶進程主動發起的,異常和外圍設備中斷則是被動的。

2)具體的切換操作

從觸發方式上看,可以認為存在前述3種不同的類型,但是從最終實際完成由用戶態到內核態的切換操作上來說,涉及的關鍵步驟是完全一致的,沒有任何區別,都相當於執行了一個中斷響應的過程,因為系統調用實際上最終是中斷機制實現的,而異常和中斷的處理機制基本上也是一致的,關於它們的具體區別這里不再贅述。關於中斷處理機制的細節和步驟這里也不做過多分析,涉及到由用戶態切換到內核態的步驟主要包括:

[1] 從當前進程的描述符中提取其內核棧的ss0及esp0信息。

[2] 使用ss0和esp0指向的內核棧將當前進程的cs,eip,eflags,ss,esp信息保存起來,這個

過程也完成了由用戶棧到內核棧的切換過程,同時保存了被暫停執行的程序的下一

條指令。

[3] 將先前由中斷向量檢索得到的中斷處理程序的cs,eip信息裝入相應的寄存器,開始

執行中斷處理程序,這時就轉到了內核態的程序執行了。

2. linux操作系統中內核態和用戶態的差別在哪兒

操作系統的內核(kernel)的不同,體現在-可執行文件格式的不同(linux用的是標準的ELF格式,我不了解windows採用什麼格式)-系統調用(syscall)不同,系統編程介面不同,導致在兩個操作系統間的程序移植比較困難-靜態、動態鏈接庫機制、格式不同-開發方式不同,linux內核是開放源碼的,而windows是封閉式開發。-等等等等

3. linux中的內核態和用戶態的區別,該如何解決

當一個任務(進程)執行系統調用而陷入內核代碼中執行時,我們就稱進程處於內核運行態(或簡稱為內核態)。此時處理器處於特權級最高的(0級)內核代碼中執行。當進程處於內核態時,執行的內核代碼會使用當前進程的內核棧。每個進程都有自己的內核棧。當進程在執行用戶自己的代碼時,則稱其處於用戶運行態(用戶態)。即此時處理器在特權級最低的(3級)用戶代碼中運行。當正在執行用戶程序而突然被中斷程序中斷時,此時用戶程序也可以象徵性地稱為處於進程的內核態。因為中斷處理程序將使用當前進程的內核棧。這與處於內核態的進程的狀態有些類似。

4. Linux 操作系統的「核態」和"管態"有什麼區別

進程的內核態和
用戶態
有什麼區別??內核態,是系統正運行於操作系統的內核代碼內。用戶態,系統正運行於用戶的應用程序下。總的來說,系統運行在內核態時比運行在用戶態時的要求都要嚴格些,比如,安全,速率,等等。

5. Linux內核態程序和用戶態程序的區別

用戶態與內核態本質區別是cpu當前的cpl是3或者0。內核態程序可以訪問內核空間與用戶空間的數據與代碼,可以執行一些特權指令(in out sti cli...),用戶態程序只能訪問用戶空間的數據與代碼。

6. Linux 內核和 Windows 內核有什麼區別

目錄


一、什麼是內核?


1.1 內核的能力


二、操作系統分層


三、內核是如何工作的?


四、Linux 的設計


4.1 Multitask and SMP(Symmetric multiprocessing)


4.2 ELF(Executable and Linkable Format)


4.3 Monolithic Kernel


4.4 在內核層和在用戶層有什麼區別?


五、Window 設計


六、總結




說到操作系統,就必須說內核。內核是操作系統中應用連接硬體設備的橋梁。



對於一個現代的操作系統來說,它的內核至少應該提供以下 4 種基本能力:




從上面 4 種能力來看操作系統和內核之間的關系,通常可以把操作系統分成 3 層,最底層的 硬體設備抽象 、中間的 內核 和最上層的 應用




內核許可權非常高,它可以管理進程、可以 直接訪問所有的內存 ,因此確實需要和進程之間有一定的隔離。這個隔離用 類似請求/響應 的模型,非常符合常理。



但不同的是在瀏覽器、服務端模型中,瀏覽器和服務端是用 不同的機器在執行 ,因此不需要共享一個 CPU。但是在進程調用內核的過程中,這里是存在資源共享的。


比如,一個機器有 4 個 CPU,不可能讓內核用一個 CPU,其他進程用剩下的 CPU。這樣太浪費資源了。


再比如,進程向內核請求 100M 的內存,內核把 100M 的數據傳回去。 這個模型不可行,因為傳輸太慢了。


所以,這里多數操作系統的設計都遵循一個原則: 進程向內核發起一個請求,然後將 CPU 執行許可權讓出給內核。內核接手 CPU 執行許可權,然後完成請求,再轉讓出 CPU 執行許可權給調用進程。



Linux 操作系統第一版是1991 年林納斯托·瓦茲(一個芬蘭的小夥子,當時 22 歲)用 C 語音寫的。 寫完之後他在網路上發布了 Linux 內核的源代碼。又經過了 3 年的努力,在 1994 年發布了完整的核心 Version 1.0。



MultiTask 指多任務,Linux 是一個多任務的操作系統。多任務就是多個任務可以同時執行,這里的「同時」並不是要求並發,而是在一段時間內可以執行多個任務。當然 Linux 支持並發。


SMP 指對稱多處理。其實是說 Linux 下每個處理器的地位是相等的,內存對多個處理器來說是共享的,每個處理器都可以訪問完整的內存和硬體資源。 這個特點決定了在 Linux 上不會存在一個特定的處理器處理用戶程序或者內核程序,它們可以被分配到任何一個處理器上執行。




這個名詞翻譯過來叫作 可執行文件鏈接格式 。這是一種從 Unix 繼承而來的可執行文件的存儲格式。我們可以看到 ELF 中把文件分成了一個個分段(Segment),每個段都有自己的作用。



這個名詞翻譯過來就是宏內核,宏內核反義詞就是 Microkernel ,微內核的意思。Linux 是宏內核架構,這說明 Linux 的內核是一個完整的可執行程序,且內核用最高許可權來運行。宏內核的特點就是有很多程序會打包在內核中,比如,文件系統、驅動、內存管理等。當然這並不是說,每次安裝驅動都需要重新編譯內核,現在 Linux 也可以動態載入內核模塊。所以哪些模塊在內核層,哪些模塊在用戶層,這是一種系統層的拆分,並不是很強的物理隔離。


與宏內核對應,接下來說說微內核,內核只保留最基本的能力。比如 進程調度、虛擬內存、中斷。多數應用,甚至包括驅動程序、文件系統,是在用戶空間管理 的。




感覺分層其實差不多。 我這里說一個很大的區別,比如說驅動程序是需要頻繁調用底層能力的,如果在內核中,性能肯定會好很多。對於微內核設計,驅動在內核外,驅動和硬體設備交互就需要頻繁做內核態的切換。


當然微內核也有它的好處,比如說微內核體積更小、可移植性更強。不過我認為,隨著計算能力、存儲技術越來越發達, 體積小、安裝快 已經不能算是一個很大的優勢了。現在更重要的是如何有效利用硬體設備的性能。


之所以這么思考,也可能因為我是帶著現代的目光回望當時人們對內核的評判,事實上,當時 Linux 團隊也因此爭論過很長一段時間。 但是我覺得 歷史 往往是螺旋上升的,說不定將來性能發展到了一個新的階段,像微內核的靈活性、可以提供強大的抽象能力這樣的特點,又重新受到人們的重視。


還有一種就是 混合類型內核 。 混合類型的特點就是架構像微內核,內核中會有一個最小版本的內核,其他功能會在這個能力上搭建。但是實現的時候,是用宏內核的方式實現的,就是內核被做成了一個完整的程序,大部分功能都包含在內核中。就是在宏內核之內有抽象出了一個微內核。



Windows 和 Linux 的設計有很大程度的相似性。Windows也有內核,它的內核是 C/C++ 寫的。准確地說,Windows 有兩個內核版本。一個是早期的Windows 9x 內核,早期的 Win95, Win98 都是這個內核。我們今天用的 Windows 7, Windows 10 是另一個內核,叫作 Windows NT。NT 指的是 New Technology。接下來我們討論的都是 NT 版本的內核。


下面我找到一張 Windows 內核架構的圖片給你一個直觀感受。



Windows 同樣支持 Multitask 和 SMP(對稱多處理)。Windows 的內核設計屬於混合類型。你可以看到內核中有一個 Microkernel 模塊。而整個內核實現又像宏內核一樣,含有的能力非常多,是一個完整的整體。


Windows 下也有自己的可執行文件格式,這個格式叫作 Portable Executable(PE),也就是可移植執行文件,擴展名通常是.exe、.dll、.sys等。


PE 文件的結構和 ELF 結構有很多相通的地方,我找到了一張圖片幫助你更直觀地理解。



Windows 還有很多獨特的能力,比如 Hyper-V 虛擬化技術.



這一講我們學習了內核的基礎知識,包括內核的作用、整體架構以及 3 種內核類型( 宏內核、微內核和混合類型內核 )。


內核很小(微內核)方便移植,因為體積小、安裝快;內核大(宏內核),方便優化性能,畢竟內核更了解計算機中的資源。


Linux 內核和 Windows 內核有什麼區別?


【解析】 Windows 有兩個內核,最新的是 NT 內核,目前主流的 Windows 產品都是 NT 內核。NT 內核和 Linux 內核非常相似,沒有太大的結構化差異。


從整體設計上來看, Linux 是宏內核 NT 內核屬於混合型內核 。和微內核不同,宏內核和混合類型內核從實現上來看是一個完整的程序。只不過混合類型內核內部也抽象出了微內核的概念,從內核內部看混合型內核的架構更像微內核。


另外 NT 內核和 Linux 內核還存在著許多其他的差異,比如:




7. 如何讓linux的一段程序代碼進入內核態運行

需要讓linux的一段程序代碼進入內核態運行產生的方式有二:

  1. 被動式

  2. 主動式

所謂被動式就是產生中斷或者代碼產出異常,代碼不得不從用戶態進入內核態進行中斷操作或者是異常處理;

而主動式則是系統響應了程序對系統的一次調用過程,並且系統允許該運行級別的提升;

8. Linux內核態程序和用戶態程序的區別

操作系統的內核(kernel)的不同,體現在-可執行文件格式的不同(linux用的是標準的ELF格式,我不了解windows採用什麼格式)-
系統調用
(syscall)不同,
系統編程
介面不同,導致在兩個操作系統間的程序移植比較困難-靜態、
動態鏈接庫
機制、格式不同...

9. linux進程處於內核態會被更高優先順序搶占嗎

內核態搶占(Kernel
Preemption)
在2.6
kernel以前,kernelcode(中斷和系統調用屬於kernel
code)會一直運行,直到code被完成或者被阻塞(系統調用可以被阻塞)。在
2.6kernel里,Linuxkernel變成可搶占式。當從中斷處理常式返回到內核態(kernel-space)時,kernel會檢查是否可以搶占和是否需要重新調度。kernel可以在任何時間點上搶佔一個任務(因為中斷可以發生在任何時間點上),只要在這個時間點上kernel的狀態是安全的、可重新調度的。

10. Linux - 用戶態內存映射 和 內核態內存映射

操作系統的內存管理,主要分為三個方面。
第一,物理內存的管理,相當於會議室管理員管理會議室。
第二,虛擬地址的管理,也即在項目組的視角,會議室的虛擬地址應該如何組織。
第三,虛擬地址和物理地址如何映射,也即會議室管理員如果管理映射表。

那麼虛擬地址和物理地址如何映射呢?

每一個進程都有一個列表vm_area_struct,指向虛擬地址空間的不同的內存塊,這個變數的名字叫mmap。

其實內存映射不僅僅是物理內存和虛擬內存之間的映射,還包括將文件中的內容映射到虛擬內存空間。這個時候,訪問內存空間就能夠訪問到文件裡面的數據。而僅有物理內存和虛擬內存的映射,是一種特殊情況。

如果我們要申請小塊內存,就用brk。brk函數之前已經解析過了,這里就不多說了。如果申請一大塊內存,就要用mmap。對於堆的申請來講,mmap是映射內存空間到物理內存。

另外,如果一個進程想映射一個文件到自己的虛擬內存空間,也要通過mmap系統調用。這個時候mmap是映射內存空間到物理內存再到文件。可見mmap這個系統調用是核心,我們現在來看mmap這個系統調用。

用戶態的內存映射機制包含以下幾個部分。

物理內存根據NUMA架構分節點。每個節點裡面再分區域。每個區域裡面再分頁。

物理頁面通過夥伴系統進行分配。分配的物理頁面要變成虛擬地址讓上層可以訪問,kswapd可以根據物理頁面的使用情況對頁面進行換入換出。

對於內存的分配需求,可能來自內核態,也可能來自用戶態。

對於內核態,kmalloc在分配大內存的時候,以及vmalloc分配不連續物理頁的時候,直接使用夥伴系統,分配後轉換為虛擬地址,訪問的時候需要通過內核頁表進行映射。

對於kmem_cache以及kmalloc分配小內存,則使用slub分配器,將夥伴系統分配出來的大塊內存切成一小塊一小塊進行分配。

kmem_cache和kmalloc的部分不會被換出,因為用這兩個函數分配的內存多用於保持內核關鍵的數據結構。內核態中vmalloc分配的部分會被換出,因而當訪問的時候,發現不在,就會調用do_page_fault。

對於用戶態的內存分配,或者直接調用mmap系統調用分配,或者調用malloc。調用malloc的時候,如果分配小的內存,就用sys_brk系統調用;如果分配大的內存,還是用sys_mmap系統調用。正常情況下,用戶態的內存都是可以換出的,因而一旦發現內存中不存在,就會調用do_page_fault。

熱點內容
方舟怎麼用自己的存檔進入別人的伺服器 發布:2025-05-14 16:46:25 瀏覽:876
微博視頻高清上傳設置 發布:2025-05-14 16:38:41 瀏覽:548
資料庫圖書管理設計 發布:2025-05-14 16:33:52 瀏覽:378
php開發的網頁 發布:2025-05-14 16:22:03 瀏覽:477
伺服器內存跑滿了怎麼回事 發布:2025-05-14 16:21:16 瀏覽:224
微信qq音樂緩存 發布:2025-05-14 16:16:16 瀏覽:469
c語言回收內存 發布:2025-05-14 16:16:08 瀏覽:144
2021國產安卓頂級旗艦買哪個 發布:2025-05-14 16:15:36 瀏覽:300
linux自學視頻 發布:2025-05-14 16:14:49 瀏覽:256
我的世界伺服器崩了重啟 發布:2025-05-14 16:09:37 瀏覽:45