如果你能正確回答以下問題並理解相關知識點原理,那么你就可以算得上是基本合格的Linux內核開發工程師。
1. Linux中主要有哪幾種內核鎖?(進程同步與互斥)
(1)自旋鎖:非睡眠鎖
(2)信號量:睡眠鎖
2. Linux中的用戶模式和內核模式是什么含義?(內存管理)
(1)用戶模式:應用程序運行於用戶模式,僅可以有限度的訪問CPU及其他硬件資源
(2)內核模式:內核線程運行於內核模式,內核模式的代碼可以無限制地訪問所有處理器指令集以及全部內存和I/O空間
3. 怎樣申請大塊內核內存?(內存管理)
① vmalloc()用於申請大塊內存,它的特點為虛擬地址連續,物理地址不一定連續
② kmalloc()用於申請小塊內存 ,它基於slab實現的。
4. 用戶進程間通信主要有哪幾種方式?(進程間通信)
(1)管道(PIPE):僅父子進程間通信
(2)有名管道(FIFO):可用於任意進程
(3)共享內存(簡單實用):共享內存就是映射一段能被其他進程所訪問的內存,這段共享內存由一個進程創建,但多個進程都可以訪問。共享內存是最快的 IPC 方式,它是針對其他進程間通信方式運行效率低而專門設計的。它往往與其他通信機制,如信號量配合使用,來實現進程間的同步和通信。
(4)消息隊列:消息隊列是由消息的鏈表,存放在內核中並由消息隊列標識符標識。消息隊列克服了信號傳遞信息少、管道只能承載無格式字節流以及緩沖區大小受限等缺點。
(5)信號:信號是一種比較復雜的通信方式,用於通知接收進程某個事件已經發生
(6)信號量:信號量是一個計數器,可以用來控制多個進程對共享資源的訪問。它常作為一種鎖機制,防止某進程正在訪問共享資源時,其他進程也訪問該資源。因此,主要作為進程間以及同一進程內不同線程之間的同步手段。
(7)Socket:可用於不同機器進程間的通信
5. 通過伙伴系統申請內核內存的函數有哪些?(內存管理)
① 伙伴算法的思想是:把內存中連續的空閑葉框空間看做空閑葉框塊,並按照它們的大小(連續葉框的數目)分成10組,
第0組:每個元素都代表由一個2^0個葉框組成的空閑葉框塊
第1組:每個元素都代表由一個2^1個葉框組成的空閑葉框塊
...
第9組:每個元素都代表由一個2^9個葉框組成的空閑葉框塊
每組中的空閑葉框塊用其自身的page結構連接為雙向鏈表;然后使結構free_area_struct的next和prev分別作為各個鏈表的頭、尾指針;最后把各組的free_area_struct結構以組的序號為下標保存在數組free_area[]中
注:伙伴算法的目的是在分配時合理分配,以盡量減少內存碎片
② 內核函數__get_free_page()用於物理葉框的分配
6. 通過slab分配器申請內核內存的函數有?(內存管理)
① kmalloc():通用緩沖區
② kmem_cache_alloc():專用緩沖區
③ slab思想:把若干頁框合在一起形成一個大存儲塊--slab,斌仔這個slab中只存儲一類數據
7. Linux的內核空間和用戶空間是如何划分的(以32位系統為例)(內存管理)
(1)Linux將4G的地址划分為用戶空間和內核空間兩部分。通常0-3G為用戶空間,3G-4G為內核空間,但他們的本質都為虛擬內存空間,都需要通過頁表進行轉換為實際的物理地址。
8. vmalloc()申請的內存有什么特點?(內存管理)
① vmalloc()和kmalloc()是內核內存分配函數,malloc()是用戶進程內存分配函數
② vmalloc()是通過頁表動態分配的內存,其虛擬地址空間連續,但物理地址空間不一定連續
③ kmalloc()是通過直接映射區分配內存,可以保證物理空間連續,但其所能分配的空間有限
注:內存只有在要被DMA訪問的時候才需要物理上連續。
④ kmalloc()和get_free_page()申請的內存位於物理內存映射區域,而且在物理上也是連續的,它們與真實的物理地址只有一個固定的偏移,因此存在較簡單的轉換關系。
⑤ vmalloc比kmalloc要慢
9. 用戶程序使用malloc()申請到的內存空間在什么范圍?(內存管理)
malloc()函數分配的內存空間在0~3G之間,即Linux用戶空間
10. 在支持並使能MMU的系統中,Linux內核和用戶程序分別運行在物理地址模式還是虛擬地址模式?(內存管理)
① 運行於虛擬地址模式
② MMU的作用:
(1)將虛擬地址轉化為物理地址
(2)訪問權限管理
11. ARM處理器是通過幾級頁表進行存儲空間映射的(內存管理)
① Linux操作系統使用三級頁表結構:頁目錄(Page Dicretory, PGD)、中間頁目錄(Page Midlle Dicretory, PMD)和頁表(Page Table,PTE)
② ARM處理器通過二級頁表進行映射
12. Linux是通過什么組件來實現支持多文件系統的?(文件系統)
虛擬文件系統
13. Linux虛擬文件系統的關鍵數據結構有哪些?(至少寫出四個)(文件系統)
(1)struct file
(2)struct file_operation
(3)struct super_block
(4)struct inode
14. 對文件或設備的操作函數保存在那個數據結構中?(文件系統)
struct file_operation
15. Linux中的文件包括哪些?(文件系統)
普通文件、目錄文件、鏈接文件、設備文件
16. 創建進程的系統調用有哪些?(進程管理)
① fork:子進程獲得一個父進程的副本,子進程有自己的數據區和堆棧區,以及系統堆棧(內核堆棧),子進程擁有自己獨立的內存空間(擁有獨立的頁表)
② vfork:與fork不同,vfork並不把父進程復制到子進程中,而只是用復制指針的方法使子進程與父進程的資源實現共享,子進程和父進程共享內存空間
17. 調用schedule()進行進程切換的方式有幾種?(進程管理)
18. Linux調度程序是根據進程的動態優先級還是靜態優先級來調度進程的?(進程管理)
Linux調度是根據weight來確定優先權的,而weight是由靜態優先級和動態優先級組合計算出來的值
weight = [counter + (20 - nice)]
19. 進程調度的核心數據結構是哪個?(進程管理)
struct runqueue
20. 如何加載、卸載一個模塊?(內核基本知識)
① insmod
② rmmod
21. 模塊和應用程序分別運行在什么空間?(內存管理)
模塊運行於內核空間,應用運行於用戶空間
22. Linux中的浮點運算由應用程序實現還是內核實現?(內存管理)
由應用程序實現,浮點數計算位於庫函數中,而庫函數只能由應用程序鏈接
23. 模塊程序能否使用可連接的庫函數?(內存管理)
模塊程序運行於內核空間,不能鏈接庫文件
24. TLB中緩存的內容是什么?(內存管理)
TLB(Translation lookaside buffer)即旁路轉換緩沖, 稱為頁表緩沖,當線性地址第一次被轉換為物理地址時,將線性地址與物理地址存放到TLB中,用於下次訪問到這個地址時,加快轉換速度
25. Linux中有哪幾種設備?(設備驅動)
字符設備,塊設備,網絡接口設備
26. 字符設備驅動程序的關鍵數據結構是哪個?(設備驅動)
struct file_operation
27. 設備驅動程序包括哪些功能函數?(設備驅動)
① open
② read
③ write
④ ioctl
⑤ release
⑥ llseek
28. 如何唯一標識一個設備?(設備驅動)
主設備號+次設備號
29. Linux通過什么方式實現系統調用?(Linux系統基本知識)
① Linux通過軟中斷(swi)實現系統調用
② 以ARM平台為例,系統調用工作原理是
(1)進程先用適當的值填充寄存器(R7),
(2)然后調用一個特殊的指令(swi),
(3)這個指令會讓用戶程序跳轉到一個事先定義好的內核中的一個位置(vector_swi),
(4)這位置的代碼會根據寄存器(R7)的值從表sys_call_table中查找相應的函數。
30. Linux軟中斷和工作隊列的作用是什么?(中斷處理)
① Linux軟中斷和工作隊列的作用是中斷延遲處理(中斷下半部分處理)
(1)軟中斷是一種“可延遲函數”的總稱,它不能睡眠、不能阻塞。他處於中斷上下文,不能進程切換,不能被自己打斷,只能被硬件中斷
(2)工作隊列中的函數處於進程上下文,它可以睡眠,能被阻塞。能夠在不同的進程間切換完成不同的工作。