導航:首頁 > 編程系統 > linux設備驅動考試試題

linux設備驅動考試試題

發布時間:2023-08-18 18:43:33

『壹』 linux驅動程序開發實例的目錄

前言
第1章 Linux設備驅動程序模型 1
1.1 設備驅動程序基礎 1
1.1.1 驅動程序的概念 1
1.1.2 驅動程序的載入方式 2
1.1.3 編寫可載入模塊 3
1.1.4 帶參數的可載入模塊 5
1.1.5 設備驅動程序的分類 6
1.2 字元設備驅動程序原理 7
1.2.1 file_operations結構 7
1.2.2 使用register_chrdev注冊字元
設備 9
1.2.3 使用cdev_add注冊字元設備 11
1.2.4 字元設備的讀寫 13
1.2.5 ioctl介面 14
1.2.6 seek介面 16
1.2.7 poll介面 18
1.2.8 非同步通知 22
1.3 proc文件系統 24
1.3.1 proc文件系統概述 24
1.3.2 seq_file機制 25
1.3.3 使用proc文件系統 27
1.4 塊設備驅動程序 32
1.4.1 Linux塊設備驅動程序原理 32
1.4.2 簡單的塊設備驅動程序實例 35
1.5 網路設備驅動程序 39
1.5.1 網路設備的特殊性 39
1.5.2 sk_buff結構 40
1.5.3 Linux網路設備驅動程序架構 42
1.5.4 虛擬網路設備驅動程序實例 46
1.6 Linux 2.6設備管理機制 50
1.6.1 kobject和kset 50
1.6.2 sysfs文件系統 51
1.6.3 設備模型層次 52
1.6.4 platform的概念 54
第2章 Linux內核同步機制 58
2.1 鎖機制 58
2.1.1 自旋鎖 58
2.1.2 讀寫鎖 60
2.1.3 RCU 61
2.2 互斥 64
2.2.1 原子操作 64
2.2.2 信號量 65
2.2.3 讀寫信號量 67
2.3 等待隊列 68
2.3.1 等待隊列原理 68
2.3.2 阻塞式I/O實例 68
2.3.3 完成事件 70
2.4 關閉中斷 71
第3章 內存管理與鏈表 72
3.1 物理地址和虛擬地址 72
3.2 內存分配與釋放 72
3.3 IO埠到虛擬地址的映射 73
3.3.1 靜態映射 73
3.3.2 動態映射 75
3.4 內核空間到用戶空間的映射 76
3.4.1 內核空間到用戶空間的地址
映射原理 76
3.4.2 mmap地址映射實例 78
3.5 內核鏈表 80
3.5.1 Linux內核中的鏈表 80
3.5.2 內核鏈表實例 81
第4章 延遲處理 83
4.1 內核線程 83
4.2 軟中斷機制 85
4.2.1 軟中斷原理 85
4.2.2 tasklet 87
4.3 工作隊列 89
4.3.1 工作隊列原理 89
4.3.2 工作隊列實例 91
4.4 內核時間 92
4.4.1 Linux中的時間概念 92
4.4.2 Linux中的延遲 93
4.4.3 內核定時器 93
第5章 簡單設備驅動程序 96
5.1 寄存器訪問 96
5.1.1 S3C6410地址映射 96
5.1.2 S3C6410看門狗驅動程序實例 98
5.1.3 S3C6410蜂鳴器驅動程序實例 102
5.2 電平控制 107
5.2.1 S3C6410 LED驅動程序實例 107
5.2.2 掃描型S3C6410按鍵驅動
程序實例 109
5.3 時序產生 112
5.3.1 時序圖原理 112
5.3.2 AT24C02晶元原理 112
5.3.3 AT24C02驅動程序開發實例 115
5.4 硬中斷處理 123
5.4.1 硬中斷處理原理 123
5.4.2 中斷型S3C6410按鍵驅動
程序實例 127
5.5 Linux I/O埠控制 132
5.5.1 Linux I/O埠讀寫 132
5.5.2 在應用層訪問Linux I/O
埠 133
5.5.3 /dev/port設備 134
第6章 深入Linux內核 135
6.1 嵌入式Linux系統構成 135
6.2 Linux內核導讀 136
6.2.1 Linux內核組成 136
6.2.2 Linux的代碼結構 137
6.2.3 內核Makefile 138
6.2.4 S3C6410硬體初始化 139
6.3 Linux文件系統 141
6.3.1 虛擬文件系統 141
6.3.2 根文件系統 143
6.3.3 文件系統載入 143
6.3.4 ext3文件系統 145
6.4 Flash文件系統 145
6.4.1 MTD設備 145
6.4.2 MTD字元設備 148
6.4.3 MTD塊設備 150
6.4.4 cramfs文件系統 153
6.4.5 JFFS2文件系統 153
6.4.6 YAFFS文件系統 155
6.4.7 文件系統總結 156
6.5 Linux內核移植 156
6.5.1 體系配置 156
6.5.2 添加yaffs2 157
6.5.3 Nand flash驅動程序移植 157
6.5.4 配置啟動參數 159
6.5.5 移植RTC驅動程序 160
6.6 根文件系統製作 162
6.6.1 Busybox 162
6.6.2 shell基礎 165
6.6.3 根文件系統構建實例 166
6.7 udev模型 167
6.7.1 udev模型原理 167
6.7.2 mdev的使用 167
第7章 I2C匯流排驅動程序 169
7.1 Linux的I2C驅動程序架構 169
7.1.1 I2C適配器 169
7.1.2 I2C演算法 170
7.1.3 I2C驅動程序結構 170
7.1.4 I2C從設備 171
7.1.5 i2c-dev設備層 171
7.2 Linux I2C驅動程序開發 174
7.2.1 S3C2410X的I2C控制器 174
7.2.2 S3C2410X的I2C驅動程序
分析 175
7.3 S3C2410的I2C訪問實例 182
7.4 I2C客戶端驅動程序 185
第8章 TTY與串口驅動程序 190
8.1 TTY概念 190
8.2 Linux TTY驅動程序體系 190
8.2.1 TTY驅動程序調用關系 190
8.2.2 TTY驅動程序原理 191
8.3 線路規程 194
8.4 串口驅動程序與TTY 196
8.4.1 串口設備驅動程序原理 196
8.4.2 S3C6410的串口驅動程序
實例 199
8.5 TTY應用層 202
第9章 網路設備驅動程序 205
9.1 DM9000網卡驅動程序
開發 205
9.1.1 DM9000原理 205
9.1.2 DM9000X驅動程序分析 207
9.1.3 DM9000網口驅動程序移植 215
9.2 NFS根文件系統搭建 219
9.2.1 主機配置 219
9.2.2 NFS根文件系統搭建實例 220
9.3 netlink Socket 224
9.3.1 netlink機制 224
9.3.2 netlink應用層編程 228
9.3.3 netlink驅動程序實例 229
第10章 framebuffer驅動程序 232
10.1 Linux framebuffer驅動
程序原理 232
10.1.1 framebuffer核心數據結構 232
10.1.2 framebuffer操作介面 234
10.1.3 framebuffer驅動程序的文件
介面 236
10.1.4 framebuffer驅動程序框架 236
10.2 S3C6410 顯示控制器 238
10.3 S3C6410 LCD驅動程序實例 243
10.4 framebuffer應用層 250
10.5 Qt4界面系統移植 251
第11章 輸入子系統驅動程序 253
11.1 Linux輸入子系統概述 253
11.1.1 input_dev結構 253
11.1.2 輸入事件 255
11.2 input_handler 256
11.2.1 Input Handler層 256
11.2.2 常用的Input Handler 259
11.3 輸入設備應用層 261
11.4 鍵盤輸入設備驅動程序
實例 262
11.5 event介面 267
11.6 觸摸屏驅動程序實例 270
11.6.1 S3C6410觸摸屏控制器 270
11.6.2 S3C6410觸摸屏驅動程序
設計 273
11.7 觸摸屏校準 282
11.7.1 觸摸屏校準原理 282
11.7.2 利用TSLIB庫校準觸摸屏 282
第12章 USB驅動程序 284
12.1 USB體系概述 284
12.1.1 USB系統組成 284
12.1.2 USB主機 284
12.1.3 USB設備邏輯層次 285
12.2 Linux USB驅動程序體系 287
12.2.1 USB總體結構 287
12.2.2 USB設備驅動程序 287
12.2.3 主機控制器驅動程序 288
12.2.4 USB請求塊urb 289
12.2.5 USB請求塊的填充 291
12.3 S3C6410 USB主機控制器
驅動程序 292
12.3.1 USB主機控制器驅動程序
分析 292
12.3.2 S3C6410 USB驅動程序
載入 294
12.4 USB鍵盤設備驅動程序
分析 296
12.5 USB Gadget驅動程序 301
12.5.1 Linux USB Gadget驅動程序 301
12.5.2 Linux USB Gadget驅動程序
實例 302
第13章 音頻設備驅動程序 303
13.1 ALSA音頻體系 303
13.2 ALSA驅動層API 304
13.2.1 音效卡和設備管理 304
13.2.2 PCM API 304
13.2.3 控制與混音API 305
13.2.4 AC97 API 306
13.2.5 SOC層驅動 307
13.3 ALSA驅動程序實例 308
13.3.1 S3C6410的AC97控制
單元 308
13.3.2 S3C6410音效卡電路原理 309
13.3.3 S3C6410的數字音頻介面 310
13.3.4 wm9713的數字音頻介面 313
13.4 ALSA音頻編程介面 316
13.4.1 ALSA PCM介面實例 316
13.4.2 ALSA MIDI介面實例 320
13.4.3 ALSA mixer介面實例 321
13.4.4 ALSA timer介面實例 322
第14章 video4linux2視頻
驅動程序 327
14.1 video4linux2驅動程序
架構 327
14.1.1 video4linux2驅動程序的
注冊 327
14.1.2 v4l2_fops介面 331
14.1.3 常用的結構 332
14.1.4 video4linux2的ioctl函數 333
14.2 S3C6410攝像頭驅動程序
分析 333
14.2.1 電路原理 333
14.2.2 驅動程序分析 334
14.3 video4linux2應用層實例 339
第15章 SD卡驅動程序 346
15.1 Linux SD卡驅動程序體系 346
15.1.1 SD卡電路原理 346
15.1.2 MMC卡驅動程序架構 347
15.1.3 MMC卡驅動程序相關
結構 347
15.1.4 MMC卡塊設備驅動程序 350
15.1.5 SD卡主機控制器介面驅動
程序 356
15.2 S3C6410 SD卡控制器驅動
程序分析 360
15.2.1 電路原理 360
15.2.2 S3C6410 SDHCI驅動
程序原理 360
15.2.3 SD卡的載入實例 364
參考文獻 366

『貳』 如何測試linux設備驅動程序

要想列印出來需把printf的物理地址寫對

『叄』 緊急尋找linux紅旗題庫

單選題:請從四個選項里找出最正確的答案。
試題共計45題,當前第2題(本題2分)
做標記
1. 在Korn shell中開關設置可以用set來實現,為了取消option開關,用:
A. set –o option
B. set +o option
C. set –c option
D. set –s option
2. 在diff命令中,-b參數表示的意思是:
A. 忽略空格造成的不同
B. 忽略空行造成的不同
C. 忽略大小寫的變化
D. 使用綱要輸出格式
3. uniq test 等價的命令是:
A. uniq – test
B. uniq –c test
C. uniq –u test
D. uniq –d test
4. /root目錄是:
A. 系統的根目錄
B. 超級用戶的主目錄
C. 動態連接庫
D. 系統管理程序
5. chmod為了表示「目標文件只有這些許可權」,可以用符號_____
A. =
B. +
C. -
D. !
6. 目錄的可讀意味著:
A. 該目錄下建立文件
B. 從該目錄中刪除文件
C. 可以從一個目錄轉到另一個目錄
D. 可以查看該目錄下的文件
7. 檢查文件系統完整性的命令是:
A. fsck
B. mv
C. mount
D. cp
8. 下面的哪一個shell具有自動補齊功能?
A. csh
B. tcsh
C. bash
D. sh
9. 在gzip命令中,-t的作用是:
A. 解壓
B. 顯示壓縮文件
C. 檢驗壓縮文件
D. 刪除壓縮文件
10. 管道符是:
A. ||
B. |
C. <<
D. //
11. at命令中需要從標准輸入中讀入所有 的命令,不能指定_______選項。
A. -q
B. -b
C. -d
D. -f
12. chmod中通過指定"ugoa"可以控制哪些用戶對某文件(目錄)的許可權可以被改變,其中"a"表示:
A. 文件的所有者
B. 其他組的用戶
C. 與文件所有者同組的用戶
D. 所有用戶
13. wall可以:
A. 設置防火牆
B. 向所有用戶廣播信息
C. 定位幫助文件、源代碼文件、執行文件
D. 顯示命令的全路徑
14. 哪一個不是解包工具:
A. tar
B. gzip
C. zless
D. zcompress
15. 用下列命令查看Linux使用了多少內存
A. cat /proc/meminfo
B. cat /bin/meminfo
C. vi /proc/meminfo
D. vi /user/local/meminfo
16. 有如下的命令:$dd if=f1 of=f2。其中if=f1表示:
A. 以f1作為源文件 代替標准輸入
B. 以f1作為目標文件代替標准輸出
C. 當條件滿足f1的時候,執行真正的拷貝
D. 拷貝的過程中,不轉化文件

17. 在cut 命令中,-b,-list參數的意思是:
A. 只輸出在character-list區間的bytes
B. 只輸出在byte-list區間的bytes
C. 只輸出在file-list區間的bytes
D. 只輸出在home-list區間的bytes
18. 在diff命令中,-B參數表示的意思是:
A. 忽略空格造成的不同
B. 忽略空行造成的不同
C. 忽略大小寫的變化
D. 使用綱要輸出格式
19. 假設目錄/test下僅有文件file和子目錄test1,子目錄test1下僅有文件file1,如果我們cd 進入/test目錄後,使用命令ls .*,輸出結果為圖 ______
A.
B.
C.
D.
20. Linux核心 1.0發布時間為:
A. 1991
B. 1993
C. 1992
D. 1994
21. AWK用_____表示當前記錄。
A. $1
B. $0
C. $CUR
D. END
多選題:請從四個選項里找出所有正確的答案。
試題共計45題,當前第23題(本題3分)
22. 紅旗Linux支持哪些資料庫:
A. Informix-SE
B. Oracle8
C. Sybase等多種流行資料庫
D. MySql
23. 哪些命令可能退出shell?
A. logout
B. exit
C. quit
D. Ctrl D
24. 為了列出當前目錄所有的文件,我們可以使用 ______ 方式:
A. ls ?
B. ls .*
C. ls –a
D. ls .

25. 下面哪些命令可以顯示一個文件的具體內容?
A. vi
B. cat
C. head
D. more
26. 下面的哪些分頁程序支持進一步定製:
A. more
B. man
C. pg
D. less
27. 紅旗網路商務通包括:
A. eoffice
B. eshop
C. webmail
D. wwwbbs
28. 為了在Linux下面錄音,需要:
A. 系統支持音效卡
B. 有 /dev/audio設備
C. 超級用戶登陸
D. 有mtv程序

判斷題:請判斷下面試題的正確性。
試題共計45題,當前第29題(本題2分)做標記
29. 在shell命令行方式下,一行只能寫一個指令,每次只能使用一個命令。
A. 正確
B. 錯誤
30. Linux支持並口SCSI介面。
A. 正確
B. 錯誤
31. 刪除交換文件之前必須保證它不是激活的。
A. 正確
B. 錯誤
32. 紅旗Linux的中文環境,採用了直接寫屏技術 a
A. 正確
B. 錯誤
33. 內存建議至少有 1 Mb,如此才能讓Linux核心的編譯較為順利。
A. 正確
B. 錯誤
34. 如果與Window95/NT共享的列印機,需要先安裝smbprint,然後設置/etc/printcap。
A. 正確
B. 錯誤

35. 在Linux下可以跨越文件系統進行ln或mv操作。
A. 正確 a
B. 錯誤
36. 可以在不同的文件系統之間移動普通文件和特殊文件。
A. 正確
B. 錯誤
37. X伺服器提供了用戶界面。
A. 正確
B. 錯誤
38. RPM使得用戶可以直接以二進制方式安裝軟體。
A. 正確
B. 錯誤
39. 確定當前目錄使用的命令為:pwd。
A. 正確
B. 錯誤
40. Linux下mount Windows分區後看到長文件名需要:額外指定一下分區或文件系統類型,即運行以root或普通用戶運行mount -t vfat /dev/hda1 /mnt命令。
A. 正確
B. 錯誤
41. 環境變數不會因為shell的改變而丟失。
A. 正確
B. 錯誤
42. 紅旗Linux下的列印機配置命令是printtool,它能在shell方式下運行。
A. 正確
B. 錯誤
43. BIG5碼和GB2312兼容。
A. 正確
B. 錯誤
44. Linus最早是由Linus Torvalds波蘭人編寫的.
A. 正確 b
B. 錯誤
45. 在紅旗Linux伺服器版本2.0下的應用軟體非常豐富了,譬如類似word、wordprofect、wordpro、wps字處理軟體給用戶帶來了非常大的方便。
A. 正確
B. 錯誤

第二套
紅旗RCE認證的模擬試題!
單選題:請從四個選項里找出最正確的答案。
試題共計45題,當前第1題(本題2分)
做標記

1. 假設當前目錄下有文件Makefile,下面是其內容:
pr1: prog.o subr.o
gcc –o pr1 prog.o subr.o
prog.o: prog.c prog.h
gcc –c –l prog.o prog.c
subr.o: subr.c
gcc –c –o subr.o subr.c
clear:
rm –f pr1*.0
現在執行命令%make 實際執行的命令是:
A. gcc –o pr1 prog.o subr.o
B. gcc –c –l prog.o prog.c
C. gcc –c –o subr.o subr.c
D. 都執行

單選題:請從四個選項里找出最正確的答案。
試題共計45題,當前第2題(本題2分)
做標記

2. 僅當前一個命令執行出錯時才執行後一條命令,需要採取的操作是: c
A. command1 && command2
B. command1 XOR command2
C. command1 || command2
D. command1 << command2

單選題:請從四個選項里找出最正確的答案。
試題共計45題,當前第3題(本題2分)
做標記

3. 在head命令中,表示輸出文件的前N行的參數是:
A. -c N
B. -n N
C. -q N
D. -v N

單選題:請從四個選項里找出最正確的答案。
試題共計45題,當前第4題(本題2分)
做標記

4. 在env命令中,表示從原環境中刪除變數的參數是:
A. -u
B. -
C. -\
D. -/

單選題:請從四個選項里找出最正確的答案。
試題共計45題,當前第5題(本題2分)
做標記

5. 設置歷史表的大小,可以通過設置變數_______實現。
A. argv
B. cwd
C. histchars
D. history

單選題:請從四個選項里找出最正確的答案。
試題共計45題,當前第6題(本題2分)
做標記

6. 在grep命令中,表示輸出匹配行前的 num行的參數是:
A. -A num
B. -B num
C. -C num
D. -D num

單選題:請從四個選項里找出最正確的答案。
試題共計45題,當前第7題(本題2分)
做標記

7. Korn Shell默認的提示符是: b
A. ¥
B. $
C. !
D. %

單選題:請從四個選項里找出最正確的答案。
試題共計45題,當前第8題(本題2分)
做標記

8. 切換到BIG5漢字的快捷鍵是: d
A.
B.
C.
D.

單選題:請從四個選項里找出最正確的答案。
試題共計45題,當前第9題(本題2分)
做標記

9. 下面哪些命令可以跨文件系統? a
A. ln
B. mv
C. cp
D. touch

單選題:請從四個選項里找出最正確的答案。
試題共計45題,當前第10題(本題2分)
做標記

10. 程序片段: # /sbin/insmod parport $ /sbin/insmod ppa 的功能是:
A. 卸載zip並行埠驅動程序
B. 安裝zip並行埠驅動程序
C. 修改zip並行埠驅動程序
D. 安裝zip驅動器

單選題:請從四個選項里找出最正確的答案。
試題共計45題,當前第11題(本題2分)
做標記

11. ^D的確切含義是: b
A. 停止一個正在運行的程序
B. 終止shell
C. 強制退出程序
D. 不再有數據輸入

單選題:請從四個選項里找出最正確的答案。
試題共計45題,當前第12題(本題2分)
做標記

12. 取消別名的命令是: c
A. alias
B. rm
C. unalias
D. cp

單選題:請從四個選項里找出最正確的答案。
試題共計45題,當前第13題(本題2分)
做標記

13. 在bc命令啟動之後,輸入如下的命令:150/60,顯示的結果為2,原因可能是: a
A. 結果正確
B. 結果錯誤,bc環境沒有正確設定
C. 結果正確,但是顯示環境沒有設置正確
D. 結果錯誤,精度因子沒有設置正確

單選題:請從四個選項里找出最正確的答案。
試題共計45題,當前第14題(本題2分)
做標記

14. ping 可以:
A. 查看自己計算機上所有用戶標志的信息
B. 檢查郵件狀態
C. 查看一個計算機是否處於活動狀態
D. 獲得與於你的計算機相連的任何計算機上用戶的信息。

單選題:請從四個選項里找出最正確的答案。
試題共計45題,當前第15題(本題2分)
做標記

15. 系統正常運行時要改變的數據存放在:
A. /
B. /proc
C. /dev
D. /var

單選題:請從四個選項里找出最正確的答案。
試題共計45題,當前第16題(本題2分)
做標記

16. 啟動bash最早讀取的文件是:
A. etc/profile
B. .bash_profile
C. .profile
D. .bash_logout

單選題:請從四個選項里找出最正確的答案。
試題共計45題,當前第17題(本題2分)
做標記

17. 紅旗linux提供的WWW伺服器軟體是:
A. IIS
B. Apache
C. PWS
D. NETCONFIG

單選題:請從四個選項里找出最正確的答案。
試題共計45題,當前第18題(本題2分)
做標記

18. 在grep命令中,表示輸出匹配行後的 num行的參數是:
A. -A num
B. -B num
C. -C num
D. -D num

單選題:請從四個選項里找出最正確的答案。
試題共計45題,當前第19題(本題3分)
做標記

19. 為了獲得一個Shell命令的幫助信息,在命令行下我們可以使用 _____命令來查看: a
A. man
B. help
C. ?
D. www

單選題:請從四個選項里找出最正確的答案。
試題共計45題,當前第20題(本題3分)
做標記

20. 超級用戶(root)用_____作默認的提示符。b
A. $
B. #
C. ?
D. !

選題:請從四個選項里找出最正確的答案。
試題共計45題,當前第21題(本題3分)
做標記

21. 下面的哪一個shell具有自動補齊功能?
A. csh
B. tcsh
C. bash
D. sh

多選題:請從四個選項里找出所有正確的答案。
試題共計45題,當前第22題(本題3分)
做標記

22. 升級核心一般有幾個原因:
A. 找到支援新硬體的驅動程序
B. 更穩定的環境
C. 更好的效能
D. 了解 Linux 核心是如何建立的

多選題:請從四個選項里找出所有正確的答案。
試題共計45題,當前第23題(本題3分)
做標記

23. 安排、檢查及刪除隊列中的工作的命令有: acd
A. at
B. batch
C. atq
D. atrm

多選題:請從四個選項里找出所有正確的答案。
試題共計45題,當前第24題(本題3分)
做標記

24. 哪些命令可以退出vi? abc
A. q!
B. wq
C. q
D. zz

多選題:請從四個選項里找出所有正確的答案。
試題共計45題,當前第25題(本題3分)
做標記

25. 暫時關閉輸入法的快捷鍵是: ac
A.
B.
C.
D.

多選題:請從四個選項里找出所有正確的答案。
試題共計45題,當前第26題(本題3分)
做標記

26. 有關幾種軟體模式比較說法錯誤的是:
A. 商業軟體由開發者出售拷貝並提供技術服務,用戶只有使用權,不得進行非法拷貝,擴散和修改。
B. 共享軟體由開發者提供軟體使用授權
C. 共享軟體實際上是商業軟體,軟體的作者希望得到回報,就像商業軟體的製作者一樣,鼓勵自由傳播
D. 共享軟體的升級和bug的修改只有交費的用戶可以得到,並且軟體的源代碼是不提供的

多選題:請從四個選項里找出所有正確的答案。
試題共計45題,當前第27題(本題3分)
做標記

27. 命令uniq可以:
A. 僅僅保留重復的行
B. 僅僅保留唯一的行
C. 去掉重復的行
D. 計算行重復的次數

多選題:請從四個選項里找出所有正確的答案。
試題共計45題,當前第28題(本題3分)
做標記

28. wc程序可以用來: abc
A. 計算行
B. 計算單詞
C. 計算字元
D. 計算列

判斷題:請判斷下面試題的正確性。
試題共計45題,當前第29題(本題2分)
做標記

29. kill向指定的進程發出特定的信號,沒有指定信號的時候,發出TERM信號。
A. 正確
B. 錯誤

判斷題:請判斷下面試題的正確性。
試題共計45題,當前第30題(本題2分)
做標記

30. Lilo是一個在系統啟動時運行的程序,它只允許選擇Linux和Windows來引導計算機。
A. 正確
B. 錯誤

判斷題:請判斷下面試題的正確性。
試題共計45題,當前第31題(本題2分)
做標記

31. Linux在內存中緩沖了磁碟讀寫,極大的提高了系統性能。
A. 正確
B. 錯誤

判斷題:請判斷下面試題的正確性。
試題共計45題,當前第32題(本題2分)
做標記

32. clear命令負責清除終端屏幕,當使用這個命令於特殊場合時,需要配合該命令的其它命令選項。
A. 正確
B. 錯誤

判斷題:請判斷下面試題的正確性。
試題共計45題,當前第33題(本題2分)
做標記

33. 紅旗Linux下的列印機配置命令是printtool,它能在shell方式下運行。
A. 正確
B. 錯誤

判斷題:請判斷下面試題的正確性。
試題共計45題,當前第34題(本題2分)
做標記

34. Linux 還可以毫不費力地用作代理伺服器(Socket、、Squid等),也可以採用IP掩蔽(IP Masquade)將整個區域網上用戶全部接入Internet。面向用戶提供WWW、FTP、EMAIL等服務。
A. 正確
B. 錯誤

判斷題:請判斷下面試題的正確性。
試題共計45題,當前第35題(本題2分)
做標記

35. 如果直接安裝軟體的可執行文件時,如果Runtime Library的版本與作者編譯該軟體時的版本差異過大時,那麼就會產生錯誤導致無法執行。如果要重新編譯該軟體並且該軟體用到一些新版才提供的函數時就會發生編譯錯誤。因此如果有此限制時,只有放棄該軟體和升級系統兩種選擇。
A. 正確
B. 錯誤

判斷題:請判斷下面試題的正確性。
試題共計45題,當前第36題(本題2分)
做標記

36. 除了使用L I L O ,我們還可以使用L O A D L I N . E X E 從D O S 啟動L i n u x 。
A. 正確
B. 錯誤

判斷題:請判斷下面試題的正確性。
試題共計45題,當前第37題(本題2分)
做標記

37. Netscape中的中文超文本文檔列印的時候設置"查看——>字元集」中設置與文檔相應的字元集,其中查看BIG5的文檔要選擇「中文繁體(Big5)」一項
A. 正確
B. 錯誤

判斷題:請判斷下面試題的正確性。
試題共計45題,當前第38題(本題2分)
做標記

38. BIG5碼和GB2312兼容。
A. 正確
B. 錯誤

判斷題:請判斷下面試題的正確性。
試題共計45題,當前第39題(本題2分)
做標記

39. uuencode將一個文本文件編碼為一個二進制文件。
A. 正確
B. 錯誤

判斷題:請判斷下面試題的正確性。
試題共計45題,當前第40題(本題2分)
做標記

40. 刪除交換文件之前必須保證它不是激活的。
A. 正確
B. 錯誤

判斷題:請判斷下面試題的正確性。
試題共計45題,當前第41題(本題2分)
做標記

41. 紅旗的列印功能非常強大,採用了中文TrueType字體。
A. 正確
B. 錯誤

判斷題:請判斷下面試題的正確性。
試題共計45題,當前第42題(本題2分)
做標記

42. 在內核或啟動參數更改後,我們一定要在重新啟動linux前使用/sbin/lilo命令更新lilo,以反映出最新的更改,否則有可能不能啟動系統。
A. 正確
B. 錯誤

判斷題:請判斷下面試題的正確性。
試題共計45題,當前第43題(本題2分)
做標記

43. 定義在/etc/fstab中的文件系統在系統啟動的時候自動載入。
A. 正確
B. 錯誤

判斷題:請判斷下面試題的正確性。
試題共計45題,當前第44題(本題2分)
做標記

44. Linux沒有擴展分區。
A. 正確
B. 錯誤

判斷題:請判斷下面試題的正確性。
試題共計45題,當前第45題(本題2分)
做標記

45. 如果與Window95/NT共享的列印機,需要先安裝smbprint,然後設置/etc/printcap。
A. 正確
B. 錯誤

第三套
單選題:請從四個選項里找出最正確的答案。
試題共計45題,當前第1題(本題2分)
做標記

1. 命令grep '' test的含義是:
A. 在文件test中查找包含單詞blueriver的行
B. 在文件test中查找單詞blueriver
C. 在文件test中查找完全包含單詞blueriver的行
D. 在文件test中查找以blueriver開始的所有行

單選題:請從四個選項里找出最正確的答案。
試題共計45題,當前第2題(本題2分)
做標記

2. Korn shell輸出變數用:b
A. 任何變數默認都輸出
B. export
C. out
D. go

單選題:請從四個選項里找出最正確的答案。
試題共計45題,當前第3題(本題2分)
做標記

3. Linux系統引導將啟動__________進程。
A. init
B. getty
C. syslogd
D. lpd

單選題:請從四個選項里找出最正確的答案。
試題共計45題,當前第4題(本題2分)
做標記

4. 紅旗Linux中軟盤引導映像文件是:
A. /images/boot.img
B. \images\boot.img
C. /images/pcmcia.img
D. \images/pcmcia.img

單選題:請從四個選項里找出最正確的答案。
試題共計45題,當前第5題(本題2分)
做標記

5. 安裝zip驅動器的命令是:
A. $mount –t ISO900 /dev/sda4 /mnt/zipdrive
B. $mount /dev/sda4 /mnt/zipdrive
C. $mount –t vfat /dev/sda4 /mnt/zipdrive
D. $mount –t auto /dev/sda4 /mnt/zipdrive

v單選題:請從四個選項里找出最正確的答案。
試題共計45題,當前第6題(本題2分)
做標記

6. 管道符是:
A. ||
B. |
C. <<
D. //

單選題:請從四個選項里找出最正確的答案。
試題共計45題,當前第7題(本題2分)
做標記

7. 下面哪個不是循環控制結構?
A. for
B. switch
C. while
D. until

單選題:請從四個選項里找出最正確的答案。
試題共計45題,當前第8題(本題2分)
做標記

8. 在dd命令中,表示一次讀bytes個byte的參數是:
A. ibs=bytes
B. obs=bytes
C. cbs=bytes
D. skip=bytes

單選題:請從四個選項里找出最正確的答案。
試題共計45題,當前第9題(本題2分)
做標記

9. 假設執行如下的命令:alias lcd 'ls –l \!;pwd *
現在輸入 lcd test1 test2,shell實際上執行的是:b
A. ls –l test1
B. ls –l test1 test2;pwd
C. pwd
D. ls –l ; pwd

單選題:請從四個選項里找出最正確的答案。
試題共計45題,當前第10題(本題2分)
做標記

10. 在grep命令中,表示輸出匹配行前的 num行的參數是:
A. -A num
B. -B num
C. -C num
D. -D num

單選題:請從四個選項里找出最正確的答案。
試題共計45題,當前第11題(本題2分)
做標記

11. 在tcsh中按__________可以列出所有匹配的情況。
A. TAB
B. SHIFT
C. ^D
D. ALT

單選題:請從四個選項里找出最正確的答案。
試題共計45題,當前第12題(本題2分)
做標記

12. eth1表示:
A. 第二個ethnet設備
B. 網卡
C. 音效卡
D. 視頻壓縮卡

單選題:請從四個選項里找出最正確的答案。
試題共計45題,當前第13題(本題2分)
做標記

13. 一般而言,Lilux中佔地最多的目錄是:
A. /boot
B. /mnt
C. /var
D. /usr

單選題:請從四個選項里找出最正確的答案。
試題共計45題,當前第14題(本題2分)
做標記

14. C Shell下如下的程序片段:
set test=(a b c)
echo$ test[1-3]________
則空行中的顯示為: dddddd
A. a
B. a c
C. b
D. a b c

單選題:請從四個選項里找出最正確的答案。
試題共計45題,當前第15題(本題2分)
做標記

15. 有如下的命令說明:mycommand [-abcd][filename…],「…」表示:
A. 只有一個參數
B. 可以有一個以上的參數
C. 該參數可以省略
D. 該參數位置可變

單選題:請從四個選項里找出最正確的答案。
試題共計45題,當前第16題(本題2分)
做標記

16. /sbin目錄存放的是:
A. 使用者經常使用的命令
B. 動態連接庫
C. 系統管理程序
D. 設備

單選題:請從四個選項里找出最正確的答案。
試題共計45題,當前第17題(本題2分)
做標記

17. 關於at命令下列說法正確的是: c
A. 任何用戶都可以使用該命令
B. 若at.deny不為空,那麼除at.deny中指定的用戶之外,所有的用戶都可以使用該命令
C. 若at.deny不為空,那麼只有at.allow中的用戶才能使用該命令
D. 只有超級用戶才能使用該命令

單選題:請從四個選項里找出最正確的答案。
試題共計45題,當前第18題(本題2分)
做標記

18. 命令gzip -d myfile.tar.gz
A. 解壓縮的使用方法
B. 在執行過解壓縮的處理後,保留壓縮文件
C. 不會額外佔用磁碟空間
D. 在執行完此命令後有myfile文件

單選題:請從四個選項里找出最正確的答案。
試題共計45題,當前第19題(本題3分)
做標記

19. crontab文件的格式是: d
A. M D H m d cmd
B. M H D d m cmd
C. D M H m d cmd
D. M H D m d cmd

單選題:請從四個選項里找出最正確的答案。
試題共計45題,當前第20題(本題3分)
做標記

20. 在當前目錄下有文件test,文件屬主為guest;我們使用admin身份,用命令cp test /tmp,拷貝文件到/tmp(目錄屬主為root),則/tmp/test的文件屬主為:
A. guest
B. root
C. admin
D. 其它

單選題:請從四個選項里找出最正確的答案。
試題共計45題,當前第21題(本題3分)
做標記

21. 下面哪一個命令可以要查看 /SOURCE 中的 myfile.tgz 的內容:
A. zcat /SOURCE/myfile.tgz | tar tvf
B. zcat /SOURCE/myfile.tgz | tar tvf –
C. zcat /SOURCE/myfile.tgz
D. zcat /SOURCE/myfile.tgz | tar xvf

多選題:請從四個選項里找出所有正確的答案。
試題共計45題,當前第22題(本題3分)
做標記

22. 壓縮備份:
A. 使用tar中的-z選項
B. 用afio 程序單獨壓縮每個文件
C. 用rsync
D. 使用tar中的-v選項

多選題:請從四個選項里找出所有正確的答案。
試題共計45題,當前第23題(本題3分)
做標記

23. 哪些是使用Linux的好處?
A. 可以提供給世界各地的人免費從英特網上下載信息
B. Linux不需要很新的電腦
C. 具有很廣泛的使用空間
D. Linux是免費的,無需任何額外的投資

多選題:請從四個選項里找出所有正確的答案。
試題共計45題,當前第24題(本題3分)
做標記

24. 安排、檢查及刪除隊列中的工作的命令有:
A. at
B. batch
C. atq
D. atrm

多選題:請從四個選項里找出所有正確的答案。
試題共計45題,當前第25題(本題3分)
做標記

25. /etc/utmp記錄了當前使用的用戶的若干信息,該信息:
A. 退出系統之後仍然保留這些信息
B. 包括遠程登陸機器名
C. 記錄了使用的終端
D. 如果這個文件出錯,可能會導致who和last命令出錯

多選題:請從四個選項里找出所有正確的答案。
試題共計45題,當前第26題(本題3分)
做標記

26. $ mount –t auto /dev/cdrom /mnt/cdrom上述命令執行之後,Linux報告出錯信息,則可能的原因是:
A. /mnt/cdrom 不存在
B. /mnt/cdrom 為空
C. /dev/cdrom設備不存在
D. 當前目錄是安裝點/dev/cdrom

多選題:請從四個選項里找出所有正確的答案。
試題共計45題,當前第27題(本題3分)
做標記

27. Linux環境中的變數可以分成:
A. 環境變數
B. 靜態變數
C. 動態變數
D. shell變數

多選題:請從四個選項里找出所有正確的答案。
試題共計45題,當前第28題(本題3分)
做標記

28. Linux家族:
A. 已經有近140個不同的版本
B. 具備了搶先多任務和對稱多處理
C. 不同的版本都是基於最初的、免費的源代碼
D. 在瀏覽器操作系統市場佔有率方面居榜首

判斷題:請判斷下面試題的正確性。
試題共計45題,當前第29題(本題2分)
做標記

29. 要列印中文文本文件,首先要將語言環境設置為簡(繁)體中文,這樣才能正確顯示和列印中文文本文件。 a
A. 正確
B. 錯誤

判斷題:請判斷下面試題的正確性。
試題共計45題,當前第30題(本題2分)
做標記
b
30.

『肆』 Linux設備驅動中多中斷源問題

我也是初學者,這里抄一段《Linux設備驅動程序》書上的給你:

Linux的中斷宏觀分為兩種:軟中斷和硬中斷。聲明一下,這里的軟和硬的意思是指和軟體相關以及和硬體相關,而不是軟體實現的中斷或硬體實現的中斷。軟中斷就是「信號機制」。軟中斷不是軟體中斷。Linux通過信號來產生對進程的各種中斷操作,我們現在知道的信號共有31個,其具體內容這里略過。
一般來說,軟中斷是由內核機制的觸發事件引起的(例如進程運行超時),但是不可忽視有大量的軟中斷也是由於和硬體有關的中斷引起的,例如當列印機埠產生一個硬體中斷時,會通知和硬體相關的硬中斷,硬中斷就會產生一個軟中斷並送到操作系統內核里,這樣內核就會根據這個軟中斷喚醒睡眠在列印機任務隊列中的處理進程。
硬中斷就是通常意義上的「中斷處理程序」,它是直接處理由硬體發過來的中斷信號的。當硬中斷收到它應當處理的中斷信號以後,就回去自己驅動的設備上去看看設備的狀態寄存器以了解發生了什麼事情,並進行相應的操作。
對於軟中斷,我們不做討論,那是進程調度里要考慮的事情。由於我們討論的是設備驅動程序的中斷問題,所以焦點集中在硬中斷里。我們這里討論的是硬中斷,即和硬體相關的中斷。
要中斷,是因為外設需要通知操作系統她那裡發生了一些事情,但是中斷的功能僅僅是一個設備報警燈,當燈亮的時候中斷處理程序只知道有事情發生了,但發生了什麼事情還要親自到設備那裡去看才行。也就是說,當中斷處理程序得知設備發生了一個中斷的時候,它並不知道設備發生了什麼事情,只有當它訪問了設備上的一些狀態寄存器以後,才能知道具體發生了什麼,要怎麼去處理。
設備通過中斷線向中斷控制器發送高電平告訴操作系統它產生了一個中斷,而操作系統會從中斷控制器的狀態位知道是哪條中斷線上產生了中斷。PC機上使用的中斷控制器是8259,這種控制器每一個可以管理8條中斷線,當兩個8259級聯的時候共可以控制15條中斷線。這里的中斷線是實實在在的電路,他們通過硬體介面連接到CPU外的設備控制器上。
並不是每個設備都可以向中斷線上發中斷信號的,只有對某一條確定的中斷線勇有了控制權,才可以向這條中斷線上發送信號。由於計算機的外部設備越來越多,所以15條中斷線已經不夠用了,中斷線是非常寶貴的資源。要使用中斷線,就得進行中斷線的申請,就是IRQ(Interrupt Requirement),我們也常把申請一條中斷線成為申請一個IRQ或者是申請一個中斷號。
IRQ是非常寶貴的,所以我們建議只有當設備需要中斷的時候才申請佔用一個IRQ,或者是在申請IRQ時採用共享中斷的方式,這樣可以讓更多的設備使用中斷。無論對IRQ的使用方式是獨占還是共享,申請IRQ的過程都是一樣的,分為3步:
1.將所有的中斷線探測一遍,看看哪些中斷還沒有被佔用。從這些還沒有被佔用的中斷中選一個作為該設備的IRQ。
2.通過中斷申請函數申請選定的IRQ,這是要指定申請的方式是獨占還是共享。
3.根據中斷申請函數的返回值決定怎麼做:如果成功了萬事大吉,如果沒成功則或者重新申請或者放棄申請並返回錯誤。
Linux中的中斷處理程序很有特色,它的一個中斷處理程序分為兩個部分:上半部(top half)和下半部(bottom half)。之所以會有上半部和下半部之分,完全是考慮到中斷處理的效率。
上半部的功能是「登記中斷」。當一個中斷發生時,他就把設備驅動程序中中斷常式的下半部掛到該設備的下半部執行隊列中去,然後就沒事情了--等待新的中斷的到來。這樣一來,上半部執行的速度就會很快,他就可以接受更多她負責的設備產生的中斷了。上半部之所以要快,是因為它是完全屏蔽中斷的,如果她不執行完,其它的中斷就不能被及時的處理,只能等到這個中斷處理程序執行完畢以後。所以,要盡可能多得對設備產生的中斷進行服務和處理,中斷處理程序就一定要快。
但是,有些中斷事件的處理是比較復雜的,所以中斷處理程序必須多花一點時間才能夠把事情做完。可怎麼樣化解在短時間內完成復雜處理的矛盾呢,這時候 Linux引入了下半部的概念。下半部和上半部最大的不同是下半部是可中斷的,而上半部是不可中斷的。下半部幾乎做了中斷處理程序所有的事情,因為上半部只是將下半部排到了他們所負責的設備的中斷處理隊列中去,然後就什麼都不管了。下半部一般所負責的工作是察看設備以獲得產生中斷的事件信息,並根據這些信息(一般通過讀設備上的寄存器得來)進行相應的處理。如果有些時間下半部不知道怎麼去做,他就使用著名的鴕鳥演算法來解決問題--說白了就是忽略這個事件。
由於下半部是可中斷的,所以在它運行期間,如果其它的設備產生了中斷,這個下半部可以暫時的中斷掉,等到那個設備的上半部運行完了,再回頭來運行它。但是有一點一定要注意,那就是如果一個設備中斷處理程序正在運行,無論她是運行上半部還是運行下半部,只要中斷處理程序還沒有處理完畢,在這期間設備產生的新的中斷都將被忽略掉。因為中斷處理程序是不可重入的,同一個中斷處理程序是不能並行的。
在Linux Kernel 2.0以前,中斷分為快中斷和慢中斷(偽中斷我們這里不談),其中快中斷的下半部也是不可中斷的,這樣可以保證它執行的快一點。但是由於現在硬體水平不斷上升,快中斷和慢中斷的運行速度已經沒有什麼差別了,所以為了提高中斷常式事務處理的效率,從Linux kernel 2.0以後,中斷處理程序全部都是慢中斷的形式了--他們的下半部是可以被中斷的。
但是,在下半部中,你也可以進行中斷屏蔽--如果某一段代碼不能被中斷的話。你可以使用cti、sti或者是save_flag、restore_flag來實現你的想法。
在處理中斷的時候,中斷控制器會屏蔽掉原先發送中斷的那個設備,直到她發送的上一個中斷被處理完了為止。因此如果發送中斷的那個設備載中斷處理期間又發送了一個中斷,那麼這個中斷就被永遠的丟失了。
之所以發生這種事情,是因為中斷控制器並不能緩沖中斷信息,所以當前一個中斷沒有處理完以前又有新的中斷到達,他肯定會丟掉新的中斷的。但是這種缺陷可以通過設置主處理器(CPU)上的「置中斷標志位」(sti)來解決,因為主處理器具有緩沖中斷的功能。如果使用了「置中斷標志位」,那麼在處理完中斷以後使用sti函數就可以使先前被屏蔽的中斷得到服務。
有時候需要屏蔽中斷,可是為什麼要將這個中斷屏蔽掉呢?這並不是因為技術上實現不了同一中斷常式的並行,而是出於管理上的考慮。之所以在中斷處理的過程中要屏蔽同一IRQ來的新中斷,是因為中斷處理程序是不可重入的,所以不能並行執行同一個中斷處理程序。在這里我們舉一個例子,從這里子例中可以看出如果一個中斷處理程序是可以並行的話,那麼很有可能會發生驅動程序鎖死的情況。當驅動程序鎖死的時候,你的操作系統並不一定會崩潰,但是鎖死的驅動程序所支持的那個設備是不能再使用了--設備驅動程序死了,設備也就死了。
A是一段代碼,B是操作設備寄存器R1的代碼,C是操作設備寄存器R2的代碼。其中激發PS1的事件會使A1產生一個中斷,然後B1去讀R1中已有的數據,然後代碼C1向R2中寫數據。而激發PS2的事件會使A2產生一個中斷,然後B2刪除R1中的數據,然後C2讀去R2中的數據。
如果PS1先產生,且當他執行到A1和B1之間的時候,如果PS2產生了,這是A2會產生一個中斷,將PS2中斷掉(掛到任務隊列的尾部),然後刪除了 R1的內容。當PS2運行到C2時,由於C1還沒有向R2中寫數據,所以C2將會在這里被掛起,PS2就睡眠在代碼C2上,直到有數據可讀的時候被信號喚醒。這是由於PS1中的B2原先要讀的R1中的數據被PS2中的B2刪除了,所以PS1頁會睡眠在B1上,直到有數據可讀的時候被信號喚醒。這樣一來,喚醒PS1和PS2的事件就永遠不會發生了,因此PS1和PS2之間就鎖死了。
由於設備驅動程序要和設備的寄存器打交道,所以很難寫出可以重入的代碼來,因為設備寄存器就是全局變數。因此,最簡潔的辦法就是禁止同一設備的中斷處理程序並行,即設備的中斷處理程序是不可重入的。
有一點一定要清楚:在2.0版本以後的Linux kernel中,所有的上半部都是不可中斷的(上半部的操作是原子性的);不同設備的下半部可以互相中斷,但一個特定的下半部不能被它自己所中斷(即同一個下半部不能並)。
由於中斷處理程序要求不可重入,所以程序員也不必為編寫可重入的代碼而頭痛了。編寫可重入的設備驅動程序是可以的,編寫可重入的中斷處理程序是非常難得,幾乎不可能。
我們都知道,一旦競爭條件出現了,就有可能會發生死鎖的情況,嚴重時可能會將整個系統鎖死。所以一定要避免競爭條件的出現。只要注意一點:絕大多數由於中斷產生的競爭條件,都是在帶有中斷的
內核進程被睡眠造成的。所以在實現中斷的時候,一定要相信謹慎的讓進程睡眠,必要的時候可以使用cli、sti或者save_flag、restore_flag。

『伍』 linux驅動程序結構框架及工作原理分別是什麼

一、Linux device driver 的概念x0dx0ax0dx0a系統調用是操作系統內核和應用程序之間的介面,設備驅動程序是操作系統內核和機器硬體之間的介面。設備驅動程序為應用程序屏蔽了硬體的細節,這樣在應用程序看來,硬體設備只是一個設備文件,應用程序可以象操作普通文件一樣對硬體設備進行操作。設備驅動程序是內核的一部分,它完成以下的功能:x0dx0ax0dx0a1、對設備初始化和釋放;x0dx0ax0dx0a2、把數據從內核傳送到硬體和從硬體讀取數據;x0dx0ax0dx0a3、讀取應用程序傳送給設備文件的數據和回送應用程序請求的數據;x0dx0ax0dx0a4、檢測和處理設備出現的錯誤。x0dx0ax0dx0a在Linux操作系統下有三類主要的設備文件類型,一是字元設備,二是塊設備,三是網路設備。字元設備和塊設備的主要區別是:在對字元設備發出讀/寫請求時,實際的硬體I/O一般就緊接著發生了,塊設備則不然,它利用一塊系統內存作緩沖區,當用戶進程對設備請求能滿足用戶的要求,就返回請求的數據,如果不能,就調用請求函數來進行實際的I/O操作。塊設備是主要針對磁碟等慢速設備設計的,以免耗費過多的CPU時間來等待。x0dx0ax0dx0a已經提到,用戶進程是通過設備文件來與實際的硬體打交道。每個設備文件都都有其文件屬性(c/b),表示是字元設備還是塊設備?另外每個文件都有兩個設備號,第一個是主設備號,標識驅動程序,第二個是從設備號,標識使用同一個設備驅動程序的不同的硬體設備,比如有兩個軟盤,就可以用從設備號來區分他們。設備文件的的主設備號必須與設備驅動程序在登記時申請的主設備號一致,否則用戶進程將無法訪問到驅動程序。x0dx0ax0dx0a最後必須提到的是,在用戶進程調用驅動程序時,系統進入核心態,這時不再是搶先式調度。也就是說,系統必須在你的驅動程序的子函數返回後才能進行其他的工作。如果你的驅動程序陷入死循環,不幸的是你只有重新啟動機器了,然後就是漫長的fsck。x0dx0ax0dx0a二、實例剖析x0dx0ax0dx0a我們來寫一個最簡單的字元設備驅動程序。雖然它什麼也不做,但是通過它可以了解Linux的設備驅動程序的工作原理。把下面的C代碼輸入機器,你就會獲得一個真正的設備驅動程序。x0dx0ax0dx0a由於用戶進程是通過設備文件同硬體打交道,對設備文件的操作方式不外乎就是一些系統調用,如 open,read,write,close?, 注意,不是fopen, fread,但是如何把系統調用和驅動程序關聯起來呢?這需要了解一個非常關鍵的數據結構:x0dx0ax0dx0aSTruct file_operatiONs {x0dx0ax0dx0aint (*seek) (struct inode * ,struct file *, off_t ,int);x0dx0ax0dx0aint (*read) (struct inode * ,struct file *, char ,int);x0dx0ax0dx0aint (*write) (struct inode * ,struct file *, off_t ,int);x0dx0ax0dx0aint (*readdir) (struct inode * ,struct file *, struct dirent * ,int);x0dx0ax0dx0aint (*select) (struct inode * ,struct file *, int ,select_table *);x0dx0ax0dx0aint (*ioctl) (struct inode * ,struct file *, unsined int ,unsigned long);x0dx0ax0dx0aint (*mmap) (struct inode * ,struct file *, struct vm_area_struct *);x0dx0ax0dx0aint (*open) (struct inode * ,struct file *);x0dx0ax0dx0aint (*release) (struct inode * ,struct file *);x0dx0ax0dx0aint (*fsync) (struct inode * ,struct file *);x0dx0ax0dx0aint (*fasync) (struct inode * ,struct file *,int);x0dx0ax0dx0aint (*check_media_change) (struct inode * ,struct file *);x0dx0ax0dx0aint (*revalidate) (dev_t dev);x0dx0ax0dx0a}x0dx0ax0dx0a這個結構的每一個成員的名字都對應著一個系統調用。用戶進程利用系統調用在對設備文件進行諸如read/write操作時,系統調用通過設備文件的主設備號找到相應的設備驅動程序,然後讀取這個數據結構相應的函數指針,接著把控制權交給該函數。這是linux的設備驅動程序工作的基本原理。既然是這樣,則編寫設備驅動程序的主要工作就是編寫子函數,並填充file_operations的各個域。x0dx0ax0dx0a下面就開始寫子程序。x0dx0ax0dx0a#include 基本的類型定義x0dx0ax0dx0a#include 文件系統使用相關的頭文件x0dx0ax0dx0a#include x0dx0ax0dx0a#include x0dx0ax0dx0a#include x0dx0ax0dx0aunsigned int test_major = 0;x0dx0ax0dx0astatic int read_test(struct inode *inode,struct file *file,char *buf,int count)x0dx0ax0dx0a{x0dx0ax0dx0aint left; 用戶空間和內核空間x0dx0ax0dx0aif (verify_area(VERIFY_WRITE,buf,count) == -EFAULT )x0dx0ax0dx0areturn -EFAULT;x0dx0ax0dx0afor(left = count ; left > 0 ; left--)x0dx0ax0dx0a{x0dx0ax0dx0a__put_user(1,buf,1);x0dx0ax0dx0abuf++;x0dx0ax0dx0a}x0dx0ax0dx0areturn count;x0dx0ax0dx0a}x0dx0ax0dx0a這個函數是為read調用准備的。當調用read時,read_test()被調用,它把用戶的緩沖區全部寫1。buf 是read調用的一個參數。它是用戶進程空間的一個地址。但是在read_test被調用時,系統進入核心態。所以不能使用buf這個地址,必須用__put_user(),這是kernel提供的一個函數,用於向用戶傳送數據。另外還有很多類似功能的函數。請參考,在向用戶空間拷貝數據之前,必須驗證buf是否可用。這就用到函數verify_area。為了驗證BUF是否可以用。x0dx0ax0dx0astatic int write_test(struct inode *inode,struct file *file,const char *buf,int count)x0dx0ax0dx0a{x0dx0ax0dx0areturn count;x0dx0ax0dx0a}x0dx0ax0dx0astatic int open_test(struct inode *inode,struct file *file )x0dx0ax0dx0a{x0dx0ax0dx0aMOD_INC_USE_COUNT; 模塊計數加以,表示當前內核有個設備載入內核當中去x0dx0ax0dx0areturn 0;x0dx0ax0dx0a}x0dx0ax0dx0astatic void release_test(struct inode *inode,struct file *file )x0dx0ax0dx0a{x0dx0ax0dx0aMOD_DEC_USE_COUNT;x0dx0ax0dx0a}x0dx0ax0dx0a這幾個函數都是空操作。實際調用發生時什麼也不做,他們僅僅為下面的結構提供函數指針。x0dx0ax0dx0astruct file_operations test_fops = {?x0dx0ax0dx0aread_test,x0dx0ax0dx0awrite_test,x0dx0ax0dx0aopen_test,x0dx0ax0dx0arelease_test,x0dx0ax0dx0a};x0dx0ax0dx0a設備驅動程序的主體可以說是寫好了。現在要把驅動程序嵌入內核。驅動程序可以按照兩種方式編譯。一種是編譯進kernel,另一種是編譯成模塊(moles),如果編譯進內核的話,會增加內核的大小,還要改動內核的源文件,而且不能動態的卸載,不利於調試,所以推薦使用模塊方式。x0dx0ax0dx0aint init_mole(void)x0dx0ax0dx0a{x0dx0ax0dx0aint result;x0dx0ax0dx0aresult = register_chrdev(0, "test", &test_fops); 對設備操作的整個介面x0dx0ax0dx0aif (result < 0) {x0dx0ax0dx0aprintk(KERN_INFO "test: can't get major number\n");x0dx0ax0dx0areturn result;x0dx0ax0dx0a}x0dx0ax0dx0aif (test_major == 0) test_major = result; /* dynamic */x0dx0ax0dx0areturn 0;x0dx0ax0dx0a}x0dx0ax0dx0a在用insmod命令將編譯好的模塊調入內存時,init_mole 函數被調用。在這里,init_mole只做了一件事,就是向系統的字元設備表登記了一個字元設備。register_chrdev需要三個參數,參數一是希望獲得的設備號,如果是零的話,系統將選擇一個沒有被佔用的設備號返回。參數二是設備文件名,參數三用來登記驅動程序實際執行操作的函數的指針。x0dx0ax0dx0a如果登記成功,返回設備的主設備號,不成功,返回一個負值。x0dx0ax0dx0avoid cleanup_mole(void)x0dx0ax0dx0a{x0dx0ax0dx0aunregister_chrdev(test_major,"test");x0dx0ax0dx0a}x0dx0ax0dx0a在用rmmod卸載模塊時,cleanup_mole函數被調用,它釋放字元設備test在系統字元設備表中佔有的表項。x0dx0ax0dx0a一個極其簡單的字元設備可以說寫好了,文件名就叫test.c吧。x0dx0ax0dx0a下面編譯 :x0dx0ax0dx0a$ gcc -O2 -DMODULE -D__KERNEL__ -c test.c _c表示輸出制定名,自動生成.o文件x0dx0ax0dx0a得到文件test.o就是一個設備驅動程序。x0dx0ax0dx0a如果設備驅動程序有多個文件,把每個文件按上面的命令行編譯,然後x0dx0ax0dx0ald ?-r ?file1.o ?file2.o ?-o ?molename。x0dx0ax0dx0a驅動程序已經編譯好了,現在把它安裝到系統中去。x0dx0ax0dx0a$ insmod ?_f ?test.ox0dx0ax0dx0a如果安裝成功,在/proc/devices文件中就可以看到設備test,並可以看到它的主設備號。要卸載的話,運行 :x0dx0ax0dx0a$ rmmod testx0dx0ax0dx0a下一步要創建設備文件。x0dx0ax0dx0amknod /dev/test c major minorx0dx0ax0dx0ac 是指字元設備,major是主設備號,就是在/proc/devices里看到的。x0dx0ax0dx0a用shell命令x0dx0ax0dx0a$ cat /proc/devicesx0dx0ax0dx0a就可以獲得主設備號,可以把上面的命令行加入你的shell script中去。x0dx0ax0dx0aminor是從設備號,設置成0就可以了。x0dx0ax0dx0a我們現在可以通過設備文件來訪問我們的驅動程序。寫一個小小的測試程序。x0dx0ax0dx0a#include x0dx0ax0dx0a#include x0dx0ax0dx0a#include x0dx0ax0dx0a#include x0dx0ax0dx0amain()x0dx0ax0dx0a{x0dx0ax0dx0aint testdev;x0dx0ax0dx0aint i;x0dx0ax0dx0achar buf[10];x0dx0ax0dx0atestdev = open("/dev/test",O_RDWR);x0dx0ax0dx0aif ( testdev == -1 )x0dx0ax0dx0a{x0dx0ax0dx0aprintf("Cann't open file \n");x0dx0ax0dx0aexit(0);x0dx0ax0dx0a}x0dx0ax0dx0aread(testdev,buf,10);x0dx0ax0dx0afor (i = 0; i < 10;i++)x0dx0ax0dx0aprintf("%d\n",buf[i]);x0dx0ax0dx0aclose(testdev);x0dx0ax0dx0a}x0dx0ax0dx0a編譯運行,看看是不是列印出全1 x0dx0ax0dx0a以上只是一個簡單的演示。真正實用的驅動程序要復雜的多,要處理如中斷,DMA,I/O port等問題。這些才是真正的難點。上述給出了一個簡單的字元設備驅動編寫的框架和原理,更為復雜的編寫需要去認真研究LINUX內核的運行機制和具體的設備運行的機制等等。希望大家好好掌握LINUX設備驅動程序編寫的方法。

『陸』 《Linux設備驅動程序》(十六)-中斷處理

設備與處理器之間的工作通常來說是非同步,設備數據要傳遞給處理器通常來說有以下幾種方法:輪詢、等待和中斷。

讓CPU進行輪詢等待總是不能讓人滿意,所以通常都採用中斷的形式,讓設備來通知CPU讀取數據。

2.6內核的函數參數與現在的參數有所區別,這里都主要介紹概念,具體實現方法需要結合具體的內核版本。

request_irq函數申請中斷,返回0表示申請成功,其他返回值表示申請失敗,其具體參數解釋如下:

flags 掩碼可以使用以下幾個:

快速和慢速處理常式 :現代內核中基本沒有這兩個概念了,使用SA_INTERRUPT位後,當中斷被執行時,當前處理器的其他中斷都將被禁止。通常不要使用SA_INTERRUPT標志位,除非自己明確知道會發生什麼。

共享中斷 :使用共享中斷時,一方面要使用SA_SHIRQ位,另一個是request_irq中的dev_id必須是唯一的,不能為NULL。這個限制的原因是:內核為每個中斷維護了一個共享處理常式的列表,常式中的dev_id各不相同,就像設備簽名。如果dev_id相同,在卸載的時候引起混淆(卸載了另一個中斷),當中斷到達時會產生內核OOP消息。

共享中斷需要滿足以下一個條件才能申請成功:

當不需要使用該中斷時,需要使用free_irq釋放中斷。

通常我們會在模塊載入的時候申請安裝中斷處理常式,但書中建議:在設備第一次打開的時候安裝,在設備最後一次關閉的時候卸載。

如果要查看中斷觸發的次數,可以查看 /proc/interrupts 和 /proc/stat。

書中講述了如何自動檢測中斷號,在嵌入式開發中通常都是查看原理圖和datasheet來直接確定。

自動檢測的原理如下:驅動程序通知設備產生中斷,然後查看哪些中斷信號線被觸發了。Linux提供了以下方法來進行探測:

探測工作耗時較長,建議在模塊載入的時候做。

中斷處理函數和普通函數其實差不多,唯一的區別是其運行的中斷上下文中,在這個上下文中有以下注意事項:

中斷處理函數典型用法如下:

中斷處理函數的參數和返回值含義如下:

返回值主要有兩個:IRQ_NONE和IRQ_HANDLED。

對於中斷我們是可以進行開啟和關閉的,Linux中提供了以下函數操作單個中斷的開關:

該方法可以在所有處理器上禁止或啟用中斷。

需要注意的是:

如果要關閉當前處理器上所有的中斷,則可以調用以下方法:

local_irq_save 會將中斷狀態保持到flags中,然後禁用處理器上的中斷;如果明確知道中斷沒有在其他地方被禁用,則可以使用local_irq_disable,否則請使用local_irq_save。

locat_irq_restore 會根據上面獲取到flags來恢復中斷;local_irq_enable 會無條件打開所有中斷。

在中斷中需要做一些工作,如果工作內容太多,必然導致中斷處理所需的時間過長;而中斷處理又要求能夠盡快完成,這樣才不會影響正常的系統調度,這兩個之間就產生了矛盾。

現在很多操作系統將中斷分為兩個部分來處理上面的矛盾:頂半部和底半部。

頂半部就是我們用request_irq來注冊的中斷處理函數,這個函數要求能夠盡快結束,同時在其中調度底半部,讓底半部在之後來進行後續的耗時工作。

頂半部就不再說明了,就是上面的中斷處理函數,只是要求能夠盡快處理完成並返回,不要處理耗時工作。

底半部通常使用tasklet或者工作隊列來實現。

tasklet的特點和注意事項:

工作隊列的特點和注意事項:

閱讀全文

與linux設備驅動考試試題相關的資料

熱點內容
中醫看書好的app 瀏覽:516
win10紙牌變成英文 瀏覽:135
源碼文件圖片路徑怎麼形成的 瀏覽:432
ai變數寬度配置文件點不了 瀏覽:460
強制安裝app去哪裡舉報 瀏覽:719
微信登錄數據保存在哪裡 瀏覽:321
pic編程哪裡下載 瀏覽:549
蘋果ipad官方壁紙 瀏覽:154
華創網路信號怎麼樣 瀏覽:495
共享單車網站源碼 瀏覽:281
a班練琴app下載不了怎麼回事 瀏覽:349
數控中怎麼編程 瀏覽:409
vm如何安裝linux系統 瀏覽:423
歌手實績數據在哪裡看 瀏覽:691
代碼002 瀏覽:714
jdk如何編譯java文件 瀏覽:900
修改iptables配置文件 瀏覽:427
word自動保存指定文件夾 瀏覽:18
電腦畫質不清晰win10 瀏覽:912
diskgen使用教程 瀏覽:970

友情鏈接