您當前的位置:首頁 > 詩詞

讓面試者頭大如斗的linux核心30道題

作者:由 linux分享猿 發表于 詩詞時間:2020-11-12

前言

前些天的面試屍橫遍野,因為面試官問了linux核心,很多同學平時並不注重這個,所以自然也就沒辦法答得出來,一起來看看是哪些題難住了大家,答案也幫大家整理好了,不過只寫了了幾個,因為不知道有沒有人看,我犯懶,剩下的答案感興趣的朋友可以進群獲取

1. Linux

中主要有哪幾種核心鎖?

Linux 的同步機制從 2。0 到 2。6 以來不斷髮展完善。從最初的原子操作,到後來 的訊號量,從大核心鎖到今天的自旋鎖。這些同步機制的發展伴隨 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)。下面就

是申請並匯出啟動記憶體的一段示例程式碼:

void* x_bootmem = NULL;

EXPORT_SYMBOL(x_bootmem);

unsigned long x_bootmem_size = 0;

EXPORT_SYMBOL(x_bootmem_size);

static int __init x_bootmem_setup(char *str)

{

x_bootmem_size = memparse(str, &str);

x_bootmem = alloc_bootmem(x_bootmem_size);

printk(“Reserved %lu bytes from %p for x\n”, x_bootmem_size, x_bootmem);

return 1;

}

__setup(“x-bootmem=”, x_bootmem_setup);

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

制:

記憶體申請程式碼只能連線進核心,不能在模組中使用。被申請的記憶體不會被頁分配 器和 slab 分配器所使用和統計,也就是說它處於系統的可見記憶體之外,即使在 將來的某個地方你釋放了它。一般使用者只會申請一大塊記憶體,如果需要在其上實

現複雜的記憶體管理則需要自己實現。在不允許記憶體分配失敗的場合,透過啟動內 存預留記憶體空間將是我們唯一的選擇。

4.

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

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

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

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

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

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

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

5、 呼叫

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

1。系統呼叫 do_fork();

2。定時中斷 do_timer();

3。喚醒程序 wake_up_process

4。改變程序的排程策略 setscheduler();

5。系統呼叫禮讓 sys_sched_yield();

6、透過夥伴系統申請核心記憶體的函式有哪些?

7、透過

slab

分配器申請核心記憶體的函式有?

8、Linux

的核心空間和使用者空間是如何劃分的(以

32

位系統

為例)?

9、vmalloc()

申請的記憶體有什麼特點?

10、

使用者程式使用

malloc()

申請到的記憶體空間在什麼範圍?

11、

在支援並使能

MMU

的系統中,

Linux

核心和使用者程式分

別執行在物理地址模式還是虛擬地址模式?

12、ARM

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

13、Linux

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

14、Linux

虛擬檔案系統的關鍵資料結構有哪些?(至少寫出

四個)

15、

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

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

17、Linux

排程程式是根據程序的動態優先順序還是靜態優先順序

來排程程序的?

18、

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

19、

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

20、Linux

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

21、

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

22、TLB

中快取的是什麼內容?

23、Linux

中有哪幾種裝置?

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

25、裝置驅動程式包括哪些功能函式?

26、

如何唯一標識一個裝置?

27、Linux

透過什麼方式實現系統呼叫?

28、Linux

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

好了,文章就到這裡吧,你問我後面的答案怎麼沒有了?因為我懶得打字了,如果自己做不出來或者想印證一下做的對不對的朋友,可以進群973961276跟大家一起交流,如果有人看的話我再給大家貼一個講解linux核心的影片,散會!

標簽: 核心  Linux  程序  bootmem  記憶體