LINUX内核经典面试题
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
1) Linux中主要有哪幾種內(nèi)核鎖? 2) Linux中的用戶模式和內(nèi)核模式是什么含意? 3) 怎樣申請(qǐng)大塊內(nèi)核內(nèi)存? 4) 用戶進(jìn)程間通信主要哪幾種方式?5) 通過(guò)伙伴系統(tǒng)申請(qǐng)內(nèi)核內(nèi)存的函數(shù)有哪些?
6) 通過(guò)slab分配器申請(qǐng)內(nèi)核內(nèi)存的函數(shù)有?
7) Linux的內(nèi)核空間和用戶空間是如何劃分的(以32位系統(tǒng)為例)?
8) vmalloc()申請(qǐng)的內(nèi)存有什么特點(diǎn)?
9) 用戶程序使用malloc()申請(qǐng)到的內(nèi)存空間在什么范圍?
10) 在支持并使能MMU的系統(tǒng)中,Linux內(nèi)核和用戶程序分別運(yùn)行在物理地址模式還是虛擬地址模式?
11) ARM處理器是通過(guò)幾級(jí)也表進(jìn)行存儲(chǔ)空間映射的?
12) Linux是通過(guò)什么組件來(lái)實(shí)現(xiàn)支持多種文件系通的?
13) Linux虛擬文件系統(tǒng)的關(guān)鍵數(shù)據(jù)結(jié)構(gòu)有哪些?(至少寫(xiě)出四個(gè))
14) 對(duì)文件或設(shè)備的操作函數(shù)保存在那個(gè)數(shù)據(jù)結(jié)構(gòu)中?
15) Linux中的文件包括哪些?
16) 創(chuàng)建進(jìn)程的系統(tǒng)調(diào)用有那些?
17) 調(diào)用schedule()進(jìn)行進(jìn)程切換的方式有幾種?
18) Linux調(diào)度程序是根據(jù)進(jìn)程的動(dòng)態(tài)優(yōu)先級(jí)還是靜態(tài)優(yōu)先級(jí)來(lái)調(diào)度進(jìn)程的?
19) 進(jìn)程調(diào)度的核心數(shù)據(jù)結(jié)構(gòu)是哪個(gè)?
20) 如何加載、卸載一個(gè)模塊?
21) 模塊和應(yīng)用程序分別運(yùn)行在什么空間?
22) Linux中的浮點(diǎn)運(yùn)算由應(yīng)用程序?qū)崿F(xiàn)還是內(nèi)核實(shí)現(xiàn)?
23) 模塊程序能否使用可鏈接的庫(kù)函數(shù)?
24) TLB中緩存的是什么內(nèi)容?
25) Linux中有哪幾種設(shè)備?
26) 字符設(shè)備驅(qū)動(dòng)程序的關(guān)鍵數(shù)據(jù)結(jié)構(gòu)是哪個(gè)?
27) 設(shè)備驅(qū)動(dòng)程序包括哪些功能函數(shù)?
28) 如何唯一標(biāo)識(shí)一個(gè)設(shè)備?
29) Linux通過(guò)什么方式實(shí)現(xiàn)系統(tǒng)調(diào)用?
30) Linux軟中斷和工作隊(duì)列的作用是什么?
轉(zhuǎn)載于http://blog.chinaunix.net/u3/118354/showart_2311237.html
1.?????Linux中主要有哪幾種內(nèi)核鎖?
Linux的同步機(jī)制從2.0到2.6以來(lái)不斷發(fā)展完善。從最初的原子操作,到后來(lái)的信號(hào)量,從大內(nèi)核鎖到今天的自旋鎖。這些同步機(jī)制的發(fā)展伴隨Linux從單處理器到對(duì)稱多處理器的過(guò)渡;
伴隨著從非搶占內(nèi)核到搶占內(nèi)核的過(guò)度。Linux的鎖機(jī)制越來(lái)越有效,也越來(lái)越復(fù)雜。
Linux的內(nèi)核鎖主要是自旋鎖和信號(hào)量。
自旋鎖最多只能被一個(gè)可執(zhí)行線程持有,如果一個(gè)執(zhí)行線程試圖請(qǐng)求一個(gè)已被爭(zhēng)用(已經(jīng)被持有)的自旋鎖,那么這個(gè)線程就會(huì)一直進(jìn)行忙循環(huán)——旋轉(zhuǎn)——等待鎖重新可用。要是鎖未被爭(zhēng)用,請(qǐng)求它的執(zhí)行線程便能立刻得到它并且繼續(xù)進(jìn)行。自旋鎖可以在任何時(shí)刻防止多于一個(gè)的執(zhí)行線程同時(shí)進(jìn)入臨界區(qū)。
Linux中的信號(hào)量是一種睡眠鎖。如果有一個(gè)任務(wù)試圖獲得一個(gè)已被持有的信號(hào)量時(shí),信號(hào)量會(huì)將其推入等待隊(duì)列,然后讓其睡眠。這時(shí)處理器獲得自由去執(zhí)行其它代碼。當(dāng)持有信號(hào)量的進(jìn)程將信號(hào)量釋放后,在等待隊(duì)列中的一個(gè)任務(wù)將被喚醒,從而便可以獲得這個(gè)信號(hào)量。
信號(hào)量的睡眠特性,使得信號(hào)量適用于鎖會(huì)被長(zhǎng)時(shí)間持有的情況;只能在進(jìn)程上下文中使用,因?yàn)橹袛嗌舷挛闹惺遣荒鼙徽{(diào)度的;另外當(dāng)代碼持有信號(hào)量時(shí),不可以再持有自旋鎖。
Linux?內(nèi)核中的同步機(jī)制:原子操作、信號(hào)量、讀寫(xiě)信號(hào)量和自旋鎖的API,另外一些同步機(jī)制,包括大內(nèi)核鎖、讀寫(xiě)鎖、大讀者鎖、RCU?(Read-Copy Update,顧名思義就是讀-拷貝修改),和順序鎖。
2.?????Linux中的用戶模式和內(nèi)核模式是什么含意?
MS-DOS等操作系統(tǒng)在單一的CPU模式下運(yùn)行,但是一些類Unix的操作系統(tǒng)則使用了雙模式,可以有效地實(shí)現(xiàn)時(shí)間共享。在Linux機(jī)器上,CPU要么處于受信任的內(nèi)核模式,要么處于受限制的用戶模式。除了內(nèi)核本身處于內(nèi)核模式以外,所有的用戶進(jìn)程都運(yùn)行在用戶模式之中。
內(nèi)核模式的代碼可以無(wú)限制地訪問(wèn)所有處理器指令集以及全部?jī)?nèi)存和I/O空間。如果用戶模式的進(jìn)程要享有此特權(quán),它必須通過(guò)系統(tǒng)調(diào)用向設(shè)備驅(qū)動(dòng)程序或其他內(nèi)核模式的代碼發(fā)出請(qǐng)求。另外,用戶模式的代碼允許發(fā)生缺頁(yè),而內(nèi)核模式的代碼則不允許。
在2.4和更早的內(nèi)核中,僅僅用戶模式的進(jìn)程可以被上下文切換出局,由其他進(jìn)程搶占。除非發(fā)生以下兩種情況,否則內(nèi)核模式代碼可以一直獨(dú)占CPU:
(1)?它自愿放棄CPU;
(2)?發(fā)生中斷或異常。
2.6內(nèi)核引入了內(nèi)核搶占,大多數(shù)內(nèi)核模式的代碼也可以被搶占。
3.?????怎樣申請(qǐng)大塊內(nèi)核內(nèi)存?
在Linux內(nèi)核環(huán)境下,申請(qǐng)大塊內(nèi)存的成功率隨著系統(tǒng)運(yùn)行時(shí)間的增加而減少,雖然可以通過(guò)vmalloc系列調(diào)用申請(qǐng)物理不連續(xù)但虛擬地址連續(xù)的內(nèi)存,但畢竟其使用效率不高且在32位系統(tǒng)上vmalloc的內(nèi)存地址空間有限。所以,一般的建議是在系統(tǒng)啟動(dòng)階段申請(qǐng)大塊內(nèi)存,但是其成功的概率也只是比較高而已,而不是100%。如果程序真的比較在意這個(gè)申請(qǐng)的成功與否,只能退用“啟動(dòng)內(nèi)存”(Boot Memory)。下面就是申請(qǐng)并導(dǎo)出啟動(dòng)內(nèi)存的一段示例代碼:
void*?x_bootmem?=?NULL; |
可見(jiàn)其應(yīng)用還是比較簡(jiǎn)單的,不過(guò)利弊總是共生的,它不可避免也有其自身的限制:
內(nèi)存申請(qǐng)代碼只能連接進(jìn)內(nèi)核,不能在模塊中使用。
被申請(qǐng)的內(nèi)存不會(huì)被頁(yè)分配器和slab分配器所使用和統(tǒng)計(jì),也就是說(shuō)它處于系統(tǒng)的可見(jiàn)內(nèi)存之外,即使在將來(lái)的某個(gè)地方你釋放了它。
一般用戶只會(huì)申請(qǐng)一大塊內(nèi)存,如果需要在其上實(shí)現(xiàn)復(fù)雜的內(nèi)存管理則需要自己實(shí)現(xiàn)。
在不允許內(nèi)存分配失敗的場(chǎng)合,通過(guò)啟動(dòng)內(nèi)存預(yù)留內(nèi)存空間將是我們唯一的選擇。
4.???用戶進(jìn)程間通信主要哪幾種方式?
(1)管道(Pipe):管道可用于具有親緣關(guān)系進(jìn)程間的通信,允許一個(gè)進(jìn)程和另一個(gè)與它有共同祖先的進(jìn)程之間進(jìn)行通信。
(2)命名管道(named pipe):命名管道克服了管道沒(méi)有名字的限制,因此,除具有管道所具有的功能外,它還允許無(wú)親緣關(guān)系進(jìn)程間的通信。命名管道在文件系統(tǒng)中有對(duì)應(yīng)的文件名。命名管道通過(guò)命令mkfifo或系統(tǒng)調(diào)用mkfifo來(lái)創(chuàng)建。
(3)信號(hào)(Signal):信號(hào)是比較復(fù)雜的通信方式,用于通知接受進(jìn)程有某種事件發(fā)生,除了用于進(jìn)程間通信外,進(jìn)程還可以發(fā)送信號(hào)給進(jìn)程本身;linux除了支持Unix早期信號(hào)語(yǔ)義函數(shù)sigal外,還支持語(yǔ)義符合Posix.1標(biāo)準(zhǔn)的信號(hào)函數(shù)sigaction(實(shí)際上,該函數(shù)是基于BSD的,BSD為了實(shí)現(xiàn)可靠信號(hào)機(jī)制,又能夠統(tǒng)一對(duì)外接口,用sigaction函數(shù)重新實(shí)現(xiàn)了signal函數(shù))。
(4)消息(Message)隊(duì)列:消息隊(duì)列是消息的鏈接表,包括Posix消息隊(duì)列system V消息隊(duì)列。有足夠權(quán)限的進(jìn)程可以向隊(duì)列中添加消息,被賦予讀權(quán)限的進(jìn)程則可以讀走隊(duì)列中的消息。消息隊(duì)列克服了信號(hào)承載信息量少,管道只能承載無(wú)格式字節(jié)流以及緩沖區(qū)大小受限等缺
(5)共享內(nèi)存:使得多個(gè)進(jìn)程可以訪問(wèn)同一塊內(nèi)存空間,是最快的可用IPC形式。是針對(duì)其他通信機(jī)制運(yùn)行效率較低而設(shè)計(jì)的。往往與其它通信機(jī)制,如信號(hào)量結(jié)合使用,來(lái)達(dá)到進(jìn)程間的同步及互斥。
(6)信號(hào)量(semaphore):主要作為進(jìn)程間以及同一進(jìn)程不同線程之間的同步手段。
(7)套接字(Socket):更為一般的進(jìn)程間通信機(jī)制,可用于不同機(jī)器之間的進(jìn)程間通信。起初是由Unix系統(tǒng)的BSD分支開(kāi)發(fā)出來(lái)的,但現(xiàn)在一般可以移植到其它類Unix系統(tǒng)上:Linux和System V的變種都支持套接字。
5.?????通過(guò)伙伴系統(tǒng)申請(qǐng)內(nèi)核內(nèi)存的函數(shù)有哪些?
在物理頁(yè)面管理上實(shí)現(xiàn)了基于區(qū)的伙伴系統(tǒng)(zone based buddy system)。對(duì)不同區(qū)的內(nèi)存使用單獨(dú)的伙伴系統(tǒng)(buddy system)管理,而且獨(dú)立地監(jiān)控空閑頁(yè)。相應(yīng)接口alloc_pages(gfp_mask, order),_ _get_free_pages(gfp_mask, order)等。
補(bǔ)充知識(shí):
1.原理說(shuō)明
Linux內(nèi)核中采?用了一種同時(shí)適用于32位和64位系統(tǒng)的內(nèi)?存分頁(yè)模型,對(duì)于32位系統(tǒng)來(lái)說(shuō),兩級(jí)頁(yè)表足夠用了,而在x86_64系?統(tǒng)中,用到了四級(jí)頁(yè)表。
*?頁(yè)全局目錄(Page Global Directory)
*?頁(yè)上級(jí)目錄(Page Upper Directory)
*?頁(yè)中間目錄(Page Middle Directory)
*?頁(yè)表(Page Table)
頁(yè)全局目錄包含若干頁(yè)上級(jí)目錄的地址,頁(yè)上級(jí)目錄又依次包含若干頁(yè)中間目錄的地址,而頁(yè)中間目錄又包含若干頁(yè)表的地址,每一個(gè)頁(yè)表項(xiàng)指?向一個(gè)頁(yè)框。Linux中采用4KB大小的?頁(yè)框作為標(biāo)準(zhǔn)的內(nèi)存分配單元。
多級(jí)分頁(yè)目錄結(jié)構(gòu)
1.1.伙伴系統(tǒng)算法
在實(shí)際應(yīng)用中,經(jīng)常需要分配一組連續(xù)的頁(yè)框,而頻繁地申請(qǐng)和釋放不同大小的連續(xù)頁(yè)框,必然導(dǎo)致在已分配頁(yè)框的內(nèi)存塊中分散了許多小塊的?空閑頁(yè)框。這樣,即使這些頁(yè)框是空閑的,其他需要分配連續(xù)頁(yè)框的應(yīng)用也很難得到滿足。
為了避免出現(xiàn)這種情況,Linux內(nèi)核中引入了伙伴系統(tǒng)算法(buddy system)。把所有的空閑頁(yè)框分組為11個(gè)?塊鏈表,每個(gè)塊鏈表分別包含大小為1,2,4,8,16,32,64,128,256,512和1024個(gè)連續(xù)頁(yè)框的頁(yè)框塊。最大可以申請(qǐng)1024個(gè)連?續(xù)頁(yè)框,對(duì)應(yīng)4MB大小的連續(xù)內(nèi)存。每個(gè)頁(yè)框塊的第一個(gè)頁(yè)框的物理地址是該塊大小的整數(shù)倍。
假設(shè)要申請(qǐng)一個(gè)256個(gè)頁(yè)框的塊,先從256個(gè)頁(yè)框的鏈表中查找空閑塊,如果沒(méi)有,就去512個(gè)?頁(yè)框的鏈表中找,找到了則將頁(yè)框塊分為2個(gè)256個(gè)?頁(yè)框的塊,一個(gè)分配給應(yīng)用,另外一個(gè)移到256個(gè)頁(yè)框的鏈表中。如果512個(gè)頁(yè)框的鏈表中仍沒(méi)有空閑塊,繼續(xù)向1024個(gè)頁(yè)?框的鏈表查找,如果仍然沒(méi)有,則返回錯(cuò)誤。
頁(yè)框塊在釋放時(shí),會(huì)主動(dòng)將兩個(gè)連續(xù)的頁(yè)框塊合并為一個(gè)較大的頁(yè)框塊。
1.2.slab分配器
slab分配器源于?Solaris 2.4?的?分配算法,工作于物理內(nèi)存頁(yè)框分配器之上,管理特定大小對(duì)象的緩存,進(jìn)行快速而高效的內(nèi)存分配。
slab分配器為每種使用的內(nèi)核對(duì)象建立單獨(dú)的緩沖區(qū)。Linux?內(nèi)核已經(jīng)采用了伙伴系統(tǒng)管理物理內(nèi)存頁(yè)框,因此?slab分配器直接工作于伙伴系?統(tǒng)之上。每種緩沖區(qū)由多個(gè)?slab?組成,每個(gè)?slab就是一組連續(xù)的物理內(nèi)存頁(yè)框,被劃分成了固定數(shù)目的對(duì)象。根據(jù)對(duì)象大小的不同,缺省情況下一個(gè)?slab?最多可以由?1024個(gè)頁(yè)框構(gòu)成。出于對(duì)齊?等其它方面的要求,slab?中分配給對(duì)象的內(nèi)存可能大于用戶要求的對(duì)象實(shí)際大小,這會(huì)造成一定的?內(nèi)存浪費(fèi)。
2.常用內(nèi)存分配函數(shù)
2.1.__get_free_pages
unsigned long __get_free_pages(gfp_t gfp_mask, unsigned int order)
__get_free_pages函數(shù)是最原始的內(nèi)存分配方式,直接從伙伴系統(tǒng)中獲取原始頁(yè)框,返回值為第一個(gè)頁(yè)框的起始地址。__get_free_pages在實(shí)現(xiàn)上只是封裝了alloc_pages函?數(shù),從代碼分析,alloc_pages函數(shù)會(huì)分配長(zhǎng)度為1<
2.2.kmem_cache_alloc
struct kmem_cache *kmem_cache_create(const char *name, size_t size,
size_t align, unsigned long flags,
void (*ctor)(void*, struct kmem_cache *, unsigned long),
void (*dtor)(void*, struct kmem_cache *, unsigned long))
void *kmem_cache_alloc(struct kmem_cache *c, gfp_t flags)
kmem_cache_create/ kmem_cache_alloc是基于slab分配器的一種內(nèi)存分配方式,適用于反復(fù)分配釋放同一大小內(nèi)存塊的場(chǎng)合。首先用kmem_cache_create創(chuàng)建一個(gè)高速緩存區(qū)域,然后用kmem_cache_alloc從?該高速緩存區(qū)域中獲取新的內(nèi)存塊。kmem_cache_alloc一次能分配的最大內(nèi)存由mm/slab.c文件中的MAX_OBJ_ORDER宏定義,在默認(rèn)的2.6.18內(nèi)核版本中,該宏定義為5,?于是一次最多能申請(qǐng)1<<5 * 4KB也就是128KB的?連續(xù)物理內(nèi)存。分析內(nèi)核源碼發(fā)現(xiàn),kmem_cache_create函數(shù)的size參數(shù)大于128KB時(shí)會(huì)調(diào)用BUG()。測(cè)試結(jié)果驗(yàn)證了分析結(jié)果,用kmem_cache_create分?配超過(guò)128KB的內(nèi)存時(shí)使內(nèi)核崩潰。
2.3.kmalloc
void *kmalloc(size_t size, gfp_t flags)
kmalloc是內(nèi)核中最常用的一種內(nèi)存分配方式,它通過(guò)調(diào)用kmem_cache_alloc函數(shù)來(lái)實(shí)現(xiàn)。kmalloc一次最多能申請(qǐng)的內(nèi)存大小由include/linux/Kmalloc_size.h的?內(nèi)容來(lái)決定,在默認(rèn)的2.6.18內(nèi)核版本中,kmalloc一?次最多能申請(qǐng)大小為131702B也就是128KB字?節(jié)的連續(xù)物理內(nèi)存。測(cè)試結(jié)果表明,如果試圖用kmalloc函數(shù)分配大于128KB的內(nèi)存,編譯不能通過(guò)。
2.4.vmalloc
void *vmalloc(unsigned long size)
前面幾種內(nèi)存分配方式都是物理連續(xù)的,能保證較低的平均訪問(wèn)時(shí)間。但是在某些場(chǎng)合中,對(duì)內(nèi)存區(qū)的請(qǐng)求不是很頻繁,較高的內(nèi)存訪問(wèn)時(shí)間也?可以接受,這是就可以分配一段線性連續(xù),物理不連續(xù)的地址,帶來(lái)的好處是一次可以分配較大塊的內(nèi)存。圖3-1表?示的是vmalloc分配的內(nèi)存使用的地址范圍。vmalloc對(duì)?一次能分配的內(nèi)存大小沒(méi)有明確限制。出于性能考慮,應(yīng)謹(jǐn)慎使用vmalloc函數(shù)。在測(cè)試過(guò)程中,?最大能一次分配1GB的空間。
Linux內(nèi)核部分內(nèi)存分布
2.5.dma_alloc_coherent
void *dma_alloc_coherent(struct device *dev, size_t size,
ma_addr_t *dma_handle, gfp_t gfp)
DMA是一種硬件機(jī)制,允許外圍設(shè)備和主存之間直接傳輸IO數(shù)據(jù),而不需要CPU的參與,使用DMA機(jī)制能大幅提高與設(shè)備通信的?吞吐量。DMA操作中,涉及到CPU高速緩?存和對(duì)應(yīng)的內(nèi)存數(shù)據(jù)一致性的問(wèn)題,必須保證兩者的數(shù)據(jù)一致,在x86_64體系結(jié)構(gòu)中,硬件已經(jīng)很?好的解決了這個(gè)問(wèn)題,dma_alloc_coherent和__get_free_pages函數(shù)實(shí)現(xiàn)差別不大,前者實(shí)際是調(diào)用__alloc_pages函?數(shù)來(lái)分配內(nèi)存,因此一次分配內(nèi)存的大小限制和后者一樣。__get_free_pages分配的內(nèi)?存同樣可以用于DMA操作。測(cè)試結(jié)果證明,dma_alloc_coherent函?數(shù)一次能分配的最大內(nèi)存也為4M。
2.6.ioremap
void * ioremap (unsigned long offset, unsigned long size)
ioremap是一種更直接的內(nèi)存“分配”方式,使用時(shí)直接指定物理起始地址和需要分配內(nèi)存的大小,然后將該段?物理地址映射到內(nèi)核地址空間。ioremap用到的物理地址空間都是事先確定的,和上面的幾種內(nèi)存?分配方式并不太一樣,并不是分配一段新的物理內(nèi)存。ioremap多用于設(shè)備驅(qū)動(dòng),可以讓CPU直接訪問(wèn)外部設(shè)備的IO空間。ioremap能映射的內(nèi)存由原有的物理內(nèi)存空間決定,所以沒(méi)有進(jìn)行測(cè)試。
?
2.7.Boot Memory
如果要分配大量的連續(xù)物理內(nèi)存,上述的分配函數(shù)都不能滿足,就只能用比較特殊的方式,在Linux內(nèi)?核引導(dǎo)階段來(lái)預(yù)留部分內(nèi)存。
2.7.1.在內(nèi)核引導(dǎo)時(shí)分配內(nèi)存
void* alloc_bootmem(unsigned long size)
可以在Linux內(nèi)核引導(dǎo)過(guò)程中繞過(guò)伙伴系統(tǒng)來(lái)分配大塊內(nèi)存。使用方法是在Linux內(nèi)核引導(dǎo)時(shí),調(diào)用mem_init函數(shù)之前?用alloc_bootmem函數(shù)申請(qǐng)指定大小的內(nèi)存。如果需要在其他地方調(diào)用這塊內(nèi)存,可以將alloc_bootmem返回的內(nèi)存首地址通過(guò)EXPORT_SYMBOL導(dǎo)?出,然后就可以使用這塊內(nèi)存了。這種內(nèi)存分配方式的缺點(diǎn)是,申請(qǐng)內(nèi)存的代碼必須在鏈接到內(nèi)核中的代碼里才能使用,因此必須重新編譯內(nèi)核,而且內(nèi)存管理系統(tǒng)?看不到這部分內(nèi)存,需要用戶自行管理。測(cè)試結(jié)果表明,重新編譯內(nèi)核后重啟,能夠訪問(wèn)引導(dǎo)時(shí)分配的內(nèi)存塊。
2.7.2.通過(guò)內(nèi)核引導(dǎo)參數(shù)預(yù)留頂部?jī)?nèi)存
在Linux內(nèi)核引導(dǎo)時(shí),傳入?yún)?shù)“mem=size”保留頂部的內(nèi)存區(qū)間。比如系統(tǒng)有256MB內(nèi)?存,參數(shù)“mem=248M”會(huì)預(yù)留頂部的8MB內(nèi)存,進(jìn)入系統(tǒng)后可以調(diào)用ioremap(0xF800000,0x800000)來(lái)申請(qǐng)這段內(nèi)存。
3.幾種分配函數(shù)的比較
分配原理最大內(nèi)存其他
__get_free_pages直接對(duì)頁(yè)框進(jìn)行操作4MB適用于分配較大量的連續(xù)物理內(nèi)存
kmem_cache_alloc基于slab機(jī)制實(shí)現(xiàn)128KB適合需要頻繁申請(qǐng)釋放相同大小內(nèi)存塊時(shí)使用
kmalloc基于kmem_cache_alloc實(shí)現(xiàn)128KB最常見(jiàn)的分配方式,需要小于頁(yè)框大小的內(nèi)存時(shí)可以使用
vmalloc建立非連續(xù)物理內(nèi)存到虛擬地址的映射物理不連續(xù),適合需要大內(nèi)存,但是對(duì)地址連續(xù)性沒(méi)有要求的場(chǎng)合
dma_alloc_coherent基于__alloc_pages實(shí)現(xiàn)4MB適用于DMA操?作
ioremap實(shí)現(xiàn)已知物理地址到虛擬地址的映射適用于物理地址已知的場(chǎng)合,如設(shè)備驅(qū)動(dòng)
alloc_bootmem在啟動(dòng)kernel時(shí),預(yù)留一段內(nèi)存,內(nèi)核看不見(jiàn)小于物理內(nèi)存大小,內(nèi)存管理要求較高轉(zhuǎn)載于:https://my.oschina.net/zungyiu/blog/55499
與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的LINUX内核经典面试题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: jsp上传下载+SmartUpload插
- 下一篇: linux 其他常用命令