前些天的面試屍橫遍野,由於面試官問了linux內核,不少同窗平時並不注重這個,因此天然也就沒辦法答得出來,一塊兒來看看是哪些題難住了你們,答案也幫你們整理好了,不過只寫了了幾個,由於不知道有沒有人看,我犯懶,剩下的答案感興趣的朋友能夠進羣獲取linux
=============================面試
Linux 的同步機制從 2.0 到 2.6 以來不斷髮展完善。從最初的原子操做,到後來 的信號量,從大內核鎖到今天的自旋鎖。這些同步機制的發展伴隨 Linux 從單處 理器到對稱多處理器的過渡;伴隨着從非搶佔內核到搶佔內核的過分。Linux 的鎖機制愈來愈有效,也越緩存
來越複雜。 自旋鎖最多隻能被一個可執行線程持有,若是一個執行線程試圖請求一個已被爭用已經被持有)的自旋鎖,那麼這個線程就會一直進行忙循環——旋轉——等待 鎖從新可用。要是鎖未被爭用,請求它的執行線程便能馬上獲得它而且繼續進行。 自旋鎖可 數據結構
以在任什麼時候刻防止多於一個的執行線程同時進入臨界區。 信號量的睡眠特性,使得信號量適用於鎖會被長時間持有的狀況;只能在進程上 下文中使用,由於中斷上下文中是不能被調度的;另外當代碼持有信號量時,不 能夠再持有自旋鎖。 Linux 內核中的同步機ide
制:原子操做、信號量、讀寫信號量和自旋鎖的 API,另 外一些同步機制,包括大內核鎖、讀寫鎖、大讀者鎖、RCU (Read-Copy Update, 顧名思義就是讀-拷貝修改),和順序鎖。函數
=====================================操作系統
MS-DOS 等操做系統在單一的 CPU 模式下運行,可是一些類 Unix 的操做系統則使 用了雙模式,能夠有效地實現時間共享。在 Linux 機器上,CPU 要麼處於受信任 的內核模式,要麼處於受限制的用戶模式。除了內核自己處於內核模式之外,所 有的用戶進程都運線程
行在用戶模式之中。 內核模式的代碼能夠無限制地訪問全部處理器指令集以及所有內存和 I/O 空間。 若是用戶模式的進程要享有此特權,它必須經過系統調用向設備驅動程序或其餘 內核模式的代碼發出請求。另外,用戶模式的代碼容許發生缺頁,而內核模式的code
代碼則不容許。 在 2.4 和更早的內核中,僅僅用戶模式的進程能夠被上下文切換出局,由其餘進 程搶佔。除非發生如下兩種狀況,不然內核模式代碼能夠一直獨佔 CPU:視頻
(1) 它自願放棄 CPU;
(2) 發生中斷或異常。
2.6 內核引入了內核搶佔,大多數內核模式的代碼也能夠被搶佔。
========================
在 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 xn", x_bootmem_size, x_bootmem); return 1; } __setup("x-bootmem=", x_bootmem_setup);
可見其應用仍是比較簡單的,不過利弊老是共生的,它不可避免也有其自身的限
制:
內存申請代碼只能鏈接進內核,不能在模塊中使用。被申請的內存不會被頁分配 器和 slab 分配器所使用和統計,也就是說它處於系統的可見內存以外,即便在 未來的某個地方你釋放了它。通常用戶只會申請一大塊內存,若是須要在其上實
現複雜的內存管理則須要本身實現。在不容許內存分配失敗的場合,經過啓動內 存預留內存空間將是咱們惟一的選擇。
===========================
=============================================
1.系統調用 do_fork();
2.定時中斷 do_timer();
3.喚醒進程 wake_up_process
4.改變進程的調度策略 setscheduler();
5.系統調用禮讓 sys_sched_yield();
六、經過夥伴系統申請內核內存的函數有哪些?
七、經過slab分配器申請內核內存的函數有?
八、Linux的內核空間和用戶空間是如何劃分的(以32位系統爲例)?
九、vmalloc()申請的內存有什麼特色?
十、用戶程序使用malloc()申請到的內存空間在什麼範圍?
十一、在支持並使能MMU的系統中,Linux內核和用戶程序分別運行在物理地址模式仍是虛擬地址模式?
十二、ARM處理器是經過幾級也表進行存儲空間映射的?
1三、Linux是經過什麼組件來實現支持多種文件系通的?
1四、Linux虛擬文件系統的關鍵數據結構有哪些?(至少寫出 四個)
1五、對文件或設備的操做函數保存在那個數據結構中?
1六、建立進程的系統調用有那些?
1七、Linux調度程序是根據進程的動態優先級仍是靜態優先級來調度進程的?
1八、進程調度的核心數據結構是哪一個?
1九、如何加載、卸載一個模塊?
20、Linux中的浮點運算由應用程序實現仍是內核實現?
2一、模塊程序可否使用可連接的庫函數?
2二、TLB中緩存的是什麼內容?
2三、Linux中有哪幾種設備?
2四、字符設備驅動程序的關鍵數據結構是哪一個?
2五、設備驅動程序包括哪些功能函數?
2六、如何惟一標識一個設備?
2七、Linux 經過什麼方式實現系統調用?
2八、Linux 軟中斷和工做隊列的做用是什麼?
視頻>>linux內核30道面試題好了,文章就到這裏吧,你問我後面的答案怎麼沒有了?由於我懶得打字了,若是本身作不出來或者想印證一下作的對不對的朋友,能夠進羣973961276跟你們一塊兒交流,若是有人看的話我再給你們貼一個講解linux內核的視頻,散會!