1. 程式人生 > >經典linux核心面試題及答案

經典linux核心面試題及答案

1) Linux中主要有哪幾種核心鎖?

2) Linux中的使用者模式和核心模式是什麼含意?

3) 怎樣申請大塊核心記憶體?

4) 使用者程序間通訊主要哪幾種方式?

5) 通過夥伴系統申請核心記憶體的函式有哪些?

6) 通過slab分配器申請核心記憶體的函式有?

7) Linux的核心空間和使用者空間是如何劃分的以32位系統為例)?

8) vmalloc()申請的記憶體有什麼特點?

9) 使用者程式使用malloc()申請到的記憶體空間在什麼範圍?

10) 在支援並使能MMU的系統中,Linux核心和使用者程式分別執行在實體地址模式還是虛擬地址模式?

11) ARM處理器是通過幾級也表進行儲存空間對映的?

12) Linux是通過什麼元件來實現支援多種檔案系通的?

13) Linux虛擬檔案系統的關鍵資料結構有哪些?至少寫出四個)

14) 對檔案或裝置的操作函式儲存在那個資料結構中?

15) Linux中的檔案包括哪些?

16) 建立程序的系統呼叫有那些?

17) 呼叫schedule()進行程序切換的方式有幾種?

18) Linux排程程式是根據程序的動態優先順序還是靜態優先順序來排程程序的?

19) 程序排程的核心資料結構是哪個?

20) 如何載入、解除安裝一個模組?

21) 模組和應用程式分別執行在什麼空間?

22) Linux中的浮點運算由應用程式實現還是核心實現?

23) 模組程式能否使用可連結的庫函式?

24) TLB中快取的是什麼內容?

25) Linux中有哪幾種裝置?

26) 字元裝置驅動程式的關鍵資料結構是哪個?

27) 裝置驅動程式包括哪些功能函式?

28) 如何唯一標識一個裝置?

29) Linux通過什麼方式實現系統呼叫?

30) Linux軟中斷和工作佇列的作用是什麼?

1. Linux中主要有哪幾種核心鎖?

Linux的同步機制從2.0到2.6以來不斷髮展完善。從最初的原子操作,到後來的訊號量,從大核心鎖到今天的自旋鎖。這些同步機制的發展伴隨Linux從單處理器到對稱多處理器的過渡;伴隨著從非搶佔核心到搶佔核心的過度。Linux的鎖機制越來越有效,也越來越複雜。

Linux的核心鎖主要是自旋鎖和訊號量。

自旋鎖最多隻能被一個可執行執行緒持有,如果一個執行執行緒試圖請求一個已被爭用已經被持有)的自旋鎖,那麼這個執行緒就會一直進行忙迴圈——旋轉——等待鎖重新可用。要是鎖未被爭用,請求它的執行執行緒便能立刻得到它並且繼續進行。自旋鎖可以在任何時刻防止多於一個的執行執行緒同時進入臨界區。

Linux中的訊號量是一種睡眠鎖。如果有一個任務試圖獲得一個已被持有的訊號量時,訊號量會將其推入等待佇列,然後讓其睡眠。這時處理器獲得自由去執行其它程式碼。當持有訊號量的程序將訊號量釋放後,在等待佇列中的一個任務將被喚醒,從而便可以獲得這個訊號量。

訊號量的睡眠特性,使得訊號量適用於鎖會被長時間持有的情況;只能在程序上下文中使用,因為中斷上下文中是不能被排程的;另外當代碼持有訊號量時,不可以再持有自旋鎖。

Linux 核心中的同步機制:原子操作、訊號量、讀寫訊號量和自旋鎖的API,另外一些同步機制,包括大核心鎖、讀寫鎖、大讀者鎖、RCU (Read-Copy Update,顧名思義就是讀-拷貝修改),和順序鎖。

2. Linux中的使用者模式和核心模式是什麼含意?

MS-DOS等作業系統在單一的CPU模式下執行,但是一些類Unix的作業系統則使用了雙模式,可以有效地實現時間共享。在Linux機器上,CPU要麼處於受信任的核心模式,要麼處於受限制的使用者模式。除了核心本身處於核心模式以外,所有的使用者程序都執行在使用者模式之中。

核心模式的程式碼可以無限制地訪問所有處理器指令集以及全部記憶體和I/O空間。如果使用者模式的程序要享有此特權,它必須通過系統呼叫向裝置驅動程式或其他核心模式的程式碼發出請求。另外,使用者模式的程式碼允許發生缺頁,而核心模式的程式碼則不允許。

在2.4和更早的核心中,僅僅使用者模式的程序可以被上下文切換出局,由其他程序搶佔。除非發生以下兩種情況,否則核心模式程式碼可以一直獨佔CPU:

(1) 它自願放棄CPU;

(2) 發生中斷或異常。

2.6核心引入了核心搶佔,大多數核心模式的程式碼也可以被搶佔。

3. 怎樣申請大塊核心記憶體?

在Linux核心環境下,申請大塊記憶體的成功率隨著系統執行時間的增加而減少,雖然可以通過vmalloc系列呼叫申請物理不連續但虛擬地址連續的記憶體,但畢竟其使用效率不高且在32位系統上vmalloc的記憶體地址空間有限。所以,一般的建議是在系統啟動階段申請大塊記憶體,但是其成功的概率也只是比較高而已,而不是100%。如果程式真的比較在意這個申請的成功與否,只能退用“啟動記憶體”Boot Memory)。下面就是申請並匯出啟動記憶體的一段示例程式碼:

  1. void* x_bootmem = NULL;
  2. EXPORT_SYMBOL(x_bootmem);
  3. unsigned long x_bootmem_size = 0;
  4. EXPORT_SYMBOL(x_bootmem_size);
  5. static int __init x_bootmem_setup(char *str)
  6. {
  7. x_bootmem_size = memparse(str, &str);
  8. x_bootmem = alloc_bootmem(x_bootmem_size);
  9. printk("Reserved %lu bytes from %p for x\n", x_bootmem_size, x_bootmem);
  10. return 1;
  11. }
  12. __setup("x-bootmem=", x_bootmem_setup);

可見其應用還是比較簡單的,不過利弊總是共生的,它不可避免也有其自身的限制:

記憶體申請程式碼只能連線進核心,不能在模組中使用。被申請的記憶體不會被頁分配器和slab分配器所使用和統計,也就是說它處於系統的可見記憶體之外,即使在將來的某個地方你釋放了它。一般使用者只會申請一大塊記憶體,如果需要在其上實現複雜的記憶體管理則需要自己實現。在不允許記憶體分配失敗的場合,通過啟動記憶體預留記憶體空間將是我們唯一的選擇。

4. 使用者程序間通訊主要哪幾種方式?

1)管道Pipe):管道可用於具有親緣關係程序間的通訊,允許一個程序和另一個與它有共同祖先的程序之間進行通訊。

2)命名管道named pipe):命名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關係程序間的通訊。命名管道在檔案系統中有對應的檔名。命名管道通過命令mkfifo或系統呼叫mkfifo來建立。

3)訊號Signal):訊號是比較複雜的通訊方式,用於通知接受程序有某種事件發生,除了用於程序間通訊外,程序還可以傳送訊號給程序本身;linux除了支援Unix早期訊號語義函式sigal外,還支援語義符合Posix.1標準的訊號函式sigaction實際上,該函式是基於BSD的,BSD為了實現可靠訊號機制,又能夠統一對外介面,用sigaction函式重新實現了signal函式)。

4)訊息Message)佇列:訊息佇列是訊息的連結表,包括Posix訊息佇列system V訊息佇列。有足夠許可權的程序可以向佇列中新增訊息,被賦予讀許可權的程序則可以讀走佇列中的訊息。訊息佇列克服了訊號承載資訊量少,管道只能承載無格式位元組流以及緩衝區大小受限等缺

5)共享記憶體:使得多個程序可以訪問同一塊記憶體空間,是最快的可用IPC形式。是針對其他通訊機制執行效率較低而設計的。往往與其它通訊機制,如訊號量結合使用,來達到程序間的同步及互斥。

6)訊號量semaphore):主要作為程序間以及同一程序不同執行緒之間的同步手段。

7)套接字Socket):更為一般的程序間通訊機制,可用於不同機器之間的程序間通訊。起初是由Unix系統的BSD分支開發出來的,但現在一般可以移植到其它類Unix系統上:Linux和System V的變種都支援套接字。

5. 通過夥伴系統申請核心記憶體的函式有哪些?

在物理頁面管理上實現了基於區的夥伴系統zone based buddy system)。對不同區的記憶體使用單獨的夥伴系統(buddy system)管理,而且獨立地監控空閒頁。相應介面alloc_pages(gfp_mask, order),_ _get_free_pages(gfp_mask, order)等。

補充知識:

1.原理說明

Linux核心中採 用了一種同時適用於32位和64位系統的內 存分頁模型,對於32位系統來說,兩級頁表足夠用了,而在x86_64系 統中,用到了四級頁表。

* 頁全域性目錄(Page Global Directory)

* 頁上級目錄(Page Upper Directory)

* 頁中間目錄(Page Middle Directory)

* 頁表(Page Table)

頁全域性目錄包含若干頁上級目錄的地址,頁上級目錄又依次包含若干頁中間目錄的地址,而頁中間目錄又包含若干頁表的地址,每一個頁表項指 向一個頁框。Linux中採用4KB大小的 頁框作為標準的記憶體分配單元。

多級分頁目錄結構

1.1.夥伴系統演算法

在實際應用中,經常需要分配一組連續的頁框,而頻繁地申請和釋放不同大小的連續頁框,必然導致在已分配頁框的記憶體塊中分散了許多小塊的 空閒頁框。這樣,即使這些頁框是空閒的,其他需要分配連續頁框的應用也很難得到滿足。

為了避免出現這種情況,Linux核心中引入了夥伴系統演算法(buddy system)。把所有的空閒頁框分組為11個 塊連結串列,每個塊連結串列分別包含大小為1,2,4,8,16,32,64,128,256,512和1024個連續頁框的頁框塊。最大可以申請1024個連 續頁框,對應4MB大小的連續記憶體。每個頁框塊的第一個頁框的實體地址是該塊大小的整數倍。

假設要申請一個256個頁框的塊,先從256個頁框的連結串列中查詢空閒塊,如果沒有,就去512個 頁框的連結串列中找,找到了則將頁框塊分為2個256個 頁框的塊,一個分配給應用,另外一個移到256個頁框的連結串列中。如果512個頁框的連結串列中仍沒有空閒塊,繼續向1024個頁 框的連結串列查詢,如果仍然沒有,則返回錯誤。

頁框塊在釋放時,會主動將兩個連續的頁框塊合併為一個較大的頁框塊。

1.2.slab分配器

slab分配器源於 Solaris 2.4 的 分配演算法,工作於物理記憶體頁框分配器之上,管理特定大小物件的快取,進行快速而高效的記憶體分配。

slab分配器為每種使用的核心物件建立單獨的緩衝區。Linux 核心已經採用了夥伴系統管理實體記憶體頁框,因此 slab分配器直接工作於夥伴系 統之上。每種緩衝區由多個 slab 組成,每個 slab就是一組連續的實體記憶體頁框,被劃分成了固定數目的物件。根據物件大小的不同,預設情況下一個 slab 最多可以由 1024個頁框構成。出於對齊 等其它方面的要求,slab 中分配給物件的記憶體可能大於使用者要求的物件實際大小,這會造成一定的 記憶體浪費。

2.常用記憶體分配函式

2.1.__get_free_pages

unsigned long __get_free_pages(gfp_t gfp_mask, unsigned int order)

__get_free_pages函式是最原始的記憶體分配方式,直接從夥伴系統中獲取原始頁框,返回值為第一個頁框的起始地址。__get_free_pages在實現上只是封裝了alloc_pages函 數,從程式碼分析,alloc_pages函式會分配長度為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分配器的一種記憶體分配方式,適用於反覆分配釋放同一大小記憶體塊的場合。首先用kmem_cache_create建立一個快取記憶體區域,然後用kmem_cache_alloc從 該快取記憶體區域中獲取新的記憶體塊。kmem_cache_alloc一次能分配的最大記憶體由mm/slab.c檔案中的MAX_OBJ_ORDER巨集定義,在預設的2.6.18核心版本中,該巨集定義為5,於是一次最多能申請1<<5 * 4KB也就是128KB的連續實體記憶體。分析核心原始碼發現,kmem_cache_create函式的size引數大於128KB時會呼叫BUG()。測試結果驗證了分析結果,用kmem_cache_create分配超過128KB的記憶體時使核心崩潰。

2.3.kmalloc

void *kmalloc(size_t size, gfp_t flags)

kmalloc是核心中最常用的一種記憶體分配方式,它通過呼叫kmem_cache_alloc函式來實現。kmalloc一次最多能申請的記憶體大小由include/linux/Kmalloc_size.h的 內容來決定,在預設的2.6.18核心版本中,kmalloc一次最多能申請大小為131702B也就是128KB位元組的連續實體記憶體。測試結果表明,如果試圖用kmalloc函式分配大於128KB的記憶體,編譯不能通過。

2.4.vmalloc

void *vmalloc(unsigned long size)

前面幾種記憶體分配方式都是物理連續的,能保證較低的平均訪問時間。但是在某些場合中,對記憶體區的請求不是很頻繁,較高的記憶體訪問時間也 可以接受,這是就可以分配一段線性連續,物理不連續的地址,帶來的好處是一次可以分配較大塊的記憶體。圖3-1表 示的是vmalloc分配的記憶體使用的地址範圍。vmalloc對 一次能分配的記憶體大小沒有明確限制。出於效能考慮,應謹慎使用vmalloc函式。在測試過程中, 最大能一次分配1GB的空間。

Linux核心部分記憶體分佈

2.5.dma_alloc_coherent

void *dma_alloc_coherent(struct device *dev, size_t size,

ma_addr_t *dma_handle, gfp_t gfp)

DMA是一種硬體機制,允許外圍裝置和主存之間直接傳輸IO資料,而不需要CPU的參與,使用DMA機制能大幅提高與裝置通訊的 吞吐量。DMA操作中,涉及到CPU高速緩 存和對應的記憶體資料一致性的問題,必須保證兩者的資料一致,在x86_64體系結構中,硬體已經很 好的解決了這個問題,dma_alloc_coherent和__get_free_pages函式實現差別不大,前者實際是呼叫__alloc_pages函 數來分配記憶體,因此一次分配記憶體的大小限制和後者一樣。__get_free_pages分配的內 存同樣可以用於DMA操作。測試結果證明,dma_alloc_coherent函 數一次能分配的最大記憶體也為4M。

2.6.ioremap

void * ioremap (unsigned long offset, unsigned long size)

ioremap是一種更直接的記憶體“分配”方式,使用時直接指定物理起始地址和需要分配記憶體的大小,然後將該段 實體地址對映到核心地址空間。ioremap用到的實體地址空間都是事先確定的,和上面的幾種記憶體 分配方式並不太一樣,並不是分配一段新的實體記憶體。ioremap多用於裝置驅動,可以讓CPU直接訪問外部裝置的IO空間。ioremap能對映的記憶體由原有的實體記憶體空間決定,所以沒有進行測試。

2.7.Boot Memory

如果要分配大量的連續實體記憶體,上述的分配函式都不能滿足,就只能用比較特殊的方式,在Linux內 核引導階段來預留部分記憶體。

2.7.1.在核心引導時分配記憶體

void* alloc_bootmem(unsigned long size)

可以在Linux核心引導過程中繞過夥伴系統來分配大塊記憶體。使用方法是在Linux核心引導時,呼叫mem_init函式之前 用alloc_bootmem函式申請指定大小的記憶體。如果需要在其他地方呼叫這塊記憶體,可以將alloc_bootmem返回的記憶體首地址通過EXPORT_SYMBOL導 出,然後就可以使用這塊記憶體了。這種記憶體分配方式的缺點是,申請記憶體的程式碼必須在連結到核心中的程式碼裡才能使用,因此必須重新編譯核心,而且記憶體管理系統 看不到這部分記憶體,需要使用者自行管理。測試結果表明,重新編譯核心後重啟,能夠訪問引導時分配的記憶體塊。

2.7.2.通過核心引導引數預留頂部記憶體

在Linux核心引導時,傳入引數“mem=size”保留頂部的記憶體區間。比如系統有256MB內 存,引數“mem=248M”會預留頂部的8MB記憶體,進入系統後可以呼叫ioremap(0xF800000,0x800000)來申請這段記憶體。

3.幾種分配函式的比較

分配原理最大記憶體其他

__get_free_pages直接對頁框進行操作4MB適用於分配較大量的連續實體記憶體

kmem_cache_alloc基於slab機制實現128KB適合需要頻繁申請釋放相同大小記憶體塊時使用

kmalloc基於kmem_cache_alloc實現128KB最常見的分配方式,需要小於頁框大小的記憶體時可以使用

vmalloc建立非連續實體記憶體到虛擬地址的對映物理不連續,適合需要大記憶體,但是對地址連續性沒有要求的場合

dma_alloc_coherent基於__alloc_pages實現4MB適用於DMA操 作

ioremap實現已知實體地址到虛擬地址的對映適用於實體地址已知的場合,如裝置驅動

alloc_bootmem在啟動kernel時,預留一段記憶體,核心看不見小於實體記憶體大小,記憶體管理要求較高

本文轉自:http://www.bkjia.com/Linuxjc/859164.html

以上30題完整答案:http://www.doc88.com/p-6803246858710.html

相關推薦

經典linux核心試題答案

1) Linux中主要有哪幾種核心鎖? 2) Linux中的使用者模式和核心模式是什麼含意? 3) 怎樣申請大塊核心記憶體? 4) 使用者程序間通訊主要哪幾種方式? 5) 通過夥伴系統申請核心記憶體的函式有哪些? 6) 通過slab分配器申請核心記憶體的函式有?

Linux試題,淺析常見Linux命令試題答案

日誌 ctrl 信息 任務 linux面試 推薦 wap 執行c 一個 對於Linux面試來說如果面試官問到你不會的問題,你就說這個不太熟悉,沒有具體研究過,千萬別不懂裝懂,還扯一堆沒用的話題來掩飾,這樣只會讓面試官反感你。 另外盡可能多的記住原理性的知識,一般面試問的多的

100+經典Java試題答案解析

是什麽 自定義 我們 計數 接口類 同步方法 main err ans 面向對象編程(OOP) Java是一個支持並發、基於類和面向對象的計算機編程語言。下面列出了面向對象軟件開發的優點: 代碼開發模塊化,更易維護和修改。 代碼復用。 增強代碼的可靠性和靈活

Linux必問試題,雲計算試題答案

雲計算×××教育總結了很多雲計算面試題及答案,一起來看一下吧! 1.生產場景如何對linux系統進行合理規劃分區? 分區的根本原則是簡單、易用、方便批量管理。根據服務器角色定位建議如下: ①單機服務器:如8G內存,300G硬盤 分區: /boot 100-200M,swap 16G,內存大小8G*2,/ 80

經典的一套SQL試題答案

SQL SqlServer 數據庫 面試經典的一套SQL面試題及答案

C#經典試題答案

list add 字段 有一個 副本 udp 隔離性 垃圾回收 readonly 字節 1.請你說說.net 中類和結構的區別? 答:結構和類具有大體的語法,但是結構受到的限制比類多。結構不能聲明默認的的構造函數,為結構的副本是編譯器創建和銷毀的,所以不需要默認的構造函數和

JavaSE 異常經典試題答案

什麼是Java中的異常? 異常是在程式執行期間可能發生的錯誤事件,並且會中斷它的正常流程。異常可能來自不同型別的情況,例如使用者輸入的錯誤資料,硬體故障,網路連線故障等。 每當執行java語句時發生任何錯誤,都會建立一個異常物件,然後JRE會嘗試查詢異常處理程式來

115道經典Java試題答案解析,掌握這些還怕面試官不下”跪“

面向物件程式設計(OOP) Java是一個支援併發、基於類和麵向物件的計算機程式語言。下面列出了面向物件軟體開發的優點: 程式碼開發模組化,更易維護和修改。 程式碼複用。 增強程式碼的可靠性和靈活性。 增加程式碼的可理解性。 面向物件程式設計有很多重要的特性,比如

100道Java經典試題答案解析

作用域public,private,protected,以及不寫時的區別 答:區別如下: 作用域 當前類 同一package 子孫類 其他package public √ √ √ √ protected √ √ √ × friendly √ √ ×

2018年UI設計師經典試題答案總結

2018年馬上就要結束了,給大家總結了一些UI設計出現比較多的面試題,很多時候我們有足夠的技術,但是可能就斷送在了面試上,大家如果去面試,可以多瞭解看看以下的這些UI設計師經典面試題及答案,畢竟知己知彼才能更好的發揮自己的特長,提高面試的機率嘛。 1、推動一個專案的時間要多久?舉個例子? 答案:專

2018最新Web前端經典試題答案

javascript:  JavaScript中如何檢測一個變數是一個String型別?請寫出函式實現 typeof(obj) === "string" typeof obj === "string" obj.constructor === String 請用js去除字

J2EE經典試題答案05

 1.MVC的各個部分都有那些技術來實現?如何實現?  答:MVC是Model-View-Controller的簡寫。"Model" 代表的是應用的業務邏輯(通過JavaBean,EJB元件實現), "View" 是應用的表示面(由JSP頁面產生),"Controller

2018年web前端經典試題答案

    javascript: JavaScript中如何檢測一個變數是一個String型別?請寫出函式實現方法1、function isString(obj){ return typeof(obj) === "string"? true: false; //

經典JAVA試題答案

QUESTION NO: 1 publicclass Test1 {     publicstaticvoid changeStr(String str){         str="welcome";     }     publicstaticvoid main(S

微軟的試題答案( 超變態但是很經典)

第一組       1.燒一根不均勻的繩,從頭燒到尾總共需要1個小時。現在有若干條材質相同的繩子,問如何用燒繩的方法來計時一個小時十五分鐘呢?   2.你有一桶果凍,其中有黃色、綠色、紅色三種,閉上眼睛抓取同種顏色的兩個。抓取多少個就可以確定你肯定有兩個同一顏色的果凍?   

100道經典Java試題答案

   面向物件編程(OOP) Java是一個支援併發、基於類和麵向物件的計算機程式語言。下面列出了面向物件軟體開發的優點: 程式碼開發模組化,更易維護和修改。程式碼複用。增強程式碼的可靠性和靈活性。增加程式碼的可理解性。 面向物件程式設計有很多重要的特性,比如:封裝,

轉 10個Linux Shell指令碼的試題答案

首先致上每日問候。Linux的浩瀚無垠,使人總能每次都提交與眾不同的內容。我們“The-Tecmint-Team”的工作是給我們的讀者提供一些獨特的內容,這些內容不僅對他們的職業生涯很有用,同時也讓他們增長知識。在此,我們就嘗試這麼去做,至於能取得多大的成功,就由我們的讀者朋

[引用]SQL經典試題答案

------------------------------------------ 1) select a.部門名稱dname,b.業績yj as '一月份',c.業績yj as '二月份',d.業績yj as '三月份' from table1 a,table2 b,table2 c,table2 d w

10個Linux Shell指令碼的試題答案

首先致上每日問候。Linux的浩瀚無垠,使人總能每次都提交與眾不同的內容。我們“The-Tecmint-Team”的工作是給我們的讀者提供一些獨特的內容,這些內容不僅對他們的職業生涯很有用,同時也讓他們增長知識。在此,我們就嘗試這麼去做,至於能取得多大的成功,就由我們的讀者朋友們來判斷吧。 在此,作

PHP試題答案解析(8)—PHP綜合應用題

java應用程序 外殼 sleep 服務應用程序 解釋 源碼 use lee eve 1.寫出下列服務的用途和默認端口。 ftp、ssh、http、telnet、https ftp:File Transfer Protocol,文件傳輸協議,是應用層的協議,它基於傳輸層,