写在前面:在大战之前,最好还是先做好准备,鉴于上一次的失利,所以接下来面试之前,还是要整理一下自己的问题库,这样才不会出现面试的时候,一问基础,懵逼的回答不上来,那就实在是太尴尬了。
参考的帖子:
http://blog.youkuaiyun.com/bitch_____/article/details/70158067 |
内核、驱动相关
1、中断和中断的上半部分和下半部分的问题
中断会打断内核中进程的正常调度和运行,当中断到来时,要完成的工作往往并不会是短小的,它可能要进行较大量的耗时处理。所以中断处理程序中所有不要求立即完成的,在开中断的环境下,由中断后半段完成.
中断前半段主要完成尽可能少的比较紧急的功能,例如简单地读取寄存器中的中断状态并清除中断标志后就进行“登记中断”的工作。这样,顶半部执行的速度就会很快,可以服务更多的中断请求。
复杂的内容则交由中断下半部来执行,而且中断下半部可以被新的中断打断,这也是底半部和顶半部的最大不同。
当然, 如果中断比较简单,就不用区分上下半部了。
Linux 系统实现底半部的机制主要有:
三种:tasklet,工作队列和软中断。
1.1、tasklet与workqueue的区别及底层实现区别
1)softirq和tasklet都属于软中断,tasklet是softirq的特殊实现;workqueue是普通的工作队列。
2)如果推后执行的任务需要睡眠,那么就选择工作队列workqueue(工作队列是基于线程的封装)。
如果推后执行的任务不需要睡眠,那么就选择tasklet。
参考http://blog.youkuaiyun.com/cupidove/article/details/49927259 |
1.2、linux中断的响应执行流程?
处理器收到来自中断控制器的中断处理请求,保存中断上下文,跳转到中断对应的处理处,(快速完成中断中断上半部,中断上半部返回后执行中断下半部。如果做了上下半部处理的话),中断处理函数返回时恢复现场。1.3、软中断的工作工程模拟了实际的中断处理过程
1)当某一软中断时间发生后,首先需要设置对应的中断标记位,触发中断事务(raise_softirq()设置软中断状态bitmap,触发软中断事务)
2)然后唤醒守护线程去检测中断状态寄存器(在Linux中 软中断daemon线程函数为do_softirq())
3)如果通过查询发现某一软中断事务发生之后,那么通过软中断向量表调用软中断服务程序action()。
一个软中断不会去抢占另一个软中断,只有硬件中断才可以抢占软中断,所以软中断能够保证对时间的严格要求。
这就是软中断的过程,与硬件中断唯一不同 的地方是从中断标记到中断服务程序的映射过程。在CPU的硬件中断发生之后,CPU需要将硬件中断请求通过向量表映射成具体的服务程序,这个过程是硬件自 动完成的,但是软中断不是,其需要守护线程去实现这一过程,这也就是软件模拟的中断,故称之为软中断。
2、驱动中操作物理绝对地址为什么要先ioremap?
3、自旋锁和信号量在互斥使用时需要注意哪些?在中断服务程序里面的互斥是使用自旋锁还是信号量?
4、内核函数mmap的实现原理,机制?
mmap函数实现把一个文件映射到一个内存区域,从而我们可以像读写内存一样读写文件,他比单纯调用read/write也要快上许多。在某些时候我们可以把内存的内容拷贝到一个文件中实现内存备份,当然,也可以把文件的内容映射到内存来恢复某些服务。另外,mmap实现共享内存也是其主要应用之一,mmap系统调用使得进程之间通过映射同一个普通文件实现共享内存。5、linux中内核空间及用户空间的区别?
区别有很多,简言概之就是:Linux系统采取两级保护机制,对应两种不同的操作权限,内核空间权限高于用户空间权限,内核空间和用户空间都有属于自己的虚拟空间。
在32位系统中,cpu最高有32位寻址范围,即对应4G空间,内核空间被划分在高1G虚拟空间,用户空间在低3G。
普通应用程序运行在用户空间,执行一些贴近用户的低权限操作,系统内核程序,操作硬件的驱动程序等一些要求高级权限的程序运行在内核空间。
用户空间程序不能直接访问内核空间的数据,内核空间程序也一样不能直接访问属于用户进程空间的数据,用户空间和内核空间之间的通信必须通过一些特定的方法。
5.1、用户空间与内核通信方式有哪些?
2).其次是驱动程序,用户空间进程可以使用封装后的系统调用接口访问驱动设备节点,以和运行在内和空间的驱动程序通信;
3).共享内存mmap,在代码中调用接口,实现内核空间与用户空间的地址映射,在实时性要求很高的项目中为首选,省去拷贝数据的时间等资源,但缺点是不好控制;
4).最后,copy_to_user()、copy_from_user(),是在驱动程序中调用接口,实现用户空间与内核空间的数据拷贝操作,应用于实时性要求不高的项目中。
6、设备驱动模型三个重要成员是?platfoem总线的匹配规则是?
总线,设备,驱动。匹配规则就是当有一个新的设备挂起时,总线被唤醒,match函数被调用,用device名字去跟本总线下的所有驱动名字去比较。相反就是用驱动的名字去device链表中和所有device的名字比较。如果匹配上,才会调用驱动中的probe函数,否则不调用。