- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
Linux驱动面试题及答案
一、基础概念题
Linux驱动按设备类型分哪几类?实际开发中分别对应哪些设备?
答案:分字符设备、块设备、网络设备三类。
字符设备:按字节流顺序读写,比如串口(/dev/ttyS0)、LED、按键,驱动里通常要实现open/close/read/write接口;
块设备:按固定大小块读写,支持随机访问,比如硬盘(/dev/sda)、U盘,会用到块设备驱动框架(如blk-mq);
网络设备:不对应/dev下的节点,通过网卡名(如eth0)管理,依赖网络子系统,核心是实现数据包收发接口。
字符设备驱动中,主设备号和次设备号的作用是什么?如何动态分配主设备号?
答案:
主设备号标识驱动(同一类设备共用一个主设备号),次设备号标识同一驱动下的具体设备(比如同一串口驱动的ttyS0、ttyS1);
动态分配用alloc_chrdev_region()函数,比静态指定(register_chrdev_region)更安全,避免主设备号冲突,示例:
dev_tdev;
//动态分配1个次设备号(从0开始),设备名mychar
alloc_chrdev_region(dev,0,1,mychar);
//分配后主设备号=MAJOR(dev),次设备号=MINOR(dev)
二、内核模块与内存管理
内核模块加载和卸载的核心函数是什么?模块加载时为什么要指定MODULE_LICENSE?
答案:
加载函数:module_init(驱动初始化函数);卸载函数:module_exit(驱动清理函数);
MODULE_LICENSE用于声明模块遵循的开源协议(如GPL),如果不指定,内核会认为模块“污染内核”(tainted),后续出问题时内核日志会忽略该模块相关信息,而且部分内核接口(如EXPORT_SYMBOL_GPL导出的函数)只有GPL协议的模块才能调用。
内核空间分配内存有哪些函数?kmalloc和vmalloc的核心区别是什么?
答案:
常用函数:kmalloc、vmalloc、kzalloc(kmalloc+清零)、get_zeroed_page(分配一页并清零);
区别:
kmalloc:分配物理连续内存,速度快,适合小内存(通常小于128KB),用于硬件寄存器访问(硬件要求物理地址连续);
vmalloc:分配虚拟地址连续、物理地址不连续的内存,速度慢(要建立页表),适合大内存(如分配几MB缓存),不能用于硬件直接访问。
三、中断与并发
中断处理为什么要分上下半部?下半部有哪些实现方式?各自适用场景是什么?
答案:
原因:上半部(中断处理函数)要快速执行(关中断,避免影响其他中断),只能做“紧急操作”(如清中断标志、保存寄存器值);耗时操作(如数据拷贝、通知应用层)要放下半部,让中断尽快恢复使能;
下半部方式及场景:
tasklet:基于软中断实现,同一CPU上串行执行,不能睡眠(用spinlock同步),适合短耗时任务(如处理中断接收的少量数据);
工作队列(workqueue):基于内核线程,能睡眠(可用mutex同步),适合长耗时任务(如将中断数据写入文件);
软中断:优先级高于tasklet,适合内核核心子系统(如网络收发、块设备IO),驱动开发很少直接用。
内核中解决并发问题的同步机制有哪些?自旋锁和互斥锁(mutex)的核心区别是什么?
答案:
同步机制:spinlock(自旋锁)、mutex(互斥锁)、semaphore(信号量)、rcu(读-复制-更新);
自旋锁vs互斥锁:
自旋锁:获取不到锁时“忙等”(循环检测锁状态),不放弃CPU,适合短临界区(如硬件寄存器操作),不能在中断上下半部混用(可能导致死锁),且持有期间不能睡眠;
mutex:获取不到锁时会让进程进入休眠,释放CPU,适合长临界区(如访问共享内存缓冲区),只能在进程上下文使用(不能在中断上下文用)。
四、设备树与驱动适配
设备树(DeviceTree)的作用是什么?驱动中如何获取设备树里定义的GPIO属性?
答案:
作用:替代传统的板级代码(如mach-xxx目录下的硬件配置),将硬件信息(如引脚、中断号、时钟)与驱动代码分离,同一驱动可适配不同硬件(只需修改设备树);
获取GPIO属性示例(以获取led-gpios属性为例):
structdevice_node*np=dev-of_node;//从设备结构体获取设备树节点
intled_gpio;
//解析设备树中led-gpios属性,返回GPIO编号
led_gpio=of_get_named_gpio_flags(np,led-g
您可能关注的文档
最近下载
- 民宿设计格式课件.pptx
- 中医治疗带状疱疹后遗神经痛的研究.doc VIP
- 江铃-江铃E400-产品使用说明书-E400豪华型-JX70021BEV-江铃E400使用说明书.pdf VIP
- ISO IEC 27017-2015 信息技术--安全技术--基于ISO IEC 27002的云服务信息安全控制实践准则.pdf
- 脑疝病人的护理课件(完整版).pptx VIP
- 4-6岁 《游来游去的水母》-美术课件.ppt VIP
- 100个超级有趣的冷知识.pdf VIP
- 指挥调度系统项目可行性研究报告.docx VIP
- 公司节能减排方案.pptx VIP
- RBANS记录表(精分,重度抑郁,焦虑障碍,正常对照).docx VIP
文档评论(0)