
18929371983
時間:2017/5/24 9:17:19
問題描述:linux驅動程序一般工作在內核空間,但也可以工作在用戶空間。下面我們將詳細解析,什么是內核空間,什么是用戶空間,以及如何判斷他們。 Linux簡化了分段機制,使得虛擬地址與線性地址總是一致,因此,Linux的虛擬地址空間也為0~4G.Linux內核將這4G字節(jié)的空間分為兩部分。將最高的1G字節(jié)(從虛擬地址0xC0000000到0xFFFFFFFF),供內核使用,稱為"內核空間".而將較低的3G字節(jié)(從虛擬地址 0x00000000到0xBFFFFFFF),供各個進程使用,稱為"用戶空間)。因為每個進程可以通過系統(tǒng)調用進入內核,因此,Linux內核由系統(tǒng)內的所有進程共享。于是,從具體進程的角度來看,每個進程可以擁有4G字節(jié)的虛擬空間。 Linux使用兩級保護機制:0級供內核使用,3級供用戶程序使用。從圖中可以看出(這里無法表示圖),每個進程有各自的私有用戶空間(0~3G),這個空間對系統(tǒng)中的其他進程是不可見的。最高的1GB字節(jié)虛擬內核空間則為所有進程以及內核所共享。 內核空間中存放的是內核代碼和數(shù)據,而進程的用戶空間中存放的是用戶程序的代碼和數(shù)據。不管是內核空間還是用戶空間,它們都處于虛擬空間中。 雖然內核空間占據了每個虛擬空間中的最高1GB字節(jié),但映射到物理內存卻總是從最低地址(0x00000000)開始。對內核空間來說,其地址映射是很簡單的線性映射,0xC0000000就是物理地址與線性地址之間的位移量,在Linux代碼中就叫做PAGE_OFFSET. 內核空間和用戶空間之間如何進行通訊? 內核空間和用戶空間一般通過系統(tǒng)調用進行通信。 如何判斷一個驅動是用戶模式驅動還是內核模式驅動? 判斷的標準是什么? 用戶空間模式的驅動一般通過系統(tǒng)調用來完成對硬件的訪問,如通過系統(tǒng)調用將驅動的io空間映射到用戶空間等。因此,主要的判斷依據就是系統(tǒng)調用。 內核空間和用戶空間上不同太多了,說不完,比如用戶態(tài)的鏈表和內核鏈表不一樣;用戶態(tài)用printf,內核態(tài)用printk;用戶態(tài)每個應用程序空間是虛擬的,相對獨立的,內核態(tài)中卻不是獨立的,所以編程要非常小心。等等。 還有用戶態(tài)和內核態(tài)程序通訊的方法很多,不單單是系統(tǒng)調用,實際上系統(tǒng)調用是個不好的選擇,因為需要系統(tǒng)調用號,這個需要統(tǒng)一分配。 可以通過ioctl、sysfs、proc等來完成。 在進行設備驅動程序,內核功能模塊等系統(tǒng)級開發(fā)時,通常需要在內核和用戶程序之間交換信息。Linux提供了多種方法可以用來完成這些任務。本文總結了各種常用的信息交換方法,并用簡單的例子演示這些方法各自的特點及用法。其中有大家非常熟悉的方法,也有特殊條件下方可使用的手段。通過對比明確這些方法,可以加深我們對Linux內核的認識,更重要的是,可以讓我們更熟練駕御linux內核級的應用開發(fā)技術。 內核空間(kernel-space) VS 用戶空間(user-space) 作為一個Linux開發(fā)者,首先應該清楚內核空間和用戶空間的區(qū)別。關于這個話題,已經有很多相關資料,我們在這里簡單描述如下: 現(xiàn)代的計算機體系結構中存儲管理通常都包含保護機制。提供保護的目的,是要避免系統(tǒng)中的一個任務訪問屬于另外的或屬于操作系統(tǒng)的存儲區(qū)域。如在IntelX86體系中,就提供了特權級這種保護機制,通過特權級別的區(qū)別來限制對存儲區(qū)域的訪問。 基于這種構架,Linux操作系統(tǒng)對自身進行了劃分:一部分核心軟件獨立于普通應用程序,運行在較高的特權級別上,(Lin......
回答(1).Linux 系統(tǒng) 當前進程使用的內存堆?梢詮膖ask_struct->mm_struct->total_vm中獲得虛擬內存使用總量. . 每個進程都有完全屬于自己的,獨立的,不被干擾的內存空間。此空間,被分成幾個段(Segment),分別是Text, Data, BSS, Heap, Stack。用戶進程內存空間,也是系統(tǒng)內核分配給該進程的VM(虛擬內存),但并不表示這個進程占用了這么多的RAM(物理內存)。這個空間有多大?命令top輸出的VIRT值告訴了我們各個進程內存空間的大。ㄟM程內存空間隨著程序的執(zhí)行會增大或者縮。。你還可以通過/proc//maps,或者pmap –d 了解某個進程內存空間都分布,比如: #cat /proc/1449/maps … 0012e000-002a4000 r-xp 00000000 08:07 3539877 /lib/i386-linux-gnu/libc-2.13.so 002a4000-002a6000 r--p 00176000 08:07 3539877 /lib/i386-linux-gnu/libc-2.13.so 002a6000-002a7000 rw-p 00178000 08:07 3539877 /lib/i386-linux-gnu/libc-2.13.so 002a7000-002aa000 rw-p 00000000 00:00 0 … 08048000-0875b000 r-xp 00000000 08:07 4072287 /usr/local/mysql/libexec/mysqld 0875b000-0875d000 r--p 00712000 08:07 4072287 /usr/local/mysql/libexec/mysqld 0875d000-087aa000 rw-p 00714000 08:07 4072287 /usr/local/mysql/libexec/mysqld … 當前任務的task_struct中有兩個結構,utime和stime分別描述了當前任務在用戶態(tài)和內核態(tài)所消耗的CPU時間,start_time描述了當前任務的起始運行時間,通過單位換算和計算,就可以獲得當前任務的CPU率了! . 參考資料: Windows 獲取進程內存占用大小 .
回答(2).我們知道現(xiàn)在操作系統(tǒng)都是采用虛擬存儲器,那么對32位操作系統(tǒng)而言,它的尋址空間(虛擬存儲空間)為4G(2的32次方)。操心系統(tǒng)的核心是內核,獨立于普通的應用程序,可以訪問受保護的內存空間,也有訪問底層硬件設備的所有權限。為了保證用戶進程不能直接操作內核,保證內核的安全,操心系統(tǒng)將虛擬空間劃分為兩部分,一部分為內核空間,一部分為用戶空間。針對linux操作系統(tǒng)而言,將最高的1G字節(jié)(從虛擬地址0xC0000000到0xFFFFFFFF),供內核使用,稱為內核空間,而將較低的3G字節(jié)(從虛擬地址0x00000000到0xBFFFFFFF),供各個進程使用,稱為用戶空間。每個進程可以通過系統(tǒng)調用進入內核,因此,Linux內核由系統(tǒng)內的所有進程共享。于是,從具體進程的角度來看,每個進程可以擁有4G字節(jié)的虛擬空間 需要注意的細節(jié)問題: (1) 內核空間中存放的是內核代碼和數(shù)據,而進程的用戶空間中存放的是用戶程序的代碼和數(shù)據。不管是內核空間還是用戶空間,它們都處于虛擬空間中。 (2) Linux使用兩級保護機制:0級供內核使用,3級供用戶程序使用。 內核態(tài)與用戶態(tài): (1)當一個任務(進程)執(zhí)行系統(tǒng)調用而陷入內核代碼中執(zhí)行時,稱進程處于內核運行態(tài)(內核態(tài))。此時處理器處于特權級最高的(0級)內核代碼中執(zhí)行。當進程處于內核態(tài)時,執(zhí)行的內核代碼會使用當前進程的內核棧。每個進程都有自己的內核棧。 (2)當進程在執(zhí)行用戶自己的代碼時,則稱其處于用戶運行態(tài)(用戶態(tài))。此時處理器在特權級最低的(3級)用戶代碼中運行。當正在執(zhí)行用戶程序而突然被中斷程序中斷時,此時用戶程序也可以象征性地稱為處于進程的內核態(tài)。因為中斷處理程序將使用當前進程的內核棧。
回答(3).PCB(Process Control Block的縮寫)意思為進程控制塊。進程的靜態(tài)描述由三部分組成PCB、有關程序段和該程序段對其進行操作的數(shù)據結構集。在Unix或類Unix系統(tǒng)中,進程是由進程控制塊,進程執(zhí)行的程序,進程執(zhí)行時所用數(shù)據,進程運行使用的工作區(qū)組成。其中進程控制塊是最重要的一部分。進程控制塊是用來描述進程的當前狀態(tài),本身特性的數(shù)據結構,是進程中組成的最關鍵部分,其中含有描述進程信息和控制信息,是進程的集中特性反映,是操作系統(tǒng)對進程具體進行識別和控制的依據。PCB一般包括:1.程序ID(PID、進程句柄):它是唯一的,一個進程都必須對應一個PID。PID一般是整型數(shù)字2.特征信息:一般分系統(tǒng)進程、用戶進程、或者內核進程等3.進程狀態(tài):運行、就緒、阻塞,表示進程現(xiàn)的運行情況4.優(yōu)先級:表示獲得CPU控制權的優(yōu)先級大小5.通信信息:進程之間的通信關系的反映,由于操作系統(tǒng)會提供通信信道6.現(xiàn)場保護區(qū):保護阻塞的進程用7.資源需求、分配控制信息8.進程實體信息,指明程序路徑和名稱,進程數(shù)據在物理內存還是在交換分區(qū)(分頁)中9.其他信息:工作單位,工作區(qū),文件信息等
回答(4).課本58頁第三段 用戶級和內核級的區(qū)別樓下補充
回答(5).進程控制塊(PCB,Process Control Block),臺灣譯作行程控制表,亦有譯作任務控制表,是操作系統(tǒng)內核中一種數(shù)據結構,主要表示進程狀態(tài)。 雖各實際情況不盡相同,PCB通常記載進程之相關信息,包括: 進程狀態(tài):可以是new、ready、running、waiting或halted等。當新建一個進程時,系統(tǒng)分配資源及PCB給它。而當其完成了特定的任務后,系統(tǒng)收回這個進程所占的資源和取消該進程的PCB就撤消了該進程。程序計數(shù)器:接著要運行的指令地址。CPU寄存器:如累加器、索引寄存器(en:Index register)、堆棧指針以及一般用途寄存器、狀況代碼等,主要用途在于中斷時暫時存儲數(shù)據,以便稍后繼續(xù)利用;其數(shù)量及類因計算機架構有所差異。CPU排班法:優(yōu)先級、排班隊列等指針以及其他參數(shù)。存儲器管理:如標簽頁表(en:Page table)等。會計信息:如CPU與實際時間之使用數(shù)量、時限、帳號、工作或進程號碼。輸入輸出狀態(tài):配置進程使用I/O設備,如磁帶機?傃灾琍CB如其名,內容不脫離各進程相關信息。
回答(6).一般是電源模塊 ,控制模塊, 驅動模塊 ,端口模塊
回答(7).每個進程在內核中都有一個task_struct結構體來維護進程的相關信息,如在Linux內核中稱為進程描述符,在操作系統(tǒng)理論中,稱為PCB。它包含該進程當前打開的所有文件的信息,稱為文件描述符表。在內核中,用files_struct結構體表示,每個表項稱為文件描述符,每個表項都包含一個指向已打開文件的指針。 在用戶程序中,文件描述符指的是文件描述符表的索引(0,1,2,3,·······),用int型變量來保存。
回答(8).簡單理解為:內核空間是內核使用,用戶空間是應用程序使用;除非編譯內核要考慮內核空間,其余情況都可以按照用戶空間處理
PCB打樣 快速電路板制作 線路板加工 印刷電路板制板 PCB打板制作
雙螺母印制板連接器 PCB 焊板90度彎式封裝 航空插座 接插件
![]() |
|||