Linux驅動面試題

Linux驅動面試題
1、 Linux設備中字符設備與塊設備有什麼主要的區別?請分別列舉一些實際的設備說出它們是屬於哪一類設備。

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

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

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

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

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

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

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

3、Linux中引入模塊機制有什麼好處?

首先,模塊是預先註冊自己以便服務於將來的某個請求,然後他的初始化函數就立即結束。換句話說,模塊初始化函數的任務就是爲以後調用函數預先作準備。

好處:

  1. 應用程序在退出時,可以不管資源的釋放或者其他的清除工作,但是模塊的退出函數卻必須仔細此撤銷初始化函數所作的一切。

  2. 該機制有助於縮短模塊的開發週期。即:註冊和卸載都很靈活方便。

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

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

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

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

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

2)chartest 由驅動程序4管理,該文件所指的設備是64號設備。(感覺類似於串口終端或者字符設備終端)。

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

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

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

該註冊函數可以將cdev結構嵌入到自己的設備特定的結構中。cdev是一個指向結構體cdev的指針,而fops是指向一個類似於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結構。

7、請簡述中斷於DMA的區別。Linux設備驅動程序中,使用哪個函數註冊和註銷中斷處理程序?

1)DMA:是一種無須CPU的參與就可以讓外設與系統內存之間進行雙向數據傳輸的硬件機制,使用DMA可以使系統CPU從實際的I/O數據傳輸過程中擺脫出來,從而大大提高系統的吞吐率.

中斷:是指CPU在執行程序的過程中,出現了某些突發事件時CPU必須暫停執行當前的程序,轉去處理突發事件,處理完畢後CPU又返回源程序被中斷的位置並繼續執行。

所以中斷和DMA的區別就是DMA不需CPU參與而中斷是需要CPU參與的。

2)中斷註冊函數和中斷註銷函數

註冊中斷:

int request_irq(unsigned int irq, irqreturn_t (*handler)(int, void *, struct pt_regs *), unsigned long flags, const char *dev_name, void *dev_id);

參數意義依次是:中斷號,中斷處理函數,中斷管理有關的掩碼,中斷請求設備名,中斷信號線。

過程是:dev_name設備請求中斷->cpu分配中斷號->設置中斷管理的掩碼->分配中斷信號線->處理中斷函數->完成之後再根據設置情況返回原處理程序處繼續處理程序。

註銷中斷

Void free_irq(unsigned int irq, void *dev_id);

釋放中斷和中斷信號線

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

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

9、簡單描述在cs8900的驅動設計中, 發送數據frame和接收數據frame的過程。

1)發送流程如下:

(1) 網絡設備驅動程序從上層協議傳遞過來的sk_buff參數獲得數據包的有效數據和長度,將有效數據放入臨時緩衝區。

(2) 對於以太網,如果有效數據的長度小於以太網衝突檢測所要求的數據楨的最小長度,則給臨時緩衝區的末尾填充0

(3) 設置硬件寄存器,驅使網絡設備進行數據發送操作。

2)接收流程

網絡設備接收數據主要是由中斷引發設備的中斷處理函數,中斷處理函數判斷中斷類型,如果爲接收中斷,則讀取接受到的數據,分配sk_buff數據結構和數據緩衝區,將接收到的數據複製到數據緩衝區,並調用netif_rx()函數將sk_buff傳遞給上層協議。

10、Cs8900.c的驅動中,發送數據frame的過程爲什麼需要關中斷?接收數據frame的過程爲什麼不需要關中斷?

在發送過程中是不能被打斷的,在發送的過程中,不關中斷,這時候如果有一箇中斷到來,那麼cpu有可能會去相應該中斷,如果該中斷需要改寫的數據是發送數據的緩衝區,那麼緩衝區將被改寫,這樣即使cpu相應完畢該中斷,再發送數據,接收方也不認識該數據不能接收。

在接收數據的時候,需要打開中斷,是因爲要及時的相應接收到的數據。如果關閉該中斷,那麼接收方有可能因爲相應優先級高的中斷而接收不到該數據。

11、簡單描述skbuff這個數據結構在網絡結構中所起到的作用,爲什麼需要一個skbuff,它的分配和釋放主要都在什麼部位

sk_buff結構非常重要,它的含義爲“套接字緩衝區”,用於在linux網絡子系統中的蓋層之間傳遞數據。

當發送數據包時,linux內核的網絡處理模塊必須建立一個包含要傳輸的數據包的sk_buff,然後將sk_buff遞交給下層,各層在sk_buff中添加不同的協議頭直至交給網絡設備發送。同樣的,當網絡設備從網絡媒介上接受到數據包後,它必須將接受到的數據轉換爲sk_buff數據結構並傳遞給上層,蓋層不拋去相應的協議頭直至交給用戶。分配sk_buff在接受一開始就應該分配,在發送完畢數據之後可以釋放sk_buff

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

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

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

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

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

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

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

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

14、自旋鎖和信號量在互斥使用時需要注意哪些?在中斷服務程序裏面的互斥是使用自旋鎖還是信號量?還是兩者都能用?爲什麼?

使用自旋鎖的進程不能睡眠,使用信號量的進程可以睡眠。

中斷服務例程中的互斥使用的是自旋鎖,原因是在中斷處理例程中,硬中斷是關閉的;但是要注意這樣會丟失可能到來的中斷。

15、原子操作你怎麼理解?爲了實現一個互斥,自己定義一個變量作爲標記來作爲一個資源只有一個使用者行不行?

原子操作指的是無法被打斷的操作。

第二句話的意思是:

定義一個變量,比如

  int flag =0;

  if(flag == 0)
  {
     flag = 1;
     操作臨界區;
     flag = 0;
  }

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

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

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

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

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

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

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

platfoem總線的匹配規則是:要匹配的設備和驅動都要註冊;

19、linux內核裏面,內存申請有哪幾個函數,各自的區別?

Kmalloc() __get_free_page() mempool_create()

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

21

int *a;
char *b;

a 和 b本身是什麼類型?

a、b裏面本身存放的只是一個地址,難道是這兩個地址有不同麼?

22、 中斷的上半部分和下半部分的問題:講下分成上半部分和下半部分的原因,爲何要分?講下如何實現?

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

Linux的底半處理實際上是建立在內核的軟中斷機制上的.如何實現該機制?

兩種方式

【tasklet 工作隊列】

1.定義和初始化

struct tasklet_struct tlet;

tasklet_init(&tlet, jit_tasklet_fn, (unsigned long) data);
參數
第一個:定義的tasklet變量
第二個:函數
第三個:數據  傳遞給回調函數的數據

2. 定義函數

void jit_tasklet_fn(unsigned long arg)
{
	//中斷的底半部 
	執行該函數的時候,已經出中斷了
	printk("in jit_tasklet_fn  jiffies=%ld\n",jiffies);
}

3. 在需要調度的地方調用以下函數

tasklet_schedule(&tlet);

一般在中斷函數當中調度在不晚於下一個時鐘滴答之前執行

【tasklet 和定期器的區別】

1. 執行時間

定時器的執行:時間是確定的
tasklet :不確定的

2.tasklet 執行耗時的操作的

23、內核函數mmap的實現原理,機制?

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

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

25、spinlock自旋鎖是如何實現的?

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

26、信號量簡介

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

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

27、 任務調度的機制?

28、什麼是GPIO?

general purpose input/output

GPIO是相對於芯片本身而言的,如某個管腳是芯片的GPIO腳,則該腳可作爲輸入或輸出高或低電平使用,當然某個腳具有複用的功能,即可做GPIO也可做其他用途。 也就是說你可以把這些引腳拿來用作任何一般用途的輸入輸出,例如用一根引腳連到led的一極來控制它的亮滅,也可以用一根(一些)引腳連到一個傳感器上以獲得該傳感器的狀態,這給cpu提供了一個方便的控制周邊設備的途經。如果沒有足夠多的gpio管腳,在控制一些外圍設備時就會力有不逮,這時可採取的方案是使用CPLD來幫助管理。

29、在Linux C中,ls這個命令是怎麼被執行的?

使用fork創建一個進程或exec函數族覆蓋原進程。

30、LINUX下的Socket套接字和Windows下的WinSock有什麼共同點?請從C/C++語言

a)都基於TCP/IP協議,都提供了面向連接的TCP SOCK和無連接的UDP SOCK。

b)都是一個sock結構體。

c)都是使用sock文件句柄進行訪問。

d)都具有緩衝機制。

31、一個計劃跑LINUX系統的ARM系統把bootloader燒錄進去後,上電後串口上沒有任何輸出,硬件和軟件各應該去檢查什麼?

提示: 1.跑LINUX的系統一般都需要外擴DRAM,一般的系統也經常有NOR或NAND FLASH

bootloader一般是由彙編和C編寫的裸奔程序[5分]

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進程/孤兒進程

常見linux驅動面試題

1、驅動中操作物理絕對地址爲什麼要先ioremap?
因爲在內核中操作的都是虛擬地址,內核訪問不到物理地址,只能通過ioremap映射爲虛擬地址 內核才能訪問此內存空間

2、設備驅動模型三個重要成員是?platform總線的匹配規則是?在具體應用上要不要先註冊驅動再註冊設備?有先後順序沒?
設備驅動模型的三個重要成員是總線,驅動,設備。
platfoem總線的匹配規則是:要匹配的設備和驅動都要註冊,驅動和設備的匹配規則如下
1.基於設備樹風格的匹配
2.匹配ID表(即platform_device設備名是否出現在platform_driver的id表內)
3.匹配platform_device設備名和驅動的名字
4.基於ACPI風格的匹配

3、中斷的上半部分和下半部分的問題:請說明分成上半部分和下半部分的原因,爲何要分?該如何實現?
中斷分成上半部分和下班部分的原因主要是因爲內核要保證內核中進程的正常調度和運行,中斷程序所以需要短小精悍,但是有些驅動在中斷處理程序需要完成大量的工作,所以就很耗時。爲了解決這個問題就Linux 將中斷
處理程序分解爲兩個半部:頂半部(top half)和底半部(bottom half)。頂半部完成儘可能少的比較緊急的功能,底半部就由tasklet或者工作隊列的方法實現 具體的實現效果如下

1.定義和初始化

struct tasklet_struct tlet;
tasklet_init(&tlet, jit_tasklet_fn, (unsigned long) data);
參數
第一個:定義的tasklet變量
第二個:函數
第三個:數據  傳遞給回調函數的數據

2. 定義函數

void jit_tasklet_fn(unsigned long arg)
{
//中斷的底半部  執行該函數的時候,已經出中斷了
printk("in jit_tasklet_fn  jiffies=%ld\n",jiffies);
}

3. 在需要調度的地方調用以下函數

tasklet_schedule(&tlet);

一般在中斷函數當中調度在不晚於下一個時鐘滴答之前執行

【tasklet 和定時器的區別】
1. 執行時間
定時器的執行:時間是確定的
tasklet:不確定的

2.tasklet 執行耗時的操作的

4、自旋鎖和信號量在互斥使用時需要注意哪些?在中斷服務程序裏面的互斥是使用自旋鎖還是信號量?還是兩者都能用?爲什麼?
使用自旋鎖的進程不能睡眠,使用信號量的進程可以睡眠。
中斷服務例程中的互斥使用的是自旋鎖,原因是在中斷處理例程中,硬中斷是關閉的;但是要注意這樣會丟失可能到來的中斷。
5、原子操作你怎麼理解?爲了實現一個互斥,自己定義一個變量作爲標記來作爲一個資源只有一個使用者行不行?
原子操作指的是無法被打斷的操作。
第二句話的意思是:
定義一個變量,比如 int flag =0;

if(flag == 0) 
{ 
	flag = 1;
	操作臨界區;
	flag = 0;
}

6、insmod 一個驅動模塊,會執行模塊中的哪個函數?rmmod呢?這兩個函數在設計上要注意哪些?遇到過卸載驅動出現異常沒?是什麼問題引起的?
insmod調用init函數,rmmod調用exit函數。這兩個函數在設計時 要注意在init函數中申請的資源在exit函數中要釋放,包括存儲,ioremap,定時器,工作隊列等等。也就是一個模塊註冊進內核,退出內核時要清理所帶來的影響,帶走一切不留下一點痕跡。
卸載模塊時曾出現卸載失敗的情形,原因是存在進程正在使用模塊,檢查代碼後發現產生了死鎖的問題。

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是指向一個類似於file_operations結構(可以是file_operations結構,但不限於該結構)的指針.

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

10、 Linux設備中字符設備與塊設備有什麼主要的區別?請分別列舉一些實際的設備說出它們是屬於哪一類設備。
字符設備:字符設備是個能夠像字節流(類似文件)一樣被訪問的設備,由字符設備驅動程序來實現這種特性。字符設備驅動程序通常至少實現open,close,read和write系統調用。字符終端、串口、鼠標、鍵盤、攝像頭、聲卡和顯卡等就是典型的字符設備。

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

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

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

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

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

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

12、linux中引入模塊機制有什麼好處?
首先,模塊是預先註冊自己以便服務於將來的某個請求,然後他的初始化函數就立即結束。換句話說,模塊初始化函數的任務就是爲以後調用函數預先作準備。
好處:

  1. 應用程序在退出時,可以不管資源的釋放或者其他的清除工作,但是模塊的退出函數卻必須仔細此撤銷初始化函數所作的一切。
  2. 該機制有助於縮短模塊的開發週期。即:註冊和卸載都很靈活方便。

二分查找
校驗
關於字符串:
關於數據結構
關於其他簡答題:
關於編程
(一) 1.5n次比較,求出數組的最大值和最小值(數組亂序)
(二) 環形緩衝區,用數據結構實現?
(三) 鏈表的刪除,頭部插入,尾部插入實現?
(四) 求出一個字符串的最長重複串,如“ababc”,返回“ab”
(五) 求出一個週期字符串的最長週期,如“abcabc”,返回3
(六) 使用C/C++實現一個單向鏈表,鏈表需要支持如下接口:
(七) 網絡字節序轉換,大端小端。
(八) 打開一個設備,讀取文件,打印輸出。
(九) 給一個整數,轉換爲十六進制字符輸出
(十) 給在 32 位處理器上,將任一整數轉換爲二進制形式。
C語言宏中”#”和”##”的用法
關於IPv6:
Arm有多少32位寄存器?
HAL層:硬件抽象層
Arm2440和6410有什麼區別?
開發板時鐘(2410和6410對比)什麼是PLL(鎖相環):
Arm開發板的資源,主頻多大?內存多大?
CPU,MPU,MCU,SOC,SOPC聯繫與差別
線程池怎麼設計
(一) 什麼是線程池?
(二) 爲什麼要用線程池?
(三) 線程的工作流程
(四) 線程池設計
free函數怎麼知道釋放內存大小
構造函數和析構函數拋出異常
tcp/udp上層網絡協議舉例並說明原理
(一) HTTP:
(二) TFTP:
關於內存泄漏
一個服務器對10000客戶端,服務器上的線程模型
代碼效率優化怎麼搞
GPIO三種狀態:輸入輸出和高阻態
上拉和下拉:
GPIO外部有三種情況:1)直接接地2)直接接電源3)懸掛。請問在GPIO內部可以實現上拉和下拉的情況下如何判斷這三種情況?
串口協議講一講?
RS232和RS485通訊接口有什麼區別?
IIC時序圖畫一下,IIC有哪些狀態,給一個字節,將它發送出去。IIC有什麼注意事項?有沒有用I/O模擬IIC,如果有需要注意什麼?
講解一下IIC總線
Bootloader的流程
爲什麼2440的內存起始地址是3後面7個0呢?
爲什麼6410的內存起始地址是5後面7個0呢?
三個字節char型,上電爲隨機數,求三者之和爲零的概率
VS中Debug和Release的區別
Zigbee的傳輸速率多大?(智能家居)爲什麼用它,和其他傳輸有什麼區別?WIFI安全嗎,爲什麼?
用戶和內核如何通訊?(追問:驅動程序中如何從用戶到內核)
計算機訪問哪個最快?
線程和進程的區別?
設計模式有哪些?
軟件的設計流程?
指針和引用的區別?
內存管理有什麼看法?(MMU)
鎖有哪些?有什麼注意事項
信號量和自旋鎖區別
中斷能不能睡眠,爲什麼?下半部能不能睡眠?
上下文有哪些?怎麼理解?
死鎖產生的原因及四個必要條件
驅動中首先執行什麼?
觸摸屏和lCD驅動中做了什麼,流程是什麼?
輸入子系統上報系統有什麼函數?怎麼知道有沒有上報成功?
總線設備驅動模型之間是什麼關係?設備和驅動之間的如何匹配,匹配規則是否可變?
什麼是交叉編譯?爲什麼需要交叉編譯?爲什麼還要主機編譯
簡述linux系統啓動過程
Linux設備中字符設備和塊設備有什麼主要區別?分別舉例。
主設備號和次設備號的用途
Linux下rs232和rs485編程有什麼區別?
Uart和IIC和SPI的區別(提示:關於異步和同步,電子器件上的)?
用串口發送十個字節就丟失一個兩個你會怎樣檢查;發送的時候對方設備不響應你該怎麼辦
IIC,scl頻率多大
觸摸屏中斷做了什麼,LCD中斷做了什麼?
zigbee用的哪家方案?zigbee端點類型有哪些,這些概念的區別?端點能夠中轉嗎?一個端點上有哪些設備?你做的項目或者實踐有多少節點?zigbee上有操作系統嗎?
客戶端是否單獨連接服務器(客戶端和客戶端直接是否點對點連接)?客戶端之間有沒有交互?有沒有考慮服務器進程如果崩潰了,客戶端資源沒有得到釋放怎麼做?那麼如果服務器正常,客戶端中途斷開連接怎麼辦?如果發送文件,是直接點對點嗎,也就是客戶端之間直接通訊?線程池中線程之間是分離的嗎?
沒有使用MySQL之類的嗎?sqlite是線程安全的嗎
視頻監控系統這個項目能不能做圖像的簡單處理,比如截取?網頁中如果要打印換行符,怎麼打印?這個項目中做的驅動中,你這個視頻子系統用的是不是內核的?
QT,用的熟嗎?做的驅動有沒有編入內核?既然沒有編入內核,那是需要手動去啓動和裝載嗎?需不需要創建設備節點?用戶是如何訪問這些驅動的?做的驅動都是字符設備嗎?
你這個項目中zigbee用的是哪家的方案?控制設備有哪些?有多少節點?也就是說只是一對用於通訊是嗎?。
線程和進程,爲什麼選擇線程?線程爲什麼佔用更少的資源?線程共享進程的哪些資源?線程池如何實現的?是不是什麼都用線程比較好?
畫一下Arm的體系架構
以下圖片是哪種語言
typedef struct _MAD_SYS_CONFIG{ MAD_U32 smiBase,…}MAD_SYS_CONFIG_t;
typedef struct {MAD_U32 smiBase,…} MAD_SYS_CONFIG; 這兩種寫法是一個意思嗎?
關注過哪些開源的東西?
內核定時器如何實現(通過鏈表)?如何找到具體的鏈表?
內核鏈表爲什麼具有通用性?
網盤妙傳功能如何實現?
用戶態和內核態通信方式?
分配內存哪些函數?kmalloc有兩個參數,各個作用是什麼?
有哪些鎖,各自的效率問題?自選鎖怎樣實現的?
孤兒進程與殭屍進程[總結]和守護進程如何實現?
第三個項目是如何處理併發的,除了線程池還有更好的哪些方法?
主線程如何知道子線程的退出?
講解下內核網絡體系?
軟中斷是如何實現的?
對內存管理有什麼看法和了解?
哈希表原理?針對字符串,如何確定key值(hash表存儲字符串時,key怎麼確定)?map怎樣實現的?map和哈西表不一樣吧?Hash和B樹的區別?
接觸過哪些STL容器?哪個效率最高?
寫驅動的時候有沒有遇到問題,怎麼檢查?有沒有遇到coredump?
應用程序如果運行時出現錯誤該怎麼排查;如果越界該怎麼排查?
open和fopen有什麼區別?read/write和fread/fwrite區別?
線程池如何使用創建的?讓你自己寫一個線程池怎麼實現?
主線程如何檢測一個子線程也就是客戶端的退出?如果現在讓你實現可以瀏覽文件夾裏文件再傳輸,你會怎麼做?

我相信如果能搞懂以上問題,面試什麼的便沒有問題。

HR面試題

正常的HR面試:
平時喜歡幹什麼
高考情況,成績,考研情況,成績

特此列出部分我認爲具有挑戰性的問題:

中科創達HR面

  1. 自我介紹下。被打斷【她說不好意思注意回說謝謝,同時還要記得自己說到哪裏】然後再次打斷她沒有讓你繼續自我介紹。到此自我介紹便結束。
  2. 你家在哪,這些項目都是你做的嗎?有沒有讓自己感到很挫敗的事情?同學周圍的人對你是怎麼評價的?你的缺點是什麼?【老掉牙的問題】
  3. 分配任務,你和另外一個人合作,主要都是你做的,但是上級不知道,把功勞主要分給了另個人,你會怎麼想。我首先講了自己學習到的很多,並不會太在意!然後她追問:如果一直出現這個問題,你會怎麼樣。【先軟後硬】
  4. 分配一個任務,由你和另外一個人完成,你只能藉助他完成,因爲其能力比你強,如果他和你格格不入,你會怎麼辦?如果一直這樣你會怎麼辦?【先自身後他人,結合團體公司利益闡述,最後可上升到公司層面】
  5. 我們公司有兩種,一個是個人負責項目,成就感更好,一個是和同事一起做項目,你傾向於哪種?我說:可以和能力高於我的一起合作,並沒有特定要求個人自己做。追問:如果有人能力不行怎麼辦?我說:沒有關係,可以帶。追問:不是託你後腿嗎。我說:教同事,能提高自己,給予會帶來回報,而且自己會的並不算真正會,把別人教會了纔算。【注意這裏的陷阱,一定要選擇團隊項目】

中興HR面

  1. 你是如何完成一個分配給你的任務的?
  2. 在你做的這些項目中有沒有很難忘的困難或者經歷,那你有沒有想過,如果現在回想這個困難如何更好地去解決?【考察你的即時總結和部分記憶力的能力+真實性考察】
  3. 這些項目都比較閒散,和真正工作的時候不一樣,不能這塊沒有做好放一段時間,那你怎麼辦?【實戰和訓練的區別,可自由發揮】

博客寫完,浙江大華和中興的offer還沒有消息,雖然手裏有了9個offer,但是隻有那幾個是比較中意的。最後祝大家能夠有博主的好運,願都能找到自己的歸處。Best wishes to you!!

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