模塊三要素:
MODULE_LICENSE(GPL);//模塊許可
module_init(XXX);//模塊加載函數
module_exit(XXX);//模塊卸載函數
2、對設備的併發訪問控制
一、原子操做linux
二、自旋鎖併發
三、信號量框架
【筆試題1】驅動裏面爲何要有併發、互斥的控制?如何實現?講個例子?async
併發(concurrency)指的是多個執行單元同時、並行被執行,而併發的執行單元對共 享資源(硬件資源和軟件上的全局變量、靜態變量等)的訪問則很容易致使競態(race conditions)。函數
解決競態問題的途徑是保證對共享資源的互斥訪問,所謂互斥訪問就是指一個執行單元 在訪問共享資源的時候,其餘的執行單元都被禁止訪問。spa
訪問共享資源的代碼區域被稱爲臨界區,臨界區須要以某種互斥機 制加以保護,中斷屏蔽,原子操做,自旋鎖,和信號量都是linux設備驅動中可採用的互斥途徑。操作系統
【筆試題2】 spinlock自旋鎖是如何實現的?線程
自旋鎖在同一時刻只能被最多一個內核任務持有,因此一個時刻只有一個線程容許存在於臨界區中。這點能夠應用在多處理機器、或運行在單處理器上的搶佔式內核中須要的鎖定服務。orm
3、四種IO訪問模型(內核層---應用層)
一、阻塞(read\write)
二、非阻塞(read\write)
三、IO多路複用 (應用層:select 內核層:poll)
三、信號驅動IO (應用層:fcntl 內核層:fasync)
4、內存訪問
【筆試題1】 linux內核裏面,內存申請有哪幾個函數,各自的區別?
(1)__get_free_pages:按物理頁分配,物理內存連續,可分配大小:4M~8M,一頁4k.
(2)kmalloc:按指定大小分配,物理內存連續:1byte~128K
(3)vmalloc:按指定大小分配,物理內存不連續:
【mmap函數實現把一個文件映射到一個內存區域,從而咱們能夠像讀寫內存同樣讀寫文件,他比單純調用read/write要快許多。有時能夠把內存的內容拷貝到一個文件中實現內存備份,也能夠把文件的內容映射到內存來恢復某些服務。另外,mmap實現共享內存也是其主要應用之一,mmap系統調用使得進程之間經過映射同一個普通文件實現共享內存。】
【筆試題1】說明linux設備驅動中申請中斷的函數原型及其相關參數
int request_irq(unsigned int irqno,irq_handler_t handler,unsigned long flags,const char *name,void *dev_id);
irqno:中斷號
handler:中斷處理函數
flags:中斷標誌位
name:申請中斷的設備或驅動的名稱,會出如今/proc/interrupts
dev_id:傳遞給中斷處理函數的參數
【筆試題2】linux將中斷服務程序分紅上半部分和下半部分的緣由,如何實現?
中斷處理程序:(1)不容許睡眠(2)中斷執行時間儘量短。
爲了在中斷執行時間儘量短和中斷處理需完成大量工做之間找到一個平衡點,linux將中斷處理程序分解爲兩個半部;頂半部和底半部。
頂半部完成比較緊急、不耗時的操做,通常就是簡單讀取寄存器中的中斷狀態並清除中斷標誌,進行登記中斷的工做。【登記中斷 即將底半部處理程序掛到該設備的底半部執行隊列中】,這樣,頂半部執行速度就會很快,能夠服務更多中斷請求。
底半部完成耗時的操做,包括中斷事件的絕大多數任務,能夠被新的中斷打斷,即中斷是打開的。
另外,若是中斷要處理的工做自己不多,則能夠直接在頂半部完成全部任務。
【筆試題3】linux實現底半部的機制主要有:tasklet、工做隊列、軟中斷
6、時鐘
7、簡單字符設備驅動
一、LED
二、BEEP(PWM_TIMER)
三、ADC
四、KEY_EINT
五、WATCHDOG
8、基於總線的字符設備驅動
一、plateform
二、IIC
三、SPI
【筆試題1】 I2C觸摸屏芯片與CPU的數據傳輸流程?畫出相關圖例?(這題目記得不是太清楚了,大概是考查I2C設備驅動的數據傳輸過程)
基礎知識點
一、linux系統中,內核以設備號區分設備
二、驅動程序運行在內核空間
三、驅動程序編譯方式:靜態編譯、動態編譯
四、模塊中指定加載函數的宏:module_init
五、用來加載模塊 的命令:insmod modprobe
六、linux2.6內核中,設備的主設備號12位,次設備號20位
七、linux系統中,
字符設備和
塊設備有設備節點。
八、實現互斥機制的原子操做、信號量、自旋鎖
九、中斷標誌位中,表示關中斷嵌套的宏,IRQF_DISABLED
十、一般狀況下,kmalloc函數能分配的最大內存128K
十二、保證物理空間上連續的內存分配函數是_get_free_pages kmalloc
1三、linux系統中經過add_timer添加的timer是 一次性的
1四、當platform_device和platform_driver匹配時,會執行的函數是probe函數
1五、linux 系統中以模塊方式組織設備驅動程序,內核模塊中必不可少的組成部分:
模塊三要素:
MODULE_LICENSE(GPL);//模塊許可
module_init(XXX);//模塊加載函數
module_exit(XXX);//模塊卸載函數
1六、字符設備和塊設備的區別
字符設備:按字節訪問設備;通常只支持順序訪問;無緩衝區
塊設備:按固定大小訪問;支持隨機訪問;有緩衝區
1七、內核模塊和應用程序的區別
內核模塊:運行於內核空間;工做模式SVC模式;調用內核函數;入口是加載函數;本身釋放資源
應用程序:運行於用戶空間;工做模式USR模式;調用庫函數;入口是main函數;操做系統自動回收資源
1八、說明linux設備驅動中申請中斷的函數原型及其相關參數
int request_irq(unsigned int irqno,irq_handler_t handler,unsigned long flags,const char *name,void *dev_id);
irqno:中斷號
handler:中斷處理函數
flags:中斷標誌位
name:申請中斷的設備或驅動的名稱,會出如今/proc/interrupts
dev_id:傳遞給中斷處理函數的參數
1九、簡述信號量和自旋鎖的異同
相同點:均可用於實現互斥
不一樣點:信號量沒法得到時,進程處於等待態;得到信號量後可睡眠,可長時間佔有,不能用於中斷
自旋鎖沒法得到時進程處於運行態;持有鎖期間不可睡眠,時間儘量短,可用於中斷
20、請列舉linux設備驅動程序中,程序延緩執行的機制:
tasklet、工做隊列、內核定時器
2一、mmap機制的做用和使用mmap的好處
mmap能夠把設備的物理內存映射到用戶空間訪問,相比在用戶空間和內核空間互相拷貝數據,提升了效率。
2二、驅動中採用動態申請設備號的,如何建立設備文件?
在驅動中建立相應的class和device,經過udev或mdev自動建立設備文件