logo资料库

linux驱动相关面试题目.pdf

第1页 / 共19页
第2页 / 共19页
第3页 / 共19页
第4页 / 共19页
第5页 / 共19页
第6页 / 共19页
第7页 / 共19页
第8页 / 共19页
资料共19页,剩余部分请下载后查看
1、字符型驱动设备你是怎么创建设备文件的,就是/dev/下面的设备文件,供上 层应用程序打开使用的文件? 答:mknod 命令结合设备的主设备号和次设备号,可创建一个设备文件。 评:这只是其中一种方式,也叫手动创建设备文件。还有 UDEV/MDEV 自动创建设 备文件的方式,UDEV/MDEV 是运行在用户态的程序,可以动态管理设备文件,包 括创建和删除设备文件,运行在用户态意味着系统要运行之后。那么在系统启动 期间还有 devfs 创建了设备文件。一共有三种方式可以创建设备文件。 2、写一个中断服务需要注意哪些?如果中断产生之后要做比较多的事情你是怎 么做的? 答:中断处理例程应该尽量短,把能放在后半段(tasklet,等待队列等)的任务 尽量放在后半段。 评:写一个中断服务程序要注意快进快出,在中断服务程序里面尽量快速采集信 息,包括硬件信息,然后推出中断,要做其它事情可以使用工作队列或者 tasklet 方式。也就是中断上半部和下半部。 第二:中断服务程序中不能有阻塞操作。为什么?大家可以讨论。 第三:中断服务程序注意返回值,要用操作系统定义的宏做为返回值,而不是自 己定义的 OK,FAIL 之类的。 3、自旋锁和信号量在互斥使用时需要注意哪些?在中断服务程序里面的互斥是 使用自旋锁还是信号量?还是两者都能用?为什么? 答:使用自旋锁的进程不能睡眠,使用信号量的进程可以睡眠。中断服务例程中 的互斥使用的是自旋锁,原因是在中断处理例程中,硬中断是关闭的,这样会丢 失可能到来的中断。 4、原子操作你怎么理解?为了实现一个互斥,自己定义一个变量作为标记来作 为一个资源只有一个使用者行不行? 所谓原子操作,就是该操作绝不会在执行完毕前被任何其他任务或事件打断,也 就说,它的最小的执行单位,不可能有比它更小的执行单位。定义一个变量,比 如 int flag =0; if(flag == 0) { flag = 1; 操作临界区; flag = 0; } 这样应该不能起到互斥的作用。因为另外一个进程根本没有 flag 这个变量,自 然不用 检查就能进入临界区。充当互斥的变量应该是访问进程都可见的
5、insmod 一个驱动模块,会执行模块中的哪个函数?rmmod 呢?这两个函数在 设计上要注意哪些?遇到过卸载驱动出现异常没?是什么问题引起的? 答:insmod 调用 init 函数,rmmod 调用 exit 函数。这两个函数在设计时要注意 什么?卸载模块时曾出现卸载失败的情形,原因是存在进程正在使用模块,检查 代码后发现产生了死锁的问题。 评:要注意在 init 函数中申请的资源在 exit 函数中要释放,包括存储,ioremap, 定时器,工作队列等等。也就是一个模块注册进内核,退出内核时要清理所带来 的影响,带走一切不留下一点痕迹。 6、在驱动调试过程中遇到过 oops 没?你是怎么处理的? oops 就是 kernel 在运行过程中打印出来的 warning、exceptiont 等的信息,一 般包含 stack 信息,调用过程,不同有情况不同的处理方法,有些不影响运行的 warning 级的,都不处理, 7、ioctl 和 unlock_ioctl 有什么区别? 使用 ioctl 的函数声明为:(int *ioctl)(struct inode *inodep, struct file *filp, unsigned int cmd, unsigned long arg) 使用 unlock_ioctl 的函数声明:(int *ioctl)(struct file *filp, unsigned int cmd, unsigned long arg) 在 2.6.36 以后 ioctl 函数已经不再存在了,而是用 unlocked_ioctl 和 compat_ioctl 两个函数实现以前版本的 ioctl 函数。同时在参数方面也发生了 一定程度的改变,去除了原来 ioctl 中的 struct inode 参数,同时改变了返回 值。compat_ioctl 主要是在 64 位系统中可能会用到, 8、驱动中操作物理绝对地址为什么要先 ioremap? 答:因为内核没有办法直接访问物理内存地址,必须先通过 ioremap 获得对应的 虚拟地址。 9、设备驱动模型三个重要成员是?platfoem 总线的匹配规则是?在具体应用上 要不要先注册驱动再注册设备?有先后顺序没? 总线,设备,驱动。匹配规则就是当有一个新的设备挂起时,总线被唤醒,match 函数被调用,用 device 名字去跟本总线下的所有驱动名字去比较。相反就是用 驱动的名字去 device 链表中和所有 device 的名字比较。如果匹配上,才会调用 驱动中的 probe 函数,否则不调用。至于先后顺序,鉴于个人理解,不会有影响, 不管谁先谁后,bus 都会完成匹配工作。谈谈对 Linux 设备驱动模型的认识:设 备驱动模型的出现主要有三个好处,设备与驱动分离,驱动可移植性增强;设备 驱动抽象结构以总线结构表示看起来更加清晰明了,谁是属于哪一条 bus 的;最 后,就是大家最熟悉的热插拔了,设备与驱动分离,很好的奠定了热插拔机制。 10、Linux 中内核空间 z 及用户空间的区别?用户空间与内核通信方式有哪些?
内核空间中存放的是内核代码和数据,而进程的用户空间中存放的是用户程的代 码和数据。 -在 32 位架构 cpu 中,物理内存大小限制在 4G。linux 将 4G 内存分为两部分,0~ 1G 为 kernel 使用,1~4G 为用户使用;进程运行在 kernel,就是运行在 0-1G, 进程运行在用户空间,就是运行在 1-4G。 -用户空间和内核空间通信方式有那些? 1. 使用 API:这是最常使用的一种方式了 A.get_user(x,ptr):在内核中被调用,获取用户空间指定地址的数值并保存到 内核变量 x 中。 B.put_user(x,ptr):在内核中被调用,将内核空间的变量 x 的数值保存到到用 户空间指定地址处。 C.Copy_from_user()/copy_to_user():主要应用于设备驱动读写函数中,通过 系统调用触发。 2. 使用 proc 文件系统:和 sysfs 文件系统类似,也可以作为内核空间和用户空 间交互的手段。 3. netlink 4. 使用 mmap 系统调用 5. 信号 11、linux 中内存划分及如何使用?虚拟地址及物理地址的概念及彼此之间的转 化,高端内存概念? 1. 用户虚拟地址 这是在用户空间进程所能看到的常规地址。每个进程多有自己的虚拟地 址,并且可以使用大于物理内存大小的空间。 2. 物理地址 该地址在处理器和系统内存之间使用,对应与真是物理地址。 3. 总线地址 没看懂,不说了。 4. 内核逻辑地址 内核逻辑地址组成了内核的常规地址空间。该地址映射了部分(或者全 部)内存,并经常被视为物理地址。 逻辑地址使用硬件内建的指针大小,因此在安装了大量内存的 32 位系 统中,它无法寻址全部的物理内存。 逻辑地址通常保存在 unsigned long 或者 void *这样类型的变量中。 kmalloc 返回的内存就是内核逻辑地址。 (上面这段话很重要,一定要理解,建议自己使用记号笔标红) 5. 内核虚拟地址 内核虚拟地址与物理地址的映射不必是一对一的,而这是虚拟地址的特 点。 所有逻辑地址都是内核虚拟地址,但是许多内核虚拟地址不是逻辑地址。 vmalloc 分配的内存就是一个虚拟地址。 可以参考下面的地址:
12、linux 中中断的实现机制,tasklet 与 workqueue 的区别及底层实现区别? 为什么要区分上半部和下半部? 答案一: Linux 中断分为硬件中断和内部中断(异常),调用过程:外部中断产生->发送 中断信号到中断控制器->通知处理器产生中断的中断号,让其进一步处理。对于 中断上半部和下半部的产生,为了中断处理过程中被新的中断打断,将中断处理 一分为二,上半部登记新的中断,快速处理简单的任务,剩余复杂耗时的处理留 给下半部处理,下半部处理过程中可以被中断,上半部处理时不可被中断。至于 tasklet 和工作队列,在网上看了一圈,由于不常用,看的有点迷糊,个人理解: 两者都是中断下半部的一种实现方法,区别在于,tasklet 支持 smp,不可睡眠。 工作队列基于线程的封装,因此支持睡眠。 答案二: 内核把中断处理分为两部分:上半部(tophalf)和下半部(bottomhalf),上 半部(就是中断服务程序)内核立即执行,而下半部(就是一些内核函数)留着 稍后处理。下半部运行时是允许中断请求的,而上半部运行时是关中断的,这是 二者之间的主要区别。 13、linux 中断的响应执行流程?中断的申请及何时执行(何时执行中断处理函 数)? 中断的响应流程:cpu 接受终端->保存中断上下文跳转到中断处理历程->执行中 断上半部->执行中断下半部->恢复中断上下文。 中断的申请 request_irq 的正确位置:应该是在第一次打开 、硬件被告知终端 之前。 14、linux 中的同步机制?spinlock 与信号量的区别? linux 中的同步机制:自旋锁/信号量/读取所/循环缓冲区 spinlock 在得不到锁的时候,程序会循环访问锁,性能下降 信号量在得不到锁的时候会休眠,等到可以获得锁的时候,继续执行。 15、linux 中 RCU 原理? rcu 是 2.6 出现的一种读写锁,可以说是老的读写锁的升级版,主要用在链表这 种数据结构上,经典使用场景是多读者少写者的情况,rcu 允许多个读者一个写 者共同操作数据而不必加锁,这是经典用法,若出现多个写者时,写者与写者之 间就得自己手动同步。当要删除一个节点时,删除后并不会马上释放节点,而是 会等待在删除动作之前已经开始读该节点的读者都完成读操作之后才会释放此 节点,这段时间被称为宽限期。 16、linux 中软中断的实现原理? Linux 系统中的软中断是专为一些不是不是特别要紧的耗时任务而产生的一种 机制,多数用在中断处理过程中,典型应用就是用于中断下半部,tasklet 机制
就是基于软中断的典型下半部应用。软中断就是结合任务调度,延迟处理等让守 护进程去处理一些不是特别紧急又耗时的任务。 17、linux 系统实现原子操作有哪些方法? 搁置 18、MIPS Cpu 中空间地址是怎么划分的?如在 uboot 中如何操作设备的特定的 寄存器? 搁置 19、linux 中系统调用过程?如:应用程序中 read()在 linux 中执行过程即从用 户空间到内核空间? 系统调用,比如 open(),它并不是真正的系统调用实现函数,其实它只是一 个 c 库函数,内部实现就做了两件事,先把系统调用号传递给内核,最后拉起一 次软中断,自此 cpu 进入内核态运行,内核在软中断向量表中找出对应的中断类 型,根据中断类型找到对应的软中断执行函数,执行函数根据系统调用号,在系 统调用号表里面找到对应的系统调用函数。 Garmen : 上层的应用程序通过 C 库调用 open()、read()等等,C 库有 swi value 这条指令来触发某个异常,这个异常就会进入内核空间的异常处理函数会根据 swi value 传入不同的值来调用 sys_read()\sys_write()\sys_open(),然后这 些函数再调用到驱动程序的 drv_read()\drv_write()等等 20、linux 内核的启动过程(源代码级)? http://blog.csdn.net/gqb_driver/article/details/26954425 21、linux 调度原理? 22、linux 网络子系统的认识? 网络子系统可以概括描述为: 应用程序-》系统调用接口(主要是指 socket 接口)-》协议无关接口(有 socket 实现,提供一套通用接口支持不同的协议)-》网络协议(包括 tcp、udp 在内的 网络协议)-》设备无关接口(有 net_device 接口组织的一组通用接口将网络协 议与各种网络设备联系起来)-》设备驱动(即各种网络设备的驱动程序,负责 管理具体的网络设备)-》网络设备(具体的网络硬件设备)。 23、linux 内核里面,内存申请有哪几个函数,各自的区别? 只谈谈常见的三个接口,kmalloc(),vmalloc()和__get_free_pages()。 kmalloc()操作的空间位于直接映射区(即 4G 空间中的 896M 区域),申请到 空间物理地址多为连续地址,常用于操作频繁的数据结构,连续地址利于提高访 问效率。
而对于一些操作不频繁的数据结构可以用 vmalloc()申请内存,vmalloc()操作 的空间优先选择高端内存,这里申请出的内存物理地址往往不是连续的,所以访 问效率不会很高。 __get_free_pages()操作的区域跟 kmalloc()相同,位于直接映射区,不同 的是它申请的是物理页的整倍数大小的内存。 24. IRQ 和 FIQ 有什么区别,在 CPU 里面是是怎么做的? 要求系统更快响应,自身处理所耗时间也很短的中断设置为 FIQ,否则就设置了 IRQ. FIQ 比 IRQ 有更高优先级,如果 FIQ 和 IRQ 同时产生,那么 FIQ 先处理. ARM 的 FIQ 模式提供了更多的 banked 寄存器,r8 到 r14 还有 SPSR,而 IRQ 模式 就没有那么多 如果该中断设置为了 IRQ,那么当该中断产生的时候,中断处理器通过 IRQ 请求 线告诉 ARM,ARM 就知道有个 IRQ 中断来了,然后 ARM 切换到 IRQ 模式运行。类 似的如果该中断设置为 FIQ,那么当该中断产生的时候,中断处理器通过 FIQ 请 求线告诉 ARM,ARM 就知道有个 FIQ 中断来了,然后切换到 FIQ 模式运行。 http://blog.csdn.net/liuchao1986105/article/details/6528386 25. 中断的上半部分和下半部分的问题:讲下分成上半部分和下半部分的原因, 为何要分?讲下如何实现? 上半部分执行与硬件相关的处理要求快, 而有些驱动在中断处理程序中又需要 完成大量工作,这构成矛盾,所以 Linux 有所谓的 bottom half 机制,中断处理程 序中所有不要求立即完成的,在开中断的环境下,由底半程序随后完成. Linux 的底半处理实际上是建立在内核的软中断机制上的. Linux 的底半 机制主要有 Tasklet 和 work queue 以及 softirq ( 2.4 内核则 有 BH , Task queue , softirq , tasklet 没有 work queue),其实底半可以理 解成一种工作的延迟。所以实际使用时跟 timer 机制基本上一个意思。 26. 内核函数 mmap 的实现原理,机制? mmap 函数实现把一个文件映射到一个内存区域,从而我们可以像读写内存一样 读写文件,他比单纯调用 read/write 也要快上许多。在某些时候我们可以把内 存的内容拷贝到一个文件中实现内存备份,当然,也可以把文件的内容映射到内 存来恢复某些服务。另外,mmap 实现共享内存也是其主要应用之一,mmap 系统 调用使得进程之间通过映射同一个普通文件实现共享内存。 27. 驱动里面为什么要有并发、互斥的控制?如何实现?讲个例子? 28. spinlock 自旋锁是如何实现的? 自旋锁在同一时刻只能被最多一个内核任务持有,所以一个时刻只有一个线程允 许存在于临界区中。这点可以应用在多处理机器、或运行在单处理器上的抢占式 内核中需要的锁定服务。 这里也介绍下信号量的概念,因为它的用法和自旋锁有相似的地方。linux 中的信号量是一种睡眠锁。如果有一个任务试图获得一个已被持有的信号量时,
信号量会将其推入等待队列,然后让其睡眠。这时处理器获得自由去执行其它代 码。当持有信号量的进程将信号量释放后,在等待队列中的一个任务将被唤醒, 从而便可以获得这个信号量。 29. 任务调度的机制? http://blog.csdn.net/zhongbeida_xue/article/details/51280292 30. 嵌入式 linux 和 wince 操作系统的特点和特性? Linux: Linux 系统有文本编辑界面和图形用户界面(GUI),包含了 UNIX 系统 的全部功能和特性。其特征包括: 开放性、多用户、多任务、多平台、可编程 SHELL、提供源代码、仿真终端、支持多种文件系统及强大的网络功能等。 https://zhidao.baidu.com/question/581272712.html WinCE:具有开放的通信平台,系统级的可靠性,小内存体积占用,企业范围的 安全性、WinCE.NET 智能特性、WinCE.NET 快捷特性、WinCE.NET 行业应用 http://www.educity.cn/develop/537193.html 31. 嵌入式 linux 中 tty 设备驱动的体系结构? tty 的架构分为三层: 第一层:tty_core 所有 tty 类型的驱动的顶层构架,向应用曾提供了统一的接口,应用层的 read/write 等调用首先会到达这里。此层由内核实现,代码主要分布在 drivers/char 目录下的 n_tty.c,tty_io.c 等文件中 第二层:线路规程 不同的 tty 类型的设备,具有不同的线路规程。这一层也由内核实现,主要代码 在 drivers/char.tty_ldisc.c 文件中。从 tty_read/tty_write 函数可以看出, 他们最后调用到了线路规程的 read/write 函数 第三层: 具体的 tty 类型的驱动,由我们实现,比如我们写的 file_operation 结构体。 前两层在内核中已经实现了,我们只需要套用就行了。 http://blog.chinaunix.net/uid-24227137-id-3437527.html 32. 嵌入式设备,为加快启动速度,可以做哪些方面的优化? 对 BootLoader 进行优化,缩写内核大小,去掉一些不必要的硬件初始化,根据 需要减少默认启动的系统服务,使用 eMMC???(内嵌式存储器标准规格,自 行百度) http://www.doc88.com/p-91667743299.html 33. USB 设备的枚举过程? (1) Get Device Descriptor。主机的第一个命令要求得到设备描述符,此 SETUP 包为 8 个字节数据(80,06,00,01,00,00,40,00),发向地址 0,端口 0。
“40”表示返回数据长度最大为 40H 个字节。实际上,只返回一个包,即数组 DEV_DESC[ ]中的前 8 个字节,用于说明设备的描述符的真实长度和设备的类型。 (2) Set Address。接着是设置设备地址处理事件,主机发送一个含有指定地址 的数据包(00,05,02,00,00,00,00,00),在主机只有一个 USB 设备的 时候,这个地址一般会是 2,最大地址 127,USB 协议中可以连接 127 个设备。 设置地址事件处理结束后,设备进入地址状态,主机以后会在新的指定地址处访 问设备。 (3) Get Device Descriptor。主机再次发送请求得到设备描述符的数据包(80, 06,00,01,00,00,12,00),与上次不同的是,要求的数据的长度是实际的 数据长度,同时是发送到 Set Address 命令所设置的地址。 (4) 读取全部 Configuration Descriptor。接着主机要求得到设备全部的配置 描述符、接口描述符和节点描述符(80,06,00,02,00,00,40,00),由于 主机不知道设备描述符的真实长度,因此它要求得到 64 个字节。 (5) Set Interface,主机发送数据包(01,0B,00,00,00,00,00,00), 设置接口值为 0。 (6) Set Conifguration,确定 USB 设备工作在哪一个配置下。对于 U 盘设备来 说,一般只有 1 个配置值,其值为 01。主机发送数据包(00,09,01,00,00, 00,00,00)。 (7) 如果以上步骤都正确,主机将找到新设备,并且配置成功,该设备可以正常 使用,可以进行后续的 U 盘枚举过程了。 (8) 用 busHound 观察计算机对于 U 盘的枚举过程,发现上述步骤后还有一个 GetMaxLun 的操作,但是实际上对于 U 盘来说忽略该步骤也没有问题。 34. PSRAM、SDRAM、DDR、DDR2 的时序特性? 35.什么是 GPIO? general purpose input/output GPIO 是相对于芯片本身而言的,如某个管脚是芯片的 GPIO 脚,则该脚可作为输 入或输出高或低电平使用,当然某个脚具有复用的功能,即可做 GPIO 也可做其 他用途。 也就是说你可以把这些引脚拿来用作任何一般用途的输入输出,例如用一根引脚 连到 led 的一极来控制它的亮灭,也可以用一根(一些)引脚连到一个传感器上 以获得该传感器的状态,这给 cpu 提供了一个方便的控制周边设备的途经。如果 没有足够多的 gpio 管脚,在控制一些外围设备时就会力有不逮,这时可采取的 方案是使用 CPLD 来帮助管理。 36.触摸屏的硬件原理? 触摸屏的主要三大种类是:电阻技术触摸屏、 表面声波技术触摸屏、 电容技术 触摸屏。 电阻触摸屏的主要部分是一块与显示器表面非常配合的电阻薄膜屏, 这是一种 多层的复合薄膜,它以一层玻璃或硬塑料平板作为基层,表面图有一层透明氧化 金属 (ITO 氧化铟,透明的导电电阻) 导电层,上面在盖有一层外表面硬化处 理、光滑防擦的塑料层 、它的内表面也涂有一层 ITO 涂层 、在他们之间有许多 细小的(小于 1/1000 英寸)的透明隔离点把两层导电层隔开绝缘 。当手指触摸
分享到:
收藏