導航:首頁 > 編程系統 > linux常式用戶訪問內核

linux常式用戶訪問內核

發布時間:2023-09-09 10:52:42

linux中的用戶模式和內核模式是什麼含意

在內核模式下用戶可以訪問所有的內存和硬體資源。
在用戶模式下訪問受到限制,例如用戶訪問了禁區,則用戶進程將被殺死。用戶模式必須通過系統調用或庫函數切換至內核模式後,才允許訪問硬體資源。

② 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信息裝入相應的寄存器,開始

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

③ linux內核與用戶進程通信的方法具體有哪幾種

# 管道( pipe ):管道是一種半雙工的通信方式,數據只能單向流動,而且只能在具有親緣關系的進程間使用。進程的親緣關系通常是指父子進程關系。# 有名管道 (named pipe) : 有名管道也是半雙工的通信方式,但是它允許無親緣關系進程間的通信。
# 信號量( semophore ) : 信號量是一個計數器,可以用來控制多個進程對共享資源的訪問。它常作為一種鎖機制,防止某進程正在訪問共享資源時,其他進程也訪問該資源。因此,主要作為進程間以及同一進程內不同線程之間的同步手段。
# 消息隊列( message queue ) : 消息隊列是由消息的鏈表,存放在內核中並由消息隊列標識符標識。消息隊列克服了信號傳遞信息少、管道只能承載無格式位元組流以及緩沖區大小受限等缺點。
# 信號 ( sinal ) : 信號是一種比較復雜的通信方式,用於通知接收進程某個事件已經發生。
# 共享內存( shared memory ) :共享內存就是映射一段能被其他進程所訪問的內存,這段共享內存由一個進程創建,但多個進程都可以訪問。共享內存是最快的 IPC 方式,它是針對其他進程間通信方式運行效率低而專門設計的。它往往與其他通信機制,如信號兩,配合使用,來實現進程間的同步和通信。
# 套接字( socket ) : 套解口也是一種進程間通信機制,與其他通信機制不同的是,它可用於不同及其間的進程通信。

④ 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。

⑤ Linux系統調用詳解(如何從用戶空間進入內核

其實進程在內核態和用戶態各有一個堆棧。運行在用戶空間時進程使用的是用戶空間中的堆棧,而運行在內核空間時,進程使用的是內核空間中的堆棧。所以說,Linux 中每個進程有兩個棧,分別用於用戶態和內核態。我其實也不是很理解,如果你想更理解的話可以看下這篇文章,上面講的很詳細網頁鏈接希望對你有幫助啊

⑥ linux進程為什麼有用戶棧和內核棧,

linux進程在運行時要調用到系統的功能,這些是靠進程調用系統調用,內核介面實現的,他們具有較高的許可權,所以要分開兩個棧。

⑦ linux 下用戶程序如何引用內核頭文件

編譯的時候要有 -I/xxx/yyy 的方式指定 header 文件位置。

⑧ linux內核:用戶空間和系統空間

x86機構有特權級別模式,和其他模式,特權級別就是可以操作所有的資源。其他模式就不能訪問某些限制的資源,這樣是出於系統安全性的考慮,在操作系統上反應出來,就是分為用戶態和內核態。或者叫內核空間和用戶空間。用戶態的程序不能直接訪問內核空間的資源,包括地址,介面什麼的,比如不能直接操作硬體設備,只有通過系統調用介面,讓內核幫你完成。

⑨ Linux用戶進程內核態執行,內核線程的關系問題

1、幾乎所有的程序都要切換到內核態運行再返回用戶態,用中斷完成回的,因為在內核下答封裝了一些東西,用戶態下只是傳入某些參數後調用內核態下的函數罷了,
2、進程有三態(執行態,就緒態,阻塞態),cpu任何時刻都只有一個進程在執行,so從用戶態切換到內核態時,用戶態下的進程就處於阻塞或就緒態了,至於從用戶態切換到內核態執行哪個函數那就看你在用戶態下執行的是什麼函數了,比如在用戶態下的lseek在內核下就是llseek了,不一樣的。
3、這問題就是linux的內存管理了,這里就得提到三種地址(邏輯地址、線性地址、物理地址),這里我們提到的4G地址是邏輯地址,不是我們實際的物理地址,linux中一個進程用戶佔0-3G對應的內核佔3G-4G部分
說得不是很清楚,這是比較復雜的內容,需要從頭看起,單就這幾個問題是不能搞懂linux的,最好還是系統的學習,不斷的重復

閱讀全文

與linux常式用戶訪問內核相關的資料

熱點內容
什麼是機靈數據 瀏覽:724
ecshop配置文件 瀏覽:116
excel兩個表格怎麼對比相同數據 瀏覽:383
ps4港服文件怎麼弄 瀏覽:560
蘋果6splusnote5s6 瀏覽:426
定向流量30G都包括哪些APP 瀏覽:352
apple和瑤瑤綜藝 瀏覽:351
打開word所在文件夾自動彈出 瀏覽:390
c怎麼編程改名字 瀏覽:146
哪些電視劇app不帶logo的 瀏覽:406
開機後桌面變黑色桌面文件丟失 瀏覽:136
網路電視怎麼用遙控器 瀏覽:953
我的世界json打開失敗 瀏覽:867
易語言56教程視頻 瀏覽:610
linux開機啟動文件 瀏覽:773
給寶寶唱兒歌用什麼app 瀏覽:354
投標文件為什麼要使用cad軟體 瀏覽:522
一季度保險業務數據如何看 瀏覽:398
為什麼行車記錄儀文件大小為0 瀏覽:795
win10筆記本傳輸文件 瀏覽:735

友情鏈接