Linux驱动面试相关

一.linux中内核空间及用户空间的区别?

  1. Linux内核将这4G字节的空间分为两部分。
  2. 将最高的1G字节(从虚拟地址0xC0000000- 0xFFFFFFFF),供内核使用,称为"内核空间".
  3. 而将较低的3G字节(从虚拟地址 0x00000000到0xBFFFFFFF),供各个进程使用,称为"用户空间)。
  4. 因为每个进程可以通过系统调用进入内核,因此,Linux内核由系统内的所有进程共享。(内核空间共享)
  5. 于是,从具体进程的角度来看,每个进程可以拥有4G字节的虚拟空间

二.用户空间与内核通信方式有哪些?
1.API:
 get_user(x,ptr):在内核中被调用,获取用户空间指定地址的数值并保存到内核变量x中。
 put_user(x,ptr):在内核中被调用,将内核空间的变量x的数值保存到到用户空间指定地址处。
 Copy_from_user()/copy_to_user():主要应用于设备驱动读写函数中,通过系统调用触发。

2.使用proc文件系统:和sysfs文件系统类似,也可以作为内核空间与用户空间交互的手段
 调用create_proc_entry,返回一个proc_dir_entry指针,然后去填充这个指针指向的结构就好了,我下面的这个测试用例只是填充了其中的read_proc属性。


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

tasklet运行于中断上下文,不允许阻塞 、休眠,而workqueue运行与进程上下文,可以休眠和阻塞。

为什么要区分上半部和下半部?

  1. 中断服务程序异步执行,可能会中断其他的重要代码,包括其他中断服务程序。因此需要执行的时间越短越好。
  2. Linux把中断处理切为两个部分:上半部和下半部
  3. 上半部就是中断处理程序,工作量越小越好,一旦接收到中断立即执行。下半部分可以推迟处理,一般用于对数据的处理

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

cpu接受终端->保存中断上下文跳转到中断处理历程->执行中断上半部->执行中断下半部->恢复中断上下文

申请中断

request_irq函数

int request_irq(unsigned int irq, irq_handler_t handler,
                         unsigned long irqflags, const char *devname, void *dev_id)

irq是要申请的硬件中断号

  • handler: 是指向系统注册的中断处理函数,是一个回调函数,中断发生时,系统调用这个函数,dev_id参数将被传递给它。
  • irqflags: 是中断处理的属性,若设置了IRQF_DISABLED,则表示中断处理程序是快速处理程序,快速处理程序被调用时屏蔽所有中断,慢速处理程序不屏蔽;若设置了IRQF_SHARED,则表示多个设备共享中断,若设置了IRQF_SAMPLE_RANDOM(老版本中的SA_SAMPLE_RANDOM),表示对系统熵有贡献,对系统获取随机数有好处。若设置了IRQF_SAMPLE_RANDOM(老版本中的SA_SAMPLE_RANDOM),表示对系统熵有贡献,对系统获取随机数有好处。(这几个flag是可以通过或的方式同时使用的)
  • devname: 设置中断名称,通常是设备驱动程序的名称 在cat /proc/interrupts中可以看到此名称。
  • dev_id: 在中断共享时会用到,一般设置为这个设备的设备结构体或者NULL。
  • request_irq(): 返回0表示成功,返回-INVAL表示中断号无效或处理函数指针为NULL,返回-EBUSY表示中断已经被占用且不能共享。

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

自旋锁
spinlock在得不到锁的时候,程序会循环访问锁,性能下降
spinlock使用介绍

信号量
信号量在得不到锁的时候会休眠,等到可以获得锁的时候,继续执行。
信号量详细解说

五.linux中RCU原理?
RCU(Read-Copy Update)是数据同步的一种方式,在当前的Linux内核中发挥着重要的作用。

posted @ 2022-11-09 23:02  caseyzz  阅读(65)  评论(0)    收藏  举报