分析过程

  1. 字符型驱动设备你是怎么创建设备文件的,就是/dev/下面的设备文件,供上层应用程序打开使用的?

这里首先会定义主设备号和次设备号:主设备号用来标识与设备文件相连的驱动程序,用来反映设备类型。次设备号被驱动程序用来辨别操作的是哪个设备,用来区分同类型的设备。

  1. 写一个中断服务需要注意哪些?如果中断产生之后要做比较多的事情你是怎么做的?

vivo 面试的时候有问到这个问题

softirq与tasklet 的区别

  • 软中断类型内核中都是静态分配,不支持动态分配,而tasklet支持动态和静态分配,也就是驱动程序中能比较方便的进行扩展;
  • 软中断可以在多个CPU上并行运行,因此需要考虑可重入问题,而tasklet会绑定在某个CPU上运行,运行完后再解绑,不要求重入问题,当然它的性能也就会下降一些;

参考Linux 驱动面试题总结

  1. 自旋锁和信号量在互斥使用时需要注意哪些?在中断服务程序里面的互斥是使用自旋锁还是信号量?还是两者都能用?为什么?
  1. 原子操作你怎么理解?为了实现一个互斥,自己定义一个变量作为标记来作为一个资源只有一个使用者行不行?
  1. insmod/rmmod一个驱动模块,会执行模块中的哪些函数?这两个函数在设计上要注意事项?遇到过卸载驱动出现异常没?是什么问题引起的?
  1. 在驱动调试过程中遇到过oops没?你是怎么处理的?

oops错误日志信息

Unable to handle kernel NULL pointer dereference at virtual address 00000020
pgd = 80004000
[00000020] *pgd=00000000
Internal error: Oops: 17 [#1] PREEMPT
last sysfs file: /sys/devices/platform/mxsdhci.2/mmc_host/mmc0/mmc0:0001/boot_bus_config
CPU: 0 Not tainted (2.6.35.3 #10)
PC is at fsg_main_thread+0x144/0x730
LR is at schedule+0x2ac/0x328
pc : [<8025b0b4>] lr : [<802ac778>] psr: 60000013

操作到了空指针错误,PC指针指向fsg_main_thread+0x144 处,fsg_main_thread()函数位于driver/usb/gadgate/file_storage.c这个文件内,但是0x144的 offset是哪一行呢?由于发生这个oops的kernel缺省没有包含debug信息,所以需要重新生成一个带debug info的vmlinux

第一步: 重新编译一个带有调试信息的vmlinux,选择kernel hacking->Kernel debugging->Compile the kernel with debug info,编译出来的vmlinux 就带有调试符号 (vmlinux是编译出来的最原始的内核文件,未压缩。zImage是vmlinux经过gzip压缩后的文件。)

第二步 : 打开编译好的kernel/vmlinux所在目录的符号表文件System.map,搜索fsg_main_thread,找到所在的行,最左边的就是fsg_main_thread的地址了,即8025af70,偏移0x144,最终出错的地址是: 0x8025af70+0x144=0x8025b0b4

第三步 : 此时用编译kernel的toolchain中的gdb工具打开带调式符号的 vmlinux,在gdb中使用b命令设置断点, (gdb) b * 0x8025b0b4 最终得到了出错的代码行号 Breakpoint 1 at 0x8025b0b4 : file drivers/usb/gadget/file_storage.c, line 2750.

第四步 : 拿到了行号就可以继续深入debug了,在该行前后加一些BUG_ON()宏对变量进行测试,最终找到出错的语句。

  1. ioctl和unlock_ioctl有什么区别?

  2. 设备驱动模型三个重要成员是?platfoem总线的匹配规则是?在具体应用上要不要先注册驱动再注册设备?有先后顺序没?

  3. 嵌入式设备,为加快启动速度,可以做哪些方面的优化?

  1. spinlock自旋锁是如何实现的?
  1. 驱动里面为什么要有并发、互斥的控制?如何实现?讲个例子?
  2. 内核函数mmap的实现原理,机制?
  3. 中断的上半部分和下半部分的问题:讲下分成上半部分和下半部分的原因,为何要分?讲下如何实现?
  1. IRQ和FIQ有什么区别,在CPU里面是是怎么做的?
  1. linux内核里面,内存申请有哪几个函数,各自的区别?
  1. 大小端详解

  2. input 输入子系统的整体流程

  1. audio latency

  2. kernel 第一个执行的函数

  3. 驱动中设备和驱动的注册顺序 ?

参考