1 、如何自動建立設備文件?
class_create device_createlinux
二、led驅動編寫有幾種方式?
輸入子系統 字符設備驅動 總線platform led子系統數組
三、如何實現http服務器?
tcp服務器:socket緩存
四、如何編寫守護進程,簡述syslog的做用?
第一步:建立進程、殺死父進程
第二步:建立新的會話
第三步:改變工做路徑路徑
第四步:修改文件掩碼權限
第五步:關閉文件描述符服務器
五、bootloader和uboot的區別?
bootloader是啓動裝載。這是一段很小的程序,用於在系統上電啓動初期運行,
初始化關鍵接口,如內存,串口,關閉中斷,關閉看門狗,引導系統進入內核
的一段初始化的程序。它主要任務就是將內核映像從硬盤讀到RAM中,而後跳轉
到內核的入口點去運行內核,從而創建系統運行的必要環境。
uboot:是bootloader的一種網絡
六、如何移植uboot?
一、下載源碼
二、解壓uboot源碼並進入目錄
三、指定交叉編譯工具鏈
四、指定產品BOARD 底板
五、編譯u-boot多線程
七、傳感器驅動如何編寫?架構
八、BL0,BL1,BL2,BL3的做用?
BL0 文件是存放在 CPU 內部 IROM 中的一段固化代碼,CPU 上點以後,首先去
運行soc中的BL0,運行時會將 BL1 拷貝到 CPU 的 IRAM 中,而後執行BL1;BL1文件執行
起來以後會先進行內存的初始化,以後將 BL2 文件拷貝到外部內存中,BL2會初始化BL3
的運行環境,將BL3搬移到DRAM中,BL3會有一個自搬移的過程,從而啓動內核入口。
BL0:CPU內部的固化代碼
BL1:三星提供的加密文件
BL2:截取uboot.bin 前14k
BL3:剩下的uboot 執行命令以及加載引導內核
九、exynos4412 時鐘 APLL,MPLL,VPLL的區別?------倍頻鎖相環
APLL:用於 CPU_BLK (可產生高達1.4GHz的頻率);做爲 MPLL 的補充,它也能夠給
DMC_BLK 、LEFTBUS_BLK 、RIGHTBUS_BLK 和 CMU_TOP 提供時鐘。
MPLL:(可產生高達1GHz的頻率)用於DMC_BLK 、LEFTBUS_BLK 、RIGHTBUS_BLK 和
CMU_TOP。
EPLL :主要給音頻模塊提供時鐘,192MHz
VPLL :主要給視頻系統提供54MHz時鐘, 給 G3D(3D圖形加速器 )提供時鐘,或者是
1.1V下的440MHz。框架
十、arm中icache的做用
由於CPU的運行速度很快,而內存的速度比CPU的速度慢不少,由於icache是高速
緩存寄存器,將內存中的數據讀取到cache中,因此這樣會提升CPU的運行效率。 異步
十一、uboot啓動流程?
一、初始化異常向量表
二、關中斷,關看門狗,關MMU,關閉DCACHE,使能ICACHE
三、初始化時鐘
四、初始化DRAM
五、初始化串口
六、設置棧
七、清BSS段
八、重定位
九、進一步初始化硬件
十、啓動內核
一、初始化硬件
二、傳遞參數
三、啓動內核 socket
十二、標準IO和文件IO的區別?
標準io是帶緩存的,文件io不帶緩存
標準io是屬於庫,文件io屬於系統調用
標準io是流,文件io是文件描述符
標準io是一種特殊的文件io
1三、select,poll,epoll的區別?
(1)select,poll實現須要本身不斷輪詢全部fd集合,直到設備就緒,期間可
能要睡眠和喚醒屢次交替。而epoll其實也須要調用epoll_wait不斷輪詢就緒鏈表,期間
也可能屢次睡眠和喚醒交替,可是它是設備就緒時,調用回調函數,把就緒fd放入就緒鏈
表中,並喚醒在epoll_wait中進入睡眠的進程。雖然都要睡眠和交替,可是select和poll
在「醒着」的時候要遍歷整個fd集合,而epoll在「醒着」的時候只要判斷一下就緒鏈表
是否爲空就好了,這節省了大量的CPU時間。這就是回調機制帶來的性能提高。
(2)select,poll每次調用都要把fd集合從用戶態往內核態拷貝一次,而且要
把current往設備等待隊列中掛一次,而epoll只要一次拷貝,並且把current往等待隊列
上掛也只掛一次(在epoll_wait的開始,注意這裏的等待隊列並非設備等待隊列,只是
一個epoll內部定義的等待隊列)。這也能節省很多的開銷
1四、sysfs主要的做用?
sysfs文件系統不只能夠把設備(devices)和驅動程序(drivers) 的信息從內核
輸出到 用戶空間,也能夠用來對設備和驅動程序作設置,
sysfs 的目的是把一些本來在 procfs 中的,關於設備的部份,獨立出來,以‘
設備層次結構架構’(device tree)的形式呈現
1五、內核爲何要引入平臺總線?
是爲了使得驅動程序中的硬件信息和軟件分開
1六、字符設備驅動實現流程?
申請設備號
註冊設備號
調用file_operations函數
1七、內核中select和異步通知的區別?
1八、const int a,int const a, const int * a, const int const * a;
的區別?
const int a
int const a :表示都是int型變量a是隻讀的,不可寫。
const int * a:表示指針地址不能夠修改,爲只讀
const int const * a:表示指針*a和指針所指向的內容都是隻讀,不可修改
1九、inline的做用?
內聯函數,在程序設計的過程當中,爲了避免讓調用函數,使得程序跳來跳去,提供
程序的執行效率,用空間換取效率的一種手段
20、volatile 的做用?
防止編譯器的過分優化
1.中斷子服務的非自動變量
2.多線程中的被多個線程共享的變量
3.並行設備的硬件寄存器
21 、#ifndef define #end 的做用
防止在頭文件中重複定義
2二、設備樹中
reg interrupt-parent interrupts status pinctl-0 pinctl-name
compatible 表示什麼?
reg表示子節點數
interrupt-parent 表示中斷父節點
interrupts 中斷號
status 中斷的開啓狀態
pinctl-0
pinctl-name 中斷名字
compatible 匹配的中斷的兼容性
23.進程和線程區別?
進程的地址空間是獨立的。線程的地址空間共享的。
進程消耗的資源比較大,線程消耗的資源比較小
進程和進程通訊經過進程間通訊方式,線程和線程通訊經過全局變量。
24.fork和vfork的區別?
vfork保證子進程先運行,在他調用exec或者exit以後,父進程纔可能被調度運
行,若是在調用者兩個函數以前子進程依賴於父進程的動做,會致使死鎖
fork須要拷貝整個父進程的環境,而vfork不須要拷貝父進程的環境,在子進程
沒有調用exec或者exit以前,父進程u子進程共享環境,此時的父進程至關於阻塞等待
25.進程間通訊方式有幾種?每一種的特色?
8種通訊方式
有名管道
無名管道
信號
信號量
共享內存
消息隊列
套接字
26.字符型驅動設備你是怎麼建立設備文件的,就是/dev/下面的設備文件,供上層應用程
序打開使用的文件?
mknod手動進行建立
自動建立class_create
device_create
27.insmod 一個驅動模塊,會執行模塊中的哪一個函數?rmmod呢?這兩個函數在設計上要
注意哪些?遇到過卸載驅動出現異常沒?是什麼問題引發的?
會執行init函數,rmmod會執行exit函數
卸載模塊時曾出現卸載失敗的情形,緣由是存在進程正在使用模塊,檢查代碼後
發現產生了死鎖的問題。
評:要注意在init函數中申請的資源在exit函數中要釋放,包括存儲,ioremap,定時器
,工做隊列等等。也就是一個模塊註冊進內核,退出內核時要清理所帶來的影響,帶走一
切不留下一點痕跡。
28.static做用?
一、修飾全局變量,限制全局變量在該目錄下使用,不能被其餘文件使用
二、修飾函數,限制函數在該目錄下使用,不能被其餘文件使用
三、修飾局部變量,使得該局部變量生命週期變長,改變了存儲方式
29.inline的做用?
內聯函數,在程序設計的過程當中,爲了避免讓調用函數,使得程序跳來跳去,提供
程序的執行效率,用空間換取效率的一種手段
30.在驅動調試過程當中遇到過oops沒?你是怎麼處理的?
pc c
arm-none-linux-gnueabi-addr2line 地址 -e vmlinux -f
printk
彙編:
點燈
31.ioctl和unlock_ioctl有什麼區別?
ioctl是應用層的,unlock_ioctl是底層提供給應用層的接口 屬於內核層的
32.驅動中操做物理絕對地址爲何要先ioremap?
將一個IO地址空間映射到內核的虛擬地址空間上去。由於內核沒有辦法直接訪問
物理內存地址,必須先經過ioremap得到對應的虛擬地址。,便於訪問
33.設備驅動模型三個重要成員是?platfoem總線的匹配規則是?在具體應用上要不要先
注 冊驅動再註冊設備?有前後順序沒?
驅動 設備 總線
34.內核函數mmap的實現原理,機制?
map將一個文件或者其它對象映射進內存。文件被映射到多個頁上,若是文件
的大小不是全部頁的大小之和,最後一個頁不被使用的空間將會清零。mmap在用戶空間映
射調用系統中做用很大。
35.在Linux C中,ls這個命令是怎麼被執行的?
fork+exec
system("ls -l");
36.uboot是如何引導內核?
37.請從網卡、LCD驅動器、傳感器芯片中選擇一個或者2個(能夠以具體的芯片爲例),
對下面的問題作答:
1)若是是外部擴展芯片,請說出你用的芯片的型號
2)畫出上題中你選定相應硬件模塊與CPU的主要引腳連線
3) 編寫上題中你選定相應硬件模塊相應LINUX驅動的流程?
38.platform總線設備及總線設備如何編寫?
驅動 硬件
39.IIC原理,總線框架,設備編寫方法,i2c_msg
40.查看驅動模塊中打印信息應該使用什麼命令?如何查看內核中已有的字符設備的信息
?如何查看正在使用的有哪些中斷號?
dmesg cat /proc/devices
cat /proc/interrupt
41.中斷和輪詢哪一個效率高?怎樣決定是採用中斷方式仍是採用輪詢方式去實現驅動?
中斷是CPU處於被動狀態下來接受設備的信號,而輪詢是CPU主動去查詢該設備是
否有請求。
凡事都是兩面性,因此,看效率不能簡單的說那個效率高。若是是請求設備是一個頻
繁請求cpu的設備,
或者有大量數據請求的網絡設備,那麼輪詢的效率是比中斷高。若是是通常設備,
而且該設備請求cpu的頻率比較低,則用中斷效率要高一些。主要是看請求頻率。
4二、IIC,SPI,串口的區別?
SPI總線由三條信號線組成
串行時鐘(SCLK)、串行數據輸出(SDO)、串行數據輸入(SDI)。SPI總線能夠實現多個SPI設
備互相鏈接。提供SPI串行時鐘的SPI設備爲SPI主機或主設備(Master),其餘設備爲SPI從
機或從設備(Slave)。主從設備間能夠實現全雙工通訊,當有多個從設備時,還能夠增長
一條從設備選擇線
I2C總線是雙向、兩線(SCL、SDA)
具備總線仲裁機制,很是適合在器件之間進行近距離、非常常性的數據通訊。在
它的協議體系中,傳輸數據時都會帶上目的設備的設備地址
UART總線是異步串口,所以通常比前兩種同步串口的結構要複雜不少,通常由波
特率產生器(產生的波特率等於傳輸波特率的16倍)、UART接收器、UART發送器組成,硬件
上由兩根線,一根用於發送,一根用於接收
4三、輸入子系統分爲哪幾層?如何編寫設備驅動?
分爲三層:硬件驅動層、子系統核心層、事件處理層
編寫事件處理層
4四、TCP和udp的區別?
tcp:是基於鏈接的,可靠的一種通訊方式,而udp是不須要鏈接的,直接發送報
文
4五、用變量a給出下面的定義
a) 一個整型數(An integer)
b)一個指向整型數的指針( A pointer to an integer)
c)一個指向指針的的指針,它指向的指針是指向一個整型數( A pointer to a
pointer to an intege)r
d)一個有10個整型數的數組( An array of 10 integers)
e) 一個有10個指針的數組,該指針是指向一個整型數的。(An array of 10
pointers to integers)
f) 一個指向有10個整型數數組的指針( A pointer to an array of 10
integers)
g) 一個指向函數的指針,該函數有一個整型參數並返回一個整型數(A pointer
to a function that takes an integer as an argument and returns an integer)
h)一個有10個指針的數組,該指針指向一個函數,該函數有一個整型參數並返回
一個整型數( An array of ten pointers tofunctions that take an integer
argument and return an integer )
4六、中斷是嵌入式系統中重要的組成部分,這致使了不少編譯開發商提供一種擴展—讓標
準C支持中斷。具表明事實是,產生了一個新的關鍵字__interrupt。下面的代碼就使用了
__interrupt關鍵字去定義了一箇中斷服務子程序(ISR),請評論一下這段代碼的。
__interrupt double compute_area (double radius)
{
double area = PI * radius * radius;
printf("\nArea = %f", area);
return area;
}
中斷不能有返回值,不能使用printf函數,不能傳遞參數 不能進行浮點數計算
文中答案爲本人整理而獲得,不能保證百分之百正確,若有誤,請聯繫做者本人修改