内容发布更新时间 : 2024/12/27 17:44:33星期一 下面是文章的全部内容请认真阅读。
驱动基础试题(时间:1个小时)
一、 选择题(每题 4 分,共 40 分,包括单选和多选,多选、少选均不得分)
1. Linux系统中将设备进行分类管理,下列设备中( ACD )属于字符设备, ( BC)属于块设备 [A] 键盘 [B] 硬盘 [C] 闪存设备 [D] 帧缓存设备 [E] 网卡 2. Linux系统中,内核以( D)区分设备
[A] 设备节点名 [B] 设备类名称 [C] 设备名称 [D] 设备号
3. Linux系统中设备节点可以创建在(D )
[A] /dev目录下 [B] 根目录下 [C] /tmp目录下 [D] 以上都可以 4. Linux驱动程序运行在( A )
[A] 内核空间 [B] 用户空间 [C] 内核空间和用户空间
5. Linux系统中设备驱动程序是以模块形式组的,编译驱动时可以用哪种方式编译( AB )
[A] 静态编译进内核 [B] 动态编译
6. Linux 2.6.35 内核中,设备的主设备号用( B )位来表示,次设备号用( D)位来表示
[A]8 [B] 12 [C]16 [D] 20 [E] 24 [F] 32
7. Linux系统中哪些种类的设备有设备节点( BC )
[A] 定时器 [B] 字符设备 [C] 块设备 [D] 网络设备
8. 通常情况下,kmalloc函数能分配的最大内存是( C )
[A] 4K [B] 64K [C]128K [D] 4M
9. 能保证物理空间上连续的内存分配函数是( AB )
[A]__get_free_pages [B] kmalloc [C] vmalloc [D] malloc
10. Linux系统中通过add_timer 添加的timer是( A )
[A] 一次的 [B] 循环的
1
[C] 以上两种都可以
二、简答题(每题 6 分,共60 分)
1. Linux系统中以模块方式组织设备驱动程序,请列举在一个模块程序中必不可少的组成部分。 (可以写个Hello world模块的程序) #include
static int __init fsmod_init(void) {
printk(KERN_INFO \ return 0; }
static void __exit fsmod_exit(void) { printk(KERN_INFO \}
module_init(fsmod_init); module_exit(fsmod_exit);
MODULE_LICENSE(\
MODULE_AUTHOR(\MODULE_DESCRIPTION(\
2. 请从定义、性质、操作方式等方面对比说明字符设备和块设备。 属性/类别 块设备 字符设备 访问单位/次 有固定大小 无固定大小 随机访问(lseek) 支持 不支持 用户直接访问 不可以 可以 驱动程序 复杂 相对简单 字符设备指哪些必须以串行顺序依次进行访问的设备,字符设备不经过系统系统的快速缓冲,而块设备经过系统的快速缓冲。
3. 请列举Linux设备驱动程序中,中断底半步机制。
Tasklet,工作队列,软中断
4. 简述Linux设备驱动中使用中断的步骤。 request_irq,申请irq;free_irq,释放irq。
另:申请中断 使能或者屏蔽中断 设置中断处理函数 释放中断 5. 简述信号量和自旋锁的异同和使用时的注意事项。
信号量和自旋锁都是解决互斥问题的基本手段,信号量的实现依赖于自旋锁。使用信号量机制时,进程若不能获得信号量,进程不会如自旋锁那样原地打转,而是让进程进入休眠
2
等待状态。 当使用信号量的开销时间T1大于使用自旋锁的开销T2时,宜使用自旋锁,若T2大于
T1,则宜使用信号量。由于信号量所保护的临界区可能包含引起阻塞的代码,而自旋锁则绝对要避免用来保护这样的代码。信号量存在于进程上下文,而如果被保护的资源需要在中断或者软中断情况下使用,则只能选择自旋锁。 详见linux设备驱动详解(宋宝华第二版)P155
6. 简述命令 mknod /dev/zero c 1 5 的做用和命令各个部分的含义,并写出创建一个块设备节点的命令。
mknod,该命令用于创建设备节点。/dev/zero 表示设备节点创建的目录和名字,c 代表创建的设备节点为字符设备节点,1 代表主设备号,5 代表此设备号。
创建块设备节点的命令: mknod /dev/one b 200 0
7. 简述命令insmod,rmmod,lsmod 的功能。
insmod:加载驱动模块到内核;rmmod:从内核删除驱动模块; lsmod:查看当前内核包含哪些驱动模块。
8. 驱动程序中采用动态申请设备号的,我们如何得到对应设备的设备号?
cat proc/dervices
9. 简述设备驱动程序和普通应用程序的异同点。
不同点:驱动运行于内核,应用程序在用户空间;应用程序能调用C库;应用程序顺序执行,驱动被动的接受调用;应用程序的栈很大,驱动很小,通常4k;应用程序可以做浮点运算,驱动中很少做浮点运算(并不是绝对不能)。
10. 简述如何将一个字符设备驱动改造为platform驱动,并说明匹配的过程。
首先:定义一个platform_driver结构体,对probe和remove函数指针进行初始化,对driver里面的成员.owner,.name进行初始化;
第二:在模块的初始化函数中调用platform_drive_registe()初始化这个驱动,在卸载模块中调用platfrom_driver_unregister()注销这个驱动;
第三:将驱动中实用的设备资源信息通过传递进来的platform_device结构体指针获取。 还有平台设备添加,一种是:用platform_device手动编码;另一种是在设备树中添加一个节点。
匹配过程:一种是:如果是平台设备与平台驱动的匹配以名字匹配,平台总线将会遍历对方,如果名字相同,则调用平台驱动的probe函数,并且将匹配上的平台设备的结构体指针传给设备函数;另一种是:去匹配设备树中的设备节点里面的兼容属性的值,匹配上则调用平台驱动的probe函数,并且将匹配上的平台设备的结构体指针传给设备函数。
3