嵌入式面试中可能问到的题目和答案整理(内核驱动篇)

       写在前面:在大战之前,最好还是先做好准备,鉴于上一次的失利,所以接下来面试之前,还是要整理一下自己的问题库,这样才不会出现面试的时候,一问基础,懵逼的回答不上来,那就实在是太尴尬了。

参考的帖子:

http://blog.csdn.net/bitch_____/article/details/70158067

内核、驱动相关

1、中断和中断的上半部分和下半部分的问题

       中断会打断内核中进程的正常调度和运行,当中断到来时,要完成的工作往往并不会是短小的,它可能要进行较大量的耗时处理。所以中断处理程序中所有不要求立即完成的,在开中断的环境下,由中断后半段完成.

      中断前半段主要完成尽可能少的比较紧急的功能,例如简单地读取寄存器中的中断状态并清除中断标志后就进行“登记中断”的工作。这样,顶半部执行的速度就会很快,可以服务更多的中断请求。

       复杂的内容则交由中断下半部来执行,而且中断下半部可以被新的中断打断,这也是底半部和顶半部的最大不同。

       当然, 如果中断比较简单,就不用区分上下半部了。

       Linux 系统实现底半部的机制主要有:

       三种:tasklet,工作队列和软中断。  

1.1、tasklet与workqueue的区别及底层实现区别

       1)softirq和tasklet都属于软中断,tasklet是softirq的特殊实现;workqueue是普通的工作队列。  

       2)如果推后执行的任务需要睡眠,那么就选择工作队列workqueue(工作队列是基于线程的封装)。

            如果推后执行的任务不需要睡眠,那么就选择tasklet。

参考

http://blog.csdn.net/cupidove/article/details/49927259

1.2、linux中断的响应执行流程?

       处理器收到来自中断控制器的中断处理请求,保存中断上下文,跳转到中断对应的处理处,(快速完成中断中断上半部,中断上半部返回后执行中断下半部。如果做了上下半部处理的话),中断处理函数返回时恢复现场。

1.3、软中断的工作工程模拟了实际的中断处理过程

       1)当某一软中断时间发生后,首先需要设置对应的中断标记位,触发中断事务(raise_softirq()设置软中断状态bitmap,触发软中断事务)
       2)然后唤醒守护线程去检测中断状态寄存器(在Linux中 软中断daemon线程函数为do_softirq())
       3)如果通过查询发现某一软中断事务发生之后,那么通过软中断向量表调用软中断服务程序action()。

       一个软中断不会去抢占另一个软中断,只有硬件中断才可以抢占软中断,所以软中断能够保证对时间的严格要求。

       这就是软中断的过程,与硬件中断唯一不同 的地方是从中断标记到中断服务程序的映射过程。在CPU的硬件中断发生之后,CPU需要将硬件中断请求通过向量表映射成具体的服务程序,这个过程是硬件自 动完成的,但是软中断不是,其需要守护线程去实现这一过程,这也就是软件模拟的中断,故称之为软中断。

2、驱动中操作物理绝对地址为什么要先ioremap?

       因为内核没有办法直接访问物理内存地址,必须先通过ioremap获得对应的虚拟地址。

3、自旋锁和信号量在互斥使用时需要注意哪些?在中断服务程序里面的互斥是使用自旋锁还是信号量?

       使用自旋锁的进程不能睡眠,使用信号量的进程可以睡眠。中断服务例程中的互斥使用的是自旋锁,原因是在中断处理例程中,硬中断是关闭的,这样会丢失可能到来的中断。

4、内核函数mmap的实现原理,机制?

       mmap函数实现把一个文件映射到一个内存区域,从而我们可以像读写内存一样读写文件,他比单纯调用read/write也要快上许多。在某些时候我们可以把内存的内容拷贝到一个文件中实现内存备份,当然,也可以把文件的内容映射到内存来恢复某些服务。另外,mmap实现共享内存也是其主要应用之一,mmap系统调用使得进程之间通过映射同一个普通文件实现共享内存。

5、linux中内核空间及用户空间的区别?

       区别有很多,简言概之就是:Linux系统采取两级保护机制,对应两种不同的操作权限,内核空间权限高于用户空间权限,内核空间和用户空间都有属于自己的虚拟空间。

       在32位系统中,cpu最高有32位寻址范围,即对应4G空间,内核空间被划分在高1G虚拟空间,用户空间在低3G

       普通应用程序运行在用户空间,执行一些贴近用户的低权限操作,系统内核程序,操作硬件的驱动程序等一些要求高级权限的程序运行在内核空间。

       用户空间程序不能直接访问内核空间的数据,内核空间程序也一样不能直接访问属于用户进程空间的数据,用户空间和内核空间之间的通信必须通过一些特定的方法。

5.1、用户空间与内核通信方式有哪些?

      1)首先想到的是系统调用,用户空间进程通过系统调用进入内核空间,访问指定的内核空间数据;
      2).其次是驱动程序,用户空间进程可以使用封装后的系统调用接口访问驱动设备节点,以和运行在内和空间的驱动程序通信;
      3).共享内存mmap,在代码中调用接口,实现内核空间与用户空间的地址映射,在实时性要求很高的项目中为首选,省去拷贝数据的时间等资源,但缺点是不好控制;

      4).最后,copy_to_user()、copy_from_user(),是在驱动程序中调用接口,实现用户空间与内核空间的数据拷贝操作,应用于实时性要求不高的项目中。

6、设备驱动模型三个重要成员是?platfoem总线的匹配规则是?

    总线,设备,驱动。匹配规则就是当有一个新的设备挂起时,总线被唤醒,match函数被调用,用device名字去跟本总线下的所有驱动名字去比较。相反就是用驱动的名字去device链表中和所有device的名字比较。如果匹配上,才会调用驱动中的probe函数,否则不调用。




你可能感兴趣的:(面试相关)