linux驅動面試常見題目

2021-06-23 00:33:06 字數 2955 閱讀 4717

1. linux核心裡面,記憶體申請有哪幾個函式,各自的區別?

kmalloc()   __get_free_page()  mempool_create()  

2. irq和fiq有什麼區別,在cpu裡面是是怎麼做的?

3. int *a;

char *b;

a 和 b本身是什麼型別?

a、b裡面本身存放的只是乙個位址,難道是這兩個位址有不同麼?

4. 中斷的上半部分和下半部分的問題:

講下分成上半部分和下半部分的原因,為何要分?講下如何實現?

上半部分執行與硬體相關的處理要求快, 而有些驅動在中斷處理程式中又需要完成大量工作,這構成矛盾,所以linux有所謂的bottom half機制,中斷處理程式中所有不要求立即完成的,在開中斷的環境下,由底半程式隨後完成.

linux的底半處理實際上是建立在核心的軟中斷機制上的.

linux 的底半 機制主要有tasklet 和 work queue 以及 softirq ( 2.4核心則有bh , task queue , softirq , tasklet 沒有work queue),其實底半可以理解成一種工作的延遲。所以實際使用時跟timer機制基本上乙個意思。

5. 核心函式mmap的實現原理,機制?

mmap函式實現把乙個檔案對映到乙個記憶體區域,從而我們可以像讀寫記憶體一樣讀寫檔案,他比單純呼叫read/write也要快上許多。在某些時候我們可以把記憶體的內容拷貝到乙個檔案中實現記憶體備份,當然,也可以把檔案的內容對映到記憶體來恢復某些服務。另外,mmap實現共享記憶體也是其主要應用之一,mmap系統呼叫使得程序之間通過對映同乙個普通檔案實現共享記憶體。

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

7. spinlock自旋鎖是如何實現的?

自旋鎖在同一時刻只能被最多乙個核心任務持有,所以乙個時刻只有乙個執行緒允許存在於臨界區中。這點可以應用在多處理機器、或執行在單處理器上的搶占式核心中需要的鎖定服務。

二、訊號量簡介

這裡也介紹下訊號量的概念,因為它的用法和自旋鎖有相似的地方。

linuxlinux

linux是一套免費使用和自由傳播的作業系統,它主要用於基於intel系列cpu的計算機上。這個系統是由全世界各地的成千上萬的程式設計師設計和實現的,其目的是建立不受任何商品化軟體的版權制約的、全世界都能自由使用的unix相容產品。

中的訊號量是一種睡眠鎖。如果有乙個任務試圖獲得乙個已被持有的訊號量時,訊號量會將其推入等待佇列,然後讓其睡眠。這時處理器獲得自由去執行其它**。當持有訊號量的程序將訊號量釋放後,在等待佇列中的乙個任務將被喚醒,從而便可以獲得這個訊號量。

8. 任務排程的機制?

【二、本人碰到】

1. 嵌入式linux和wince作業系統的特點和特性?

2. 嵌入式linux中tty裝置驅動的體系結構?

3. 嵌入式裝置,為加快啟動速度,可以做哪些方面的優化?

4. usb裝置的列舉過程?

(1) get device descriptor。主機的第乙個命令要求得到裝置描述符,此

setup 

包為8 

個位元組資料(80,

06,00,

01,00,

00,40,

00),發向位址

0,埠0。

「40」

表示返回資料長度最大為

40h 

個位元組。實際上,只返回乙個包,即陣列

dev_desc[ ]

中的前8 

個位元組,用於說明裝置的描述符的真實長度和裝置的型別。

(2) set address。接著是設定裝置位址處理事件,主機傳送乙個含有指定位址的資料報(00,

05,02,

00,00,

00,00,

00),在主機只有乙個

usb 

裝置的時候,這個位址一般會是

2,最大位址

127,

usb 

協議中可以連線

127 

個裝置。設定位址事件處理結束後,裝置進入位址狀態,主機以後會在新的指定位址處訪問裝置。

(3) get device descriptor。主機再次傳送請求得到裝置描述符的資料報(80,

06,00,

01,00,

00,12,

00),與上次不同的是,要求的資料的長度是實際的資料長度,同時是傳送到

set address

命令所設定的位址。

(4) 讀取全部

configuration descriptor

。接著主機要求得到裝置全部的配置描述符、介面描述符和節點描述符(80,

06,00,

02,00,

00,40,

00),由於主機不知道裝置描述符的真實長度,因此它要求得到

64個位元組。

(5) set inte***ce,主機傳送資料報(01,

0b,00,

00,00,

00,00,

00),設定介面值為0。

(6) set conifguration,確定

usb裝置工作在哪乙個配置下。對於

u盤裝置來說,一般只有

1個配置值,其值為

01。主機傳送資料報(00,

09,01,

00,00,

00,00,

00)。

(7) 如果以上步驟都正確,主機將找到新裝置,並且配置成功,該裝置可以正常使用,可以進行後續的

u盤列舉過程了。

(8) 用

bushound

觀察計算機對於

u盤的列舉過程,發現上述步驟後還有乙個

getmaxlun

的操作,但是實際上對於

u盤來說忽略該步驟也沒有問題。

5. psram、sdram、ddr、ddr2的時序特性?

6. i2c觸控螢幕晶元與cpu的資料傳輸流程?畫出相關圖例?(這題目記得不是太清楚了,大概是考查i2c裝置驅動的資料傳輸過程)

linux驅動面試常見題目

from 1.linux核心裡面,記憶體申請有哪幾個函式,各自的區別?kmalloc get free page mempool create 2.irq和fiq有什麼區別,在cpu裡面是是怎麼做的?3.int a char b a 和 b本身是什麼型別?a b裡面本身存放的只是乙個位址,難道是這兩...

面試常見題目

static用途 1 全域性變數和區域性變數在記憶體中的區別 全域性變數 在記憶體的靜態儲存區 區域性變數 在記憶體的棧區 全域性變數如果不初始化,由編譯器自動初始化為0,區域性變數不初始化,結果未知 2 static全域性變數和普通全域性變數的區別 相同點 都儲存在靜態儲存區 不同點 作用域不同 ...

幾個Linux驅動面試題目

這幾天面試幾個想做安卓linux驅動的,總體感覺上驅動基礎還是比較薄弱,大部分情況是雖然做過驅動,但是基本上都是採用核心現成的,或者是開發板上已經有的,單獨寫過模組驅動很少,驅動機制理解不是很透徹.以下是幾個隨口問過的基礎問題,供參考.1 字元型驅動裝置你是怎麼建立裝置檔案的,就是 dev 下面的裝...