Linux驅動面試題

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

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

    塊設備:和字符設備相似,塊設備也是經過/dev目錄下的文件系統節點來訪問。塊設備上可以容納文件系統,如:u盤,SD卡,磁盤等。面試

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

 

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

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

2) 查看字符設備信息能夠用lsmod modprobe,lsmod能夠查看模塊的依賴關係,modprobe在加載模塊時會加載其餘依賴的模塊。設計模式

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


三、Linux中引入模塊機制有什麼好處?
數組

       首先,模塊是預先註冊本身以便服務於未來的某個請求,而後他的初始化函數就當即結束。換句話說,模塊初始化函數的任務就是爲之後調用函數預先做準備安全

好處:服務器

1) 應用程序在退出時,能夠無論資源的釋放或者其餘的清除工做,可是模塊的退出函數卻必須仔細此撤銷初始化函數所做的一切。

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

 

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

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

 

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

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

   次設備號:次設備號由內核使用,用於正確肯定設備文件所指的設備。依賴於驅動程序的編寫方式,咱們能夠經過次設備號得到一個指向內核設備的直接指針,也可將此設備號看成設備本地數組的索引。

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


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

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

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結構

 

七、請簡述中斷於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);

釋放中斷和中斷信號線

 

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

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

 

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

1)發送流程以下:

(1) 網絡設備驅動程序從上層協議傳遞過來的sk_buff參數得到數據包的有效數據和長度,將有效數據放入臨時緩衝區。
(2) 對於以太網,若是有效數據的長度小於以太網衝突檢測所要求的數據楨的最小長度,則給臨時緩衝區的末尾填充0
(3) 設置硬件寄存器,驅使網絡設備進行數據發送操做。

2)接收流程

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


十、Cs8900.c的驅動中,發送數據frame的過程爲何須要關中斷?接收數據frame的過程爲何不須要關中斷?

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

      在接收數據的時候,須要打開中斷,是由於要及時的相應接收到的數據。若是關閉該中斷,那麼接收方有可能由於相應優先級高的中斷而接收不到該數據。

 

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

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

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

 

十二、字符型驅動設備怎麼建立設備文件

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

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

 

1三、寫一箇中斷服務須要注意哪些?若是中斷產生以後要作比較多的事情你是怎麼作的?

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

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

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

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

 

1四、自旋鎖和信號量在互斥使用時須要注意哪些?在中斷服務程序裏面的互斥是使用自旋鎖仍是信號量?仍是二者都能用?爲何?

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

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

 

1五、原子操做你怎麼理解?爲了實現一個互斥,本身定義一個變量做爲標記來做爲一個資源只有一個使用者行不行?

        原子操做指的是沒法被打斷的操做。

        第二句話的意思是:

  定義一個變量,好比 int flag =0;

   if(flag == 0)
  {
       flag = 1;


       操做臨界區;
      flag = 0;
   }

 

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

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

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

 

1七、驅動中操做物理絕對地址爲何要先ioremap?

        由於內核沒有辦法直接訪問物理內存地址,必須先經過ioremap得到對應的虛擬地址

 

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

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

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

 

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

         Kmalloc()   __get_free_page()  mempool_create()  

 

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


21

int *a;
char *b;

a 和 b自己是什麼類型?

a、b裏面自己存放的只是一個地址,難道是這兩個地址有不一樣麼?


2二、 中斷的上半部分和下半部分的問題:講下分紅上半部分和下半部分的緣由,爲什麼要分?講下如何實現?

         上半部分執行與硬件相關的處理要求快, 而有些驅動在中斷處理程序中又須要完成大量工做,這構成矛盾,因此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 執行耗時的操做的

 

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

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

 

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

 

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

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



2六、信號量簡介

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

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

 

2七、 任務調度的機制?

 

2八、什麼是GPIO?

         general purpose input/output  

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

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

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

 

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

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

b)都是一個sock結構體。

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

d)都具備緩衝機制。

                
3一、一個計劃跑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驅動面試題

 

 

一、驅動中操做物理絕對地址爲何要先ioremap?
由於在內核中操做的都是虛擬地址,內核訪問不到物理地址,只能經過ioremap映射爲虛擬地址 內核才能訪問此內存空間

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

三、中斷的上半部分和下半部分的問題:請說明分紅上半部分和下半部分的緣由,爲什麼要分?該如何實現?
中斷分紅上半部分和下班部分的緣由主要是由於內核要保證內核中進程的正常調度和運行,中斷程序因此須要短小精悍,可是有些驅動在中斷處理程序須要完成大量的工做,因此就很耗時。爲了解決這個問題就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 執行耗時的操做的 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

四、自旋鎖和信號量在互斥使用時須要注意哪些?在中斷服務程序裏面的互斥是使用自旋鎖仍是信號量?仍是二者都能用?爲何?
使用自旋鎖的進程不能睡眠,使用信號量的進程能夠睡眠。
中斷服務例程中的互斥使用的是自旋鎖,緣由是在中斷處理例程中,硬中斷是關閉的;可是要注意這樣會丟失可能到來的中斷。
五、原子操做你怎麼理解?爲了實現一個互斥,本身定義一個變量做爲標記來做爲一個資源只有一個使用者行不行?
原子操做指的是沒法被打斷的操做。
第二句話的意思是:
定義一個變量,好比 int flag =0;
if(flag == 0)
{
flag = 1;

操做臨界區;
  flag = 0;
  • 1
  • 2
  • 3

}

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

七、 copy_to_user()和copy_from_user()主要用於實現什麼功能?通常用於file_operations結構的哪些函數裏面?
因爲內核空間和用戶空間是不能互相訪問的,若是須要訪問就必須藉助內核函數進行數據讀寫。copy_to_user():完成內核空間到用戶空間的複製,copy_from_user():是完成用戶空間到內核空間的複製。通常用於file_operations結構裏的read,write,ioctl等內存數據交換做用的函數。固然,若是ioctl沒有用到內存數據複製,那麼就不會用到這兩個函數。

八、請簡述主設備號和次設備號的用途。若是執行mknod chartest c 4 64,建立chartest設備。請分析chartest使用的是那一類設備驅動程序。
1)主設備號:主設備號標識設備對應的驅動程序。雖然現代的linux內核容許多個驅動程序共享主設備號,但咱們看待的大多數設備仍然按照「一個主設備對應一個驅動程序」的原則組織。

次設備號:次設備號由內核使用,用於正確肯定設備文件所指的設備。依賴於驅動程序的編寫方式,咱們能夠經過次設備號得到一個指向內核設備的直接指針,也可將此設備號看成設備本地數組的索引。

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

九、設備驅動程序中如何註冊一個字符設備?分別解釋一下它的幾個參數的含義。
註冊一個字符設備驅動有兩種方法:
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結構。

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

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

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

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

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

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

十二、linux中引入模塊機制有什麼好處?
首先,模塊是預先註冊本身以便服務於未來的某個請求,而後他的初始化函數就當即結束。換句話說,模塊初始化函數的任務就是爲之後調用函數預先做準備。
好處:
1) 應用程序在退出時,能夠無論資源的釋放或者其餘的清除工做,可是模塊的退出函數卻必須仔細此撤銷初始化函數所做的一切。
2) 該機制有助於縮短模塊的開發週期。即:註冊和卸載都很靈活方便。

 

 

 

 

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

 

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

 

HR面試題

 

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

 

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

 

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

 

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

 

博客寫完,浙江大華和中興的offer尚未消息,雖然手裏有了9個offer,可是隻有那幾個是比較中意的。最後祝你們可以有博主的好運,願都能找到本身的歸處。Best wishes to you!!

相關文章
相關標籤/搜索