linux內核空間
❶ linux用戶空間內存分配原則
在用戶空間中動態申請內存的函數為malloc (),這個函數在各種操作系統上的使用都是一致的,malloc ()申請的內存的釋放函數為free()。對於Linux而言,C庫的malloc ()函數一般通過brk ()和mmap ()兩個系統調用從內核申請內存。由於用戶空間C庫的malloc演算法實際上具備一個二次管理能力,所以並不是每次申請和釋放內存都一定伴隨著對內核的系統調用。如,應用程序可以從內核拿到內存後,立即調用free(),由於free()之前調用了mallopt(M_TRIM_THRESHOLD,一1)和mallopt (M_MMAP_MAX,0),這個free ()並不會把內存還給內核,而只是還給了C庫的分配演算法(內存仍然屬於這個進程),因此之後所有的動態內存申請和釋放都在用戶態下進行。另外,Linux內核總是採用按需調頁(Demand Paging),因此當malloc ()返回的時候,雖然是成功返回,但是內核並沒有真正給這個進程內存,這個時候如果去讀申請的內存,內容全部是0,這個頁面的映射是只讀的。只有當寫到某個頁面的時候,內核才在頁錯誤後,真正把這個頁面給這個進程。在Linux內核空間中申請內存涉及的函數主要包括kmalloc( ) 、get free pages ( )和vmalloc ()等。kmalloc ()和_get_free pages ()(及其類似函數)申請的內存位於DMA和常規區域的映射區,而且在物理上也是連續的,它們與真實的物理地址只有一個固定的偏移,因此存在較簡單的轉換關系。而vmalloc()在虛擬內存空間給出一塊連續的內存區,實質上,這片連續的虛擬內存在物理內存中並不一定連續,而vmalloc ()申請的虛擬內存和物理內存之間也沒有簡單的換算關系。
❷ Linux內核空間都有什麼
linux內核是相對於用戶空間來說的,用戶空間即是應用程序運行的空間,這是一個抽象的概念,舉個例子,用戶是沒辦法直接操作計算機硬體的,比如你寫一個hello world的程序,最後在顯示器上列印出來,具體的過程是這樣的,應用程序執行向內核空間發出申請,通過系統調用這個通道把要列印的消息告訴給內核,內核空間調度顯示器列印hello,這期間涉及到進程調度,可能同一時間有多個應用程序要調用顯示器,內核還有內存管理,硬體管理等各種功能。
❸ Linux內核有多大,不同Linux版本內核有什麼差別呢
根據版本的不同,內核大小也不同,新版本為幾百M。
1、發行版的不同,主要是對於版本的選擇,穩定性的測試,還有錯誤修正補丁都會讓每個發行版有自己特殊的內核。
2、官方內核的不同,這個區別很好說,官方的開發是基於 git 版本控制的,去看兩個 git 版本就知道了。一般是硬體支持,還有新的功能演算法,還有驅動增減,錯誤修補什麼的。
Linux的內核版本編號有點像如下的樣子:
2.6.32-642.el6.x86_64
主版本.次版本。發布版本-修改版本。
雖然編號就是如上的方式來編寫,不過依據Linux內核的發展歷程,內核版本的定義有點不太相同。
奇數、偶數版本分類:
在2.6x版本以前,托瓦斯將內核的發展方向分為兩類,並根據這兩類內核的發展分別給予不同的內核編號,那就是:
主、次版本為奇數:開發中版本。
如2.5.xx,這種內核版本主要用於測試與發展新功能,所以通常這種版本僅有內核開發工程師會使用。如果有新增的內核程序代碼,會加到這種版本當中,等到很多工程師測試沒問題後,才加入下一版本的穩定內核中;
主、次版本為偶數:穩定版本。
如2.6.xx,等到內核功能發展成熟後會加到這類版本中,主要用在一般家庭計算機以及企業版本中,重點在於提供一個用戶相對穩定的Linux操作環境平台。
至於發布版本則是在主、次版本架構不變的情況下,新增的功能累積到一定程度後新發布的內核版本。而由於Linux 的內核是使用CPL的授權,因此大家都能夠進行內核程序代碼的修改。
因此,如果有針對一個版本的內核修改過的部分程序代碼,那麼這個被修改過的新內核版本就可以加上所謂的修改版本。
Linux內核版本與Linux發行版本。
Linux內核版本與發行版本的版本並不相同,因為所謂的Linux版本指的應該是內核版本,而目前最新的內核版本應該是4.7.2(2016/08)才對,並不會有7.x的版本出現。
(3)linux內核空間擴展閱讀:
Linux內核的任務:
1、從技術層面講,內核是硬體與軟體之間的一個中間層。作用是將應用層序的請求傳遞給硬體,並充當底層驅動程序,對系統中的各種設備和組件進行定址。
2、從應用程序的層面講,應用程序與硬體沒有聯系,只與內核有聯系,內核是應用程序知道的層次中的最底層。在實際工作中內核抽象了相關細節。
3、內核是一個資源管理程序。負責將可用的共享資源(CPU時間、磁碟空間、網路連接等)分配得到各個系統進程。
4、內核就像一個庫,提供了一組面向系統的命令。系統調用對於應用程序來說,就像調用普通函數一樣。
❹ Linux內核中如何申請和釋放內存
申請內存:
void *kmalloc(size_t size, int flags)
kmalloc函數和malloc函數相似,它有兩個參數,一個參數是size,即申請內存塊的大小,這個參數比較簡單,就像malloc中的參數一樣。第二個參數是一個標志,在裡面可以指定優先權之類的信息。在Linux中,有以下的一些優先權:
GFP_KERNEL,它的意思是該內存分配是由運行在內核模式的進程調用的,即當內存低於min_free_pages的時候可以讓該進程進入睡眠;
GFP_ATOMIC,原子性的內存分配允許在實際內存低於min_free_pages時繼續分配內存給進程。
GFP_DMA:此標志位需要和GFP_KERNEL、GFP_ATOMIC等一起使用,用來申請用於直接內存訪問的內存頁。
釋放:
Kfree(const void *objp) const void *objp=為需要釋放的內存空間指針
❺ linux內核與內核空間的關系
簡單理解為:內核空間是內核使用,用戶空間是應用程序使用;除非編譯內核要考慮內核空間,其餘情況都可以按照用戶空間處理
❻ 什麼是linux內核
Linux是由Linus Torvalds開發的類UNIX的操作系統,Linux主要特點是開源的,因此我們可以免費使用來當做伺服器。
Linux嚴格分為兩個含義。
1.廣泛的Linux是指Linux發行版
2.狹義的Linux是指Linux內核
Linux內核是操作系統的基礎,介於硬體和軟體之間,並且內核位於操作系統中,操作系統將在硬體和軟體之間進行調解,Linux內核是操作系統核心部分的功能。
二:內核的基本性能
1.流程管理
在Linux內核中,程序的執行狀態以進程為單位進行管理。此外,內核為每個進程准備一個名為task_stract結構的數據結構。
2.進程調度程序
可執行狀態等待哪個進程以哪個順序執行,由於基本上不可能運行比CPU數量更多的進程,因此運行過程的效率非常重要。
3.內存管理
在Linux內核中,使用物理內存和虛擬內存管理數據。通過分配對應於物理存儲器的虛擬地址,而不是實際為每個進程分配物理存儲器地址,可以使用容量遠大於實際物理存儲器容量的存儲器。它使它成為可能。此外,由於每個進程都分配了自己的虛擬地址,因此每個進程的內存空間是獨立的,並且不會違反其他進程的內存。
3.文件系統
它以文件的形式提供存儲數據的訪問方法。所有數據都以文件的形式進行管理。/ Directory(根目錄)作為頂點,內核本身作為文件和目錄的集合存在。
❼ Linux的內核空間和用戶空間是如何劃分的(以32位系統為例)
通常32位Linux內核地址空間劃分0~3G為用戶空間,3~4G為內核空間。地址分配如下圖所示
直接映射區:線性空間中從3G開始最大896M的區間,為直接內存映射區,該區域的線性地址和物理地址存在線性轉換關系:線性地址=3G+物理地址。
動態內存映射區:該區域由內核函數vmalloc來分配,特點是:線性空間連續,但是對應的物理空間不一定連續。vmalloc分配的線性地址所對應的物理頁可能處於低端內存,也可能處於高端內存。
永久內存映射區:該區域可訪問高端內存。訪問方法是使用alloc_page(_GFP_HIGHMEM)分配高端內存頁或者使用kmap函數將分配到的高端內存映射到該區域。
固定映射區:該區域和4G的頂端只有4k的隔離帶,其每個地址項都服務於特定的用途,如ACPI_BASE等。
❽ linux為什麼一定要把內核空間劃分到高1G
Linux虛擬內存的大小為2^32(在32位的x86機器上),內核將這4G位元組的空間分為兩部分。最高的1G位元組(從虛地址
0xC0000000到0xFFFFFFFF)供內核使用,稱為「內核空間」。而較低的3G位元組(從虛地址0x00000000到
0xBFFFFFFF),供各個進程使用,稱為「用戶空間」。因為每個進程可以通過系統調用進入內核,因此,Linux內核空間由系統內的所有進程共享。
於是,從具體進程的角度來看,每個進程可以擁有4G位元組的虛擬地址空間(也叫虛擬內存).
每個進程有各自的私有用戶空間(0~3G),這個空間對系統中的其他進程是不可見的。最高的1GB內核空間則為所有進程以及內核所共享。另外,進程的「用戶空間」也叫「地址空間」,在後面的敘述中,我們對這兩個術語不再區分。
用戶空間不是進程共享的,而是進程隔離的。每個進程最大都可以有3GB的用戶空間。一個進程對其中一個地址的訪問,與其它進程對於同一地址的訪問絕不沖
突。比如,一個進程從其用戶空間的地址0x1234ABCD處可以讀出整數8,而另外一個進程從其用戶空間的地址0x1234ABCD處可以讀出整數
20,這取決於進程自身的邏輯。
因此Linux對用戶空間與內核空間的劃分起到了一定程度上的沖突避免。
❾ LINUX內核空間與用戶空間分別是什麼意思
關於內核空間和用戶空間,說的是linux驅動程序一般工作在內核空間,但也可以工作在用戶空間。下面將詳細解析,什麼是內核空間,什麼是用戶空間,以及如何判斷他們。
Linux簡化了分段機制,使得虛擬地址與線性地址總是一致,因此,Linux的虛擬地址空間也為0~4G.Linux內核將這4G位元組的空間分為兩部分。將最高的1G位元組(從虛擬地址0xC0000000到0xFFFFFFFF),供內核使用,稱為"內核空間".而將較低的3G位元組(從虛擬地址 0x00000000到0xBFFFFFFF),供各個進程使用,稱為"用戶空間)。因為每個進程可以通過系統調用進入內核,因此,Linux內核由系統內的所有進程共享。於是,從具體進程的角度來看,每個進程可以擁有4G位元組的虛擬空間。
Linux使用兩級保護機制:0級供內核使用,3級供用戶程序使用。每個進程有各自的私有用戶空間(0~3G),這個空間對系統中的其他進程是不可見的。最高的1GB位元組虛擬內核空間則為所有進程以及內核所共享。
內核空間中存放的是內核代碼和數據,而進程的用戶空間中存放的是用戶程序的代碼和數據。不管是內核空間還是用戶空間,它們都處於虛擬空間中。
❿ Linux內核空間內存動態申請
在Linux內核空間中申請內存涉及的函數主要包括kmalloc () 、_get_free _pages ()和vmalloc(等。kmalloc()和_get_free pages ()(及其類似函數)申請的內存位於DMA和常規區域的映射區,而且在物理上也是連續的,它們與真實的物理地址只有一個固定的偏移,因此存在較簡單的轉換關系。而vmalloc()在虛擬內存空間給出一塊連續的內存區,實質上,這片連續的虛擬內存在物理內存中並不一定連續,而vmalloc ()申請的虛擬內存和物理內存之間也沒有簡單的換算關系。
1.kmalloc ( )
給kmalloc() 的第一個參數是要分配的塊的大小;第二個參數為分配標志,用於控制kmalloc ()的行為。最常用的分配標志是GFP_KERNEL,其含義是在內核空間的進程中申請內存。kmalloc ()的底層依賴於_get_free pages ()來實現,分配標志的前綴GFP正好是這個底層函數的縮寫。使用GFP_KERNEL標志申請內存時,若暫時不能滿足,則進程會睡眠等待頁,即會引起阻塞,因此不能在中斷上下文或持有自旋鎖的時候使用GFP_KERNE申請內存。由於在中斷處理函數、tasklet和內核定時器等非進程上下文中不能阻塞,所以此時驅動應當使用GFP_ATOMIC標志來申請內存。當使用GFP_ATOMIC標志申請內存時,若不存在空閑頁,則不等待,直接返回。
其他的申請標志還包括GFP_USER(用來為用戶空間頁分配內存,可能阻塞)、GFP_HIGHUSER(類似GFP_USER,但是它從高端內存分配)、GFP_DMA(從DMA區域分配內存)、GFP_NOIO(不允許任何IO初始化)、GFP_NOFS(不允許進行任何文件系統調用)、__GFP_ HIGHMEM(指示分配的內存可以位於高端內存)、__(GFP COLD(請求一個較長時間不訪問的頁)、_GFP_NOWARN(當一個分配無法滿足時,阻止內核發出警告)、_GFP_HIGH(高優先順序請求,允許獲得被內核保留給緊急狀況使用的最後的內存頁)、GFP_REPEAT(分配失敗,則盡力重復嘗試)、_GFP_NOFAIL(標志只許申請成功,不推薦)和__GFPNORETRY(若申請不到,則立即放棄)等。
使用kmalloc()申請的內存應使用kfree()釋放,這個函數的用法和用戶空間的free()類似。
2._get_free_pages ()
_get_free pages ()系列函數/宏本質上是Linux內核最底層用於獲取空閑內存的方法,因為底層的buddy演算法以2n頁為單位管理空閑內存,所以最底層的內存申請總是以2n頁為單位的。
get_free _pages ()系列函數/宏包括get_zeroed _page () 、_get_free_page ()和get_free pages () 。
__get_free_pages(unsigned int flags, unsigned int order) 該函數可分配多個頁並返回分配內存的首地址,分配的頁數為2order,分配的頁也不清零。order允許的最大值是10(即1024頁)或者11(即2048頁),這取決於具體的硬體平台。