linux驱动常规典型面试题目
c吧
全部回复
仅看楼主
level 6
1、设备树中的 compatible 属性有什么作用?
核心作用:驱动与设备的匹配关键字,是设备树匹配的核心依据;
格式规则:字符串格式为 “厂商名,设备驱动程序名”(如 “nxp,s32k344-i2c”),可包含多个字符串(兼容不同驱动);
匹配逻辑:驱动的of_match_table遍历compatible字符串列表,只要有一个匹配即触发 probe;
兼容性:支持 “向下兼容”(如新设备兼容旧驱动的compatible字符串)。
2、驱动如何获取设备树中的属性?
通过内核of_系列接口解析
struct device_node *np = dev->of_node;
(1). 获取整型属性
of_property_read_u32( );
(2). 获取字符串属性
of_property_read_string( );
(3). 获取地址属性
of_address_to_resource( );
(4). 获取数组属性
of_property_read_u32_array( );
3、如何确保驱动资源的正确释放?
设备管理接口(devm_*):优先使用devm_kzalloc/devm_gpio_request/devm_request_irq,内核自动在设备卸载时释放资源,避免手动泄漏;
remove/exit 函数:在驱动remove(设备移除)/exit(模块卸载)函数中,释放未使用 devm 的资源(如手动分配的内存、注册的字符设备);
错误回滚:probe 函数中,若某一步失败,回滚已分配的资源(如 goto 清理);
4、如何处理驱动的依赖关系?
模块依赖:通过MODULE_DEPENDS声明依赖模块如(MODULE_DEPENDS("i2c-core")),或modprobe时指定依赖;
总线依赖:确保驱动依赖的总线(如 I2C/spi)已加载,可在 probe 中检查总线状态;
硬件依赖:通过设备树depends-on属性,确保依赖设备先初始化;
运行时依赖:使用devm_phandle_domain_attach/clk_prepare_enable等接口,确保时钟 / 电源 / 复位等依赖资源就绪后,再初始化驱动;
加载顺序:通过initcall_level(如module_init/late_initcall)调整驱动加载顺序,核心依赖先加载
5、 如何调试 Linux 驱动问题?
(1) 内核日志调试核心工具:dmesg/cat /var/log/kern.log,驱动中用dev_info/dev_err/pr_debug打印日志;
动态调试:开启CONFIG_DYNAMIC_DEBUG,通过echo "file my_driver.c +p">/sys/kernel/debug/dynamic_debug/control打开调试日志。
(2) 硬件调试示波器 / 逻辑分析仪:抓取总线时序(I2C/SPI/GPIO),排查电平异常、时序不匹配;
万用表:测量电源 / 引脚电平,排查短路、供电异常。
(3) 内核调试工具kgdb:内核远程调试,断点调试驱动代码;
ftrace:跟踪函数调用(如 probe/remove)、中断执行时间;
perf:分析驱动性能瓶颈(如 CPU 占用、函数耗时);
sysfs/procfs:导出驱动状态(如/sys/class/gpio//proc/interrupts),查看资源占用。
(4) 常见问题排查
匹配失败:检查设备树compatible与驱动of_match_table是否一致;
probe 不执行:检查总线是否注册、设备是否存在、资源是否冲突;
数据传输失败:检查硬件时序、地址、校验位,打印传输数据缓冲区。
2026年01月06日 02点01分 1
1