1 、如何自動創建設備文件? class_create device_create 2、led驅動編寫有幾種方式? 輸入子系統 字元設備驅動 匯流排platform led子系統 3、如何實現http伺服器? tcp伺服器:socket 4、如何編寫守護進程,簡述syslog的作用? 第一步:創建進程 ...
1 、如何自動創建設備文件?
class_create device_create
2、led驅動編寫有幾種方式?
輸入子系統 字元設備驅動 匯流排platform led子系統
3、如何實現http伺服器?
tcp伺服器:socket
4、如何編寫守護進程,簡述syslog的作用?
第一步:創建進程、殺死父進程
第二步:創建新的會話
第三步:改變工作路徑路徑
第四步:修改文件掩碼許可權
第五步:關閉文件描述符
5、bootloader和uboot的區別?
bootloader是啟動裝載。這是一段很小的程式,用於在系統上電啟動初期運行,
初始化關鍵介面,如記憶體,串口,關閉中斷,關閉看門狗,引導系統進入內核
的一段初始化的程式。它主要任務就是將內核映像從硬碟讀到RAM中,然後跳轉
到內核的入口點去運行內核,從而建立系統運行的必要環境。
uboot:是bootloader的一種
6、如何移植uboot?
1、下載源碼
2、解壓uboot源碼併進入目錄
3、指定交叉編譯工具鏈
4、指定產品BOARD 底板
5、編譯u-boot
7、感測器驅動如何編寫?
8、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 執行命令以及載入引導內核
9、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。
10、arm中icache的作用
因為CPU的運行速度很快,而記憶體的速度比CPU的速度慢很多,因為icache是高速
緩存寄存器,將記憶體中的數據讀取到cache中,所以這樣會提高CPU的運行效率。
11、uboot啟動流程?
1、初始化異常向量表
2、關中斷,關看門狗,關MMU,關閉DCACHE,使能ICACHE
3、初始化時鐘
4、初始化DRAM
5、初始化串口
6、設置棧
7、清BSS段
8、重定位
9、進一步初始化硬體
10、啟動內核
1、初始化硬體
2、傳遞參數
3、啟動內核
12、標準IO和文件IO的區別?
標準io是帶緩存的,文件io不帶緩存
標準io是屬於庫,文件io屬於系統調用
標準io是流,文件io是文件描述符
標準io是一種特殊的文件io
13、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內部定義的等待隊列)。這也能節省不少的開銷
14、sysfs主要的作用?
sysfs文件系統不僅可以把設備(devices)和驅動程式(drivers) 的信息從內核
輸出到 用戶空間,也可以用來對設備和驅動程式做設置,
sysfs 的目的是把一些原本在 procfs 中的,關於設備的部份,獨立出來,以‘
設備層次結構架構’(device tree)的形式呈現
15、內核為什麼要引入平臺匯流排?
是為了使得驅動程式中的硬體信息和軟體分開
16、字元設備驅動實現流程?
申請設備號
註冊設備號
調用file_operations函數
17、內核中select和非同步通知的區別?
18、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和指針所指向的內容都是只讀,不可修改
19、inline的作用?
內聯函數,在程式設計的過程中,為了不讓調用函數,使得程式跳來跳去,提供
程式的執行效率,用空間換取效率的一種手段
20、volatile 的作用?
防止編譯器的過度優化
1.中斷子服務的非自動變數
2.多線程中的被多個線程共用的變數
3.並行設備的硬體寄存器
21 、#ifndef define #end 的作用
防止在頭文件中重覆定義
22、設備樹中
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作用?
1、修飾全局變數,限制全局變數在該目錄下使用,不能被其他文件使用
2、修飾函數,限制函數在該目錄下使用,不能被其他文件使用
3、修飾局部變數,使得該局部變數生命周期變長,改變了存儲方式
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的頻率比較低,則用中斷效率要高一些。主要是看請求頻率。
42、IIC,SPI,串口的區別?
SPI匯流排由三條信號線組成
串列時鐘(SCLK)、串列數據輸出(SDO)、串列數據輸入(SDI)。SPI匯流排可以實現多個SPI設
備互相連接。提供SPI串列時鐘的SPI設備為SPI主機或主設備(Master),其他設備為SPI從
機或從設備(Slave)。主從設備間可以實現全雙工通信,當有多個從設備時,還可以增加
一條從設備選擇線
I2C匯流排是雙向、兩線(SCL、SDA)
具有匯流排仲裁機制,非常適合在器件之間進行近距離、非經常性的數據通信。在
它的協議體系中,傳輸數據時都會帶上目的設備的設備地址
UART匯流排是非同步串口,因此一般比前兩種同步串口的結構要複雜很多,一般由波
特率產生器(產生的波特率等於傳輸波特率的16倍)、UART接收器、UART發送器組成,硬體
上由兩根線,一根用於發送,一根用於接收
43、輸入子系統分為哪幾層?如何編寫設備驅動?
分為三層:硬體驅動層、子系統核心層、事件處理層
編寫事件處理層
44、TCP和udp的區別?
tcp:是基於連接的,可靠的一種通信方式,而udp是不需要連接的,直接發送報
文
45、用變數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 )
46、中斷是嵌入式系統中重要的組成部分,這導致了很多編譯開發商提供一種擴展—讓標
準C支持中斷。具代表事實是,產生了一個新的關鍵字__interrupt。下麵的代碼就使用了
__interrupt關鍵字去定義了一個中斷服務子程式(ISR),請評論一下這段代碼的。
__interrupt double compute_area (double radius)
{
double area = PI * radius * radius;
printf("\nArea = %f", area);
return area;
}
中斷不能有返回值,不能使用printf函數,不能傳遞參數 不能進行浮點數計算
文中答案為本人整理而得到,不能保證百分之百正確,如有誤,請聯繫作者本人修改