1. 程式人生 > >Linux核心與驅動面試要點

Linux核心與驅動面試要點

1. 實際經驗:所開發驅動程式或核心模組的來龍去脈(需求、設計思想、實現方法、要點難點,特別是硬體除錯過程中所遇到的特殊情況),所修復BUG的現象、除錯手段、原因分析和解決方案。

2. 驅動除錯:核心的除錯手段、應用程式的除錯手段(核心Panic所dump的資訊以及Panic的分析、應用程式core dump的分析)。

3. 驅動基礎:mknod與udev,module相關API,核心Makefile的編寫,裝置編號的申請,裝置的註冊,簡單驅動的fops(open/read/write/ioctl/release),使用者空間和核心空間的資料交換,阻塞操作的實現、select/poll的支援,mmap的實現,DMA機制及其注意事項。


4. 中斷機制:Linux中斷機制的內在邏輯,中斷處理程式的實現要點,中斷共享機制,中斷上下文與程序上下文的區別(為什麼在中斷上下文中不能執行導致程序排程的函式)中斷與異常的區別,中斷的管理(開中斷與關中斷)。

5. 下半部:Linux下半部機制的必要性,三種類型下半部(softirq/tasklet/work queue)的區別與應用場景,三種下半部機制的API,中斷處理程式、下半部以及程序上下文之間的同步問題。

6. 核心同步:核心中競爭與同步機制的內在邏輯,核心同步方法(原子操作/spinlock/訊號量/讀寫鎖/完成變數completionvariable/Seq_lock/Read-copy-update/Per-CPU變數/禁止核心搶佔、中斷和下半部/記憶體屏障)的內在邏輯、區別與應用場景。


7. 記憶體分配:Linux記憶體管理及分配機制(buddy system和slab等),kmalloc的原理、應用場景及引數,alloc_pages物理頁面分配,高階記憶體對映,Per-CPU資料,alloc_bootmem啟動時的記憶體分配。

8. 定時延時:核心定時、延時及等待機制(忙等待,核心定時器,schedule_timeout,等待佇列、程序的阻塞與喚醒)

9. 電源管理:Linux核心的電源管理機制,驅動程式中電源管理的實現。

10. 驅動子系統:嵌入式系統中常用簡單匯流排介面(I2C/SPI/UART/SDIO)驅動子系統,重點外設模組(MTD及其檔案系統/MicroSD/LCD/Camera/Audio/網絡卡/WIFI/BT/USB/鍵盤與觸屏)驅動子系統。


11. 硬體基礎:ARM體系結構的基礎知識(暫存器、執行模式、MMU、Cache、常用匯編指令),中斷控制器,DMA控制器等,重點外設的硬體邏輯。

12. 程序管理:O(1)排程演算法和CFS排程演算法的思想與實現方法,優先順序反轉及其解決方法,核心搶佔(禁止搶佔、搶佔時機),程序的管理(阻塞與喚醒、等待佇列、排程、放棄CPU等),程序與執行緒的區別、核心執行緒與普通程序的區別。

13. 系統啟動:核心啟動詳細順序(上電 -> Bootloader -> start_kernel() -> 各核心子系統的啟動 ->啟動新執行緒Init用於啟動系統[...] -> 啟動新執行緒用於建立各核心執行緒 ->IDLE),模組INIT的實現機制(各種INIT巨集所標識的函式的呼叫時機)。

14. 檔案系統:Linux虛擬檔案系統VFS的架構,檔案open的過程(普通檔案、字元裝置、塊裝置)、系統呼叫open和字元裝置驅動open函式的引數差異。

15. 其他知識:Makefile的編寫/Shell程式設計/Busybox/GCC編譯過程及其優化/GDB命令/動態連結庫的連結方式/NPTL之執行緒管理介面/ELF/Linux的Log機制/變數在記憶體中的儲存/Daemon程序/孤兒程序