前言
第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
『陆』 《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的特点和注意事项:
工作队列的特点和注意事项: