linux驱动笔试题总结

linux驱动笔试题总结

试题取之于网络,用之于民。最近在学习linux驱动,驱动开发在笔试的时候考的知识点是有规律可循的,并且这些面点也是平时驱动工作中的理论指导,深刻的理解这些面点还是很有必要的,所以在此总结记录,相信会用到的。
ps:以后面试驱动,谁在问我这些问题,我鄙视死他。权威答案整蒙b他。


1:linux中内核空间及用户空间的区别?用户空间与内核通信方式有哪些?

答:
-在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. 信号
内核空间和用户空间通信方式

2:linux中内存划分及如何使用?虚拟地址及物理地址的概念及彼此之间的转化,高端内存概念?

 1. 用户虚拟地址
     这是在用户空间进程所能看到的常规地址。每个进程多有自己的虚拟地址,并且可以使用大于物理内存大小的空间。
 2. 物理地址
     该地址在处理器和系统内存之间使用,对应与真是物理地址。
 3. 总线地址
     没看懂,不说了。
 4. 内核逻辑地址
     内核逻辑地址组成了内核的常规地址空间。该地址映射了部分(或者全部)内存,并经常被视为物理地址。
     逻辑地址使用硬件内建的指针大小,因此在安装了大量内存的32位系统中,它无法寻址全部的物理内存。
     逻辑地址通常保存在unsigned long或者void *这样类型的变量中。kmalloc返回的内存就是内核逻辑地址。
     (上面这段话很重要,一定要理解,建议自己使用记号笔标红)
 5. 内核虚拟地址
     内核虚拟地址与物理地址的映射不必是一对一的,而这是虚拟地址的特点。

     所有逻辑地址都是内核虚拟地址,但是许多内核虚拟地址不是逻辑地址。vmalloc分配的内存就是一个虚拟地址。
     可以参考下面的地址:  

内存详解

linux驱动笔试题总结_第1张图片

总结:高端内存的作用就是用于建立临时地址映射,用于kernel申请user空间内存

3: linux中中断的实现机制,tasklet与workqueue的区别及底层实现区别?为什么要区分上半部和下半部?

答:
tasklet和workqueue区别?
tasklet运行于中断上下文,不允许阻塞 、休眠,而workqueue运行与进程上下文,可以休眠和阻塞。
为什么要区分上半部和下半部?
中断服务程序异步执行,可能会中断其他的重要代码,包括其他中断服务程序。因此,为了避免被中断的代码延迟太长的时间,中断服务程序需要尽快运行,而且执行的时间越短越好,所以中断程序只作必须的工作,其他工作推迟到以后处理。所以Linux把中断处理切为两个部分:上半部和下半部。上半部就是中断处理程序,它需要完成的工作越少越好,执行得越快越好,一旦接收到一个中断,它就立即开始执行。像对时间敏感、与硬件相关、要求保证不被其他中断打断的任务往往放在中断处理程序中执行;而剩下的与中断有相关性但是可以延后的任务,如对数据的操作处理,则推迟一点由下半部完成。下半部分延后执行且执行期间可以相应所有中断,这样可使系统处于中断屏蔽状态的时间尽可能的短,提高了系统的响应能力。实现了程序运行快同时完成的工作量多的目标。

4:linux中断的响应执行流程?中断的申请及何时执行(何时执行中断处理函数)?

中断的响应流程:cpu接受终端->保存中断上下文跳转到中断处理历程->执行中断上半部->执行中断下半部->恢复中断上下文。
中断的申请request_irq的正确位置:应该是在第一次打开 、硬件被告知终端之前。

5:linux中的同步机制?spinlock与信号量的区别?

linux中的同步机制:自旋锁/信号量/读取所/循环缓冲区
spinlock在得不到锁的时候,程序会循环访问锁,性能下降
信号量在得不到锁的时候会休眠,等到可以获得锁的时候,继续执行。

你可能感兴趣的:(嵌入式基础知识)