linux驅動面試題2018

linux驅動面試題2018(面試題整理,含答案)
版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 

轉載請標明原址:https://blog.csdn.net/kai_zone/article/details/82021233

      前言: 這篇文章主要是對linux驅動面試題一個整理跟總結,參考了很多網上的資料,基本涵蓋linux驅動相關面試內容。我把他們大概的分爲三部分:基礎部分,同步相關,還有中斷部分。中斷,同步相關基本都是必問的。下面也會對這幾個方面的面試題進行詳細的解答,你把下面的面試題弄懂了,應該可以應付大部分linux驅動面試了。要想真正的理解,還的在實踐中多動手調試多總結,如果有什麼地方錯了或者不全,歡迎小夥伴們留言。

 
一.  基礎題:
1. linux中內核空間及用戶空間的區別?用戶空間與內核通信方式有哪些?

https://blog.csdn.net/bingqingsuimeng/article/details/7924756

2. 字符設備和塊設備的區別,請分別列舉一些實際的設備說出它們是屬於哪一類設備

     字符設備:字符設備是個能夠像字節流(類似文件)一樣被訪問的設備,由字符設備驅動程序來實現這種特性。字符設備驅動程序通常至少實現open,close,read和write系統調用。字符終端、串口、鼠標、鍵盤、攝像頭、聲卡和顯卡等就是典型的字符設備。

    塊設備:和字符設備類似,塊設備也是通過/dev目錄下的文件系統節點來訪問。塊設備上能夠容納文件系統,如:u盤,SD卡,磁盤等。

    字符設備和塊設備的區別僅僅在於內核內部管理數據的方式,也就是內核及驅動程序之間的軟件接口,而這些不同對用戶來講是透明的。在內核中,和字符驅動程序相比,塊驅動程序具有完全不同的接口。

3. linux內核的啓動過程(源代碼級)?

https://www.cnblogs.com/CrazyCatJack/p/6135435.html

4. linux中系統調用過程?如:應用程序中read()在linux中執行過程即從用戶空間到內核空間?

https://blog.csdn.net/kai_zone/article/details/80459334

https://my.oschina.net/haomcu/blog/468656

5. linux調度原理?

https://blog.csdn.net/janneoevans/article/details/8125106

6. 查看驅動模塊中打印信息應該使用什麼命令?如何查看內核中已有的字符設備的信息?如何查看正在使用的有哪些中斷號?

   1) 查看驅動模塊中打印信息的命令:dmesg

   2) 查看字符設備信息可以用lsmod 和modprobe,lsmod可以查看模塊的依賴關係,modprobe在加載模塊時會加載其他依賴的        模塊。

   3) 顯示當前使用的中斷號cat /proc/interrupt

7. copy_to_user()和copy_from_user()主要用於實現什麼功能?一般用於file_operations結構的哪些函數裏面?

       由於內核空間和用戶空間是不能互相訪問的,如果需要訪問就必須藉助內核函數進行數據讀寫。copy_to_user():完成內核空間到用戶空間的複製,copy_from_user():是完成用戶空間到內核空間的複製。一般用於file_operations結構裏的read,write,ioctl等內存數據交換作用的函數。當然,如果ioctl沒有用到內存數據複製,那麼就不會用到這兩個函數。

8. 請簡述主設備號和次設備號的用途。如果執行mknod chartest c 4 64,創建chartest設備。請分析chartest使用的是那一類設備驅動程序。

1)主設備號:主設備號標識設備對應的驅動程序。雖然現代的linux內核允許多個驅動程序共享主設備號,但我們看待的大多數設備仍然按照“一個主設備對應一個驅動程序”的原則組織。

     次設備號:次設備號由內核使用,用於正確確定設備文件所指的設備。依賴於驅動程序的編寫方式,我們可以通過次設備號獲得一個指向內核設備的直接指針,也可將此設備號當作設備本地數組的索引。

2)chartest 表示設備節點,4表示主設備號,64表示次設備號。(感覺類似於串口終端或者字符設備終端)。

9. 設備驅動程序中如何註冊一個字符設備?分別解釋一下它的幾個參數的含義。

    註冊一個字符設備驅動有兩種方法:

    1) void cdev_init(struct cdev *cdev, struct file_operations *fops)

    該註冊函數可以將cdev結構嵌入到自己的設備特定的結構中。cdev是一個指向結構體cdev的指針,而fops是指向一個類似於f       file_operations結構(可以是file_operations結構,但不限於該結構)的指針.

    2) int register_chrdev(unsigned int major, const char *namem , struct file)operations *fopen);

        該註冊函數是早期的註冊函數,major是設備的主設備號,name是驅動程序的名稱,而fops是默認的file_operations結構(這       是隻限於file_operations結構)。對於register_chrdev的調用將爲給定的主設備號註冊0-255作爲次設備號,併爲每個  設備建     立一個對應的默認cdev結構。

10. linux中RCU原理?

      https://www.cnblogs.com/-wang-cheng/p/5401653.html

11. linux內存如何劃分以及如何使用?虛擬地址及物理地址的概念以及轉換,高端內存的概念?

      https://www.cnblogs.com/dongzhiquan/p/5621906.html

      https://www.cnblogs.com/wuchanming/p/4360277.html

12. 字符型驅動設備怎麼創建設備文件?

     手動創建:mknod /dev/led c 250 0    其中dev/led 爲設備節點 c 代表字符設備 250代表主設備號 0代表次設備號

     還有UDEV/MDEV自動創建設備文件的方式,UDEV/MDEV是運行在用戶態的程序,可以動態管理設備文件,包括創建和刪除設備文件,運行在用戶態意味着系統要運行之後。在  /etc/init.d/rcS 腳本文件中會執行 mdev -s 自動創建設備節點。

13. insmod 一個驅動模塊,會執行模塊中的哪個函數?rmmod呢?這兩個函數在設計上要注意哪些?遇到過卸載驅動出現異常沒?是什麼問題引起的?

     答: insmod調用init函數,rmmod調用exit函數。這兩個函數在設計時要注意什麼?卸載模塊時曾出現卸載失敗的情形,原因是存在進程正在使用模塊,檢查代碼後發現產生了死鎖的問題。

      要注意在init函數中申請的資源在exit函數中要釋放,包括存儲,ioremap,定時器,工作隊列等等。也就是一個模塊註冊進內核,退出內核時要清理所帶來的影響,帶走一切不留下一點痕跡。

14. 設備驅動模型三個重要成員是?platform總線的匹配規則是?在具體應用上要不要先註冊驅動再註冊設備?有先後順序沒?

        設備驅動模型三個重要成員是 總線、設備、驅動;

         platfoem總線的匹配規則是:要匹配的設備和驅動都要註冊,設備可以在設備樹裏註冊,也可以通過代碼註冊設備,匹配成功會去調用驅動程序裏的probe函數(probe函數在這個platform_driver結構體中註冊)。

15. 內核函數mmap的實現原理,機制?

      https://blog.csdn.net/yinjiabin/article/details/7575653

      https://blog.csdn.net/edwardlulinux/article/details/8604400 

16. 在驅動調試過程中遇到過oops沒?你是怎麼處理的?

       https://blog.csdn.net/kangear/article/details/8217329

17. ioctl和unlock_ioctl有什麼區別?

     https://blog.csdn.net/zhuangtim1987/article/details/41963411

     https://blog.csdn.net/cbl709/article/details/7295772

18. 驅動中操作物理絕對地址爲什麼要先ioremap?

   因爲內核沒有辦法直接訪問物理內存地址,必須先通過ioremap獲得對應的虛擬地址

   https://blog.csdn.net/zqixiao_09/article/details/50859505

19. 你平常是怎麼用C寫嵌入式系統的死循環的?

      for(;;){}  

      while(1){}

     一般for(;;)性能更優

     for(;;){}  

     這兩個;; 空語句,編譯器一般會優掉的,直接進入死循環

    while(1){}  

    每循環一次都要判斷常量1是不是等於零,在這裏while比for多做了這點事

    不過從彙編的角度來說,都是一樣的代碼。

20. 列舉最少3種你所知道的嵌入式的體系結構,並請說明什麼是ARM體系結構。

     arm,mips,x86

    https://blog.csdn.net/qq_32651225/article/details/78176567

    https://blog.csdn.net/chengtong222/article/details/64440661

21. kmalloc和vmalloc的區別

     https://www.cnblogs.com/hongzhunzhun/p/4533960.html

     https://www.cnblogs.com/wuchanming/p/4465155.html

22. IIC原理,總線框架,設備編寫方法,i2c_msg

     https://blog.csdn.net/kai_zone/article/details/78026931

     https://blog.csdn.net/kai_zone/article/details/78029501

23.  kernel panic

     https://www.cnblogs.com/cherishui/p/3881428.html

24.  Linux中的用戶模式和內核模式是什麼含意?

     https://blog.csdn.net/sinat_15799399/article/details/44238893

25.  怎樣申請大塊內核內存?

       vmalloc

26. 用戶進程間通信主要哪幾種方式?

    https://blog.csdn.net/wh_sjc/article/details/70283843

27.linux編譯時用到的參數含義及?

    https://blog.csdn.net/taoyanqi8932/article/details/51758722

28. 內核配置編譯及Makefile?

      https://www.cnblogs.com/CrazyCatJack/p/6121231.html

29.談談對Volatile關鍵字的理解?

https://blog.csdn.net/kai_zone/article/details/77965302

30.  framebuffer機制?

      Linux抽象出FrameBuffer這個設備來供用戶態進程實現直接寫屏。Framebuffer機制模仿顯卡的功能,將顯卡硬件結構抽象掉,可以通過Framebuffer的讀寫直接對顯存進行操作。用戶可以將Framebuffer看成是顯示內存的一個映像,通過mmap將其映射到進程地址空間之後,就可以直接進行讀寫操作,而寫操作可以立即反應在屏幕上。這種操作是抽象的,統一的。用戶不必關心物理顯存的位置、換頁機制等等具體細節,這些都是由Framebuffer設備驅動來完成的。通過mmap調用把顯卡的物理內存空間映射到用戶空間

二.  同步相關:
1.  spinlock與信號量的區別?

      https://blog.csdn.net/xiaohuima_dong/article/details/46423793

      https://www.cnblogs.com/tureno/articles/6067441.html

2.  linux中的同步機制?

     https://blog.csdn.net/waltonhuang/article/details/52212762

     https://blog.csdn.net/tong646591/article/details/8484596

3.  linux系統實現原子操作有哪些方法?

https://www.cnblogs.com/fanzhidongyzby/p/3654855.html

https://blog.csdn.net/vividonly/article/details/6599502

4.  自旋鎖和信號量在互斥使用時需要注意哪些?在中斷服務程序裏面的互斥是使用自旋鎖還是信號量?還是兩者都能用?爲什麼(答案見1分析)?

    答:使用自旋鎖的進程不能睡眠,使用執行時間短的任務,使用信號量的進程可以睡眠,適合於執行時間較長的任務。中斷服務例程中的互斥使用的是自旋鎖,原因是在中斷處理例程中,硬中斷是關閉的,這樣會丟失可能到來的中斷。

5. 驅動裏面爲什麼要有併發、互斥的控制?如何實現?講個例子?

      併發(concurrency)指的是多個執行單元同時、並行被執行,而併發的執行單元對共 享資源(硬件資源和軟件上的全局變量、靜態變量等)的訪問則很容易導致競態(race conditions)。

       解決競態問題的途徑是保證對共享資源的互斥訪問,所謂互斥訪問就是指一個執行單元 在訪問共享資源的時候,其他的執行單元都被禁止訪問。

訪問共享資源的代碼區域被稱爲臨界區,臨界區需要以某種互斥機 制加以保護,中斷屏蔽,原子操作,自旋鎖,和信號量都是linux設備驅動中可採用的互斥途徑。

 

三.  中斷相關:
可以先看一下五篇系列文章:https://blog.csdn.net/droidphone/article/category/1118447

      這篇我收藏的文檔詳細的敘述了中斷上半部及下半部的原理及注意點,如果對其不理解可以下載下來看看,由於CSDN最低沒有0積分,那就最低的一個積分吧。下載地址:https://download.csdn.net/download/kai_zone/10631972

1.  linux中軟中斷的實現原理?

      https://blog.csdn.net/DroidPhone/article/details/7518428   

      https://www.linuxidc.com/Linux/2014-03/98013.htm

2. linux中斷響應的執行流程

     https://blog.csdn.net/yimu13/article/details/6803957

3. linux中斷實現機制、tasklet和workqueue的區別和底層實現的區別,爲什麼要區分中斷上半部和中斷下半部。

  (中斷上半部及下半部詳細文檔:https://download.csdn.net/download/kai_zone/10631972)

tasklet和workqueue區別? 
tasklet運行於中斷上下文,不允許阻塞 、休眠,而workqueue運行與進程上下文,可以休眠和阻塞。 
爲什麼要區分上半部和下半部? 
中斷服務程序異步執行,可能會中斷其他的重要代碼,包括其他中斷服務程序。因此,爲了避免被中斷的代碼延遲太長的時間,中斷服務程序需要儘快運行,而且執行的時間越短越好,所以中斷程序只作必須的工作,其他工作推遲到以後處理。所以Linux把中斷處理切爲兩個部分:上半部和下半部。上半部就是中斷處理程序,它需要完成的工作越少越好,執行得越快越好,一旦接收到一箇中斷,它就立即開始執行。像對時間敏感、與硬件相關、要求保證不被其他中斷打斷的任務往往放在中斷處理程序中執行;而剩下的與中斷有相關性但是可以延後的任務,如對數據的操作處理,則推遲一點由下半部完成。下半部分延後執行且執行期間可以相應所有中斷,這樣可使系統處於中斷屏蔽狀態的時間儘可能的短,提高了系統的響應能力。實現了程序運行快同時完成的工作量多的目標。

4. 中斷的申請及何時執行(何時執行中斷處理函數)?

    中斷的響應流程:cpu接受中斷->保存中斷上下文跳轉到中斷處理歷程->執行中斷上半部->執行中斷下半部->恢復中斷上下文。 
中斷的申請request_irq的正確位置:應該是在第一次打開 、硬件被告知終端之前。

5. 中斷註冊函數和中斷註銷函數

    https://www.cnblogs.com/lifexy/p/7506613.html

6. 中斷和輪詢哪個效率高?怎樣決定是採用中斷方式還是採用輪詢方式去實現驅動?

    中斷是CPU處於被動狀態下來接受設備的信號,而輪詢是CPU主動去查詢該設備是否有請求。凡事都是兩面性,所以,看效率不能簡單的說那個效率高。如果是請求設備是一個頻繁請求cpu的設備,或者有大量數據請求的網絡設備,那麼輪詢的效率是比中斷高。如果是一般設備,並且該設備請求cpu的頻率比較底,則用中斷效率要高一些。主要是看請求頻率。

7. 寫一箇中斷服務需要注意哪些?如果中斷產生之後要做比較多的事情你是怎麼做的?

    第一: 中斷處理例程應該儘量短,把能放在後半段(tasklet,等待隊列等)的任務儘量放在後半段。

     寫一箇中斷服務程序要注意快進快出,在中斷服務程序裏面儘量快速採集信息,包括硬件信息,然後退出中斷,要做其它事情可以使用工作隊列或者tasklet方式。也就是中斷上半部和下半部。

    第二:中斷服務程序中不能有阻塞操作。應爲中斷期間是完全佔用CPU的(即不存在內核調度),中斷被阻塞住,其他進程將無法操作;

    第三:中斷服務程序注意返回值,要用操作系統定義的宏做爲返回值,而不是自己定義的OK,FAIL之類的。

8. 驅動中操作物理絕對地址爲什麼要先ioremap?

    因爲內核沒有辦法直接訪問物理內存地址,必須先通過ioremap獲得對應的虛擬地址。

9.  IRQ和FIQ有什麼區別,在CPU裏面是是怎麼做的?

     https://blog.csdn.net/u011308691/article/details/46476985

10. Linux軟中斷和工作隊列的作用是什麼?

      https://blog.csdn.net/godleading/article/details/52971179

 

參考文章:http://www.mamicode.com/info-detail-2283409.html

                  https://blog.csdn.net/suiyuan19840208/article/details/20392151

                  https://blog.csdn.net/zqixiao_09/article/details/50937907

                  https://blog.csdn.net/lhhero701/article/details/51171948
————————————————
版權聲明:本文爲CSDN博主「墨塵深巷」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/kai_zone/java/article/details/82021233

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章