驱动总结

一、字符设备驱动框架

   模块三要素:   
   MODULE_LICENSE(GPL);//模块许可
   module_init(XXX);//模块加载函数
   module_exit(XXX);//模块卸载函数
二、对设备的并发访问控制

1、原子操作

2、自旋锁

3、信号量

【笔试题1】驱动里面为什么要有并发、互斥的控制?如何实现?讲个例子?

      并发(concurrency)指的是多个执行单元同时、并行被执行,而并发的执行单元对共 享资源(硬件资源和软件上的全局变量、静态变量等)的访问则很容易导致竞态(race conditions)。

      解决竞态问题的途径是保证对共享资源的互斥访问,所谓互斥访问就是指一个执行单元 在访问共享资源的时候,其他的执行单元都被禁止访问。

 访问共享资源的代码区域被称为临界区,临界区需要以某种互斥机 制加以保护,中断屏蔽,原子操作,自旋锁,和信号量都是linux设备驱动中可采用的互斥途径。

【笔试题2】 spinlock自旋锁是如何实现的?

自旋锁在同一时刻只能被最多一个内核任务持有,所以一个时刻只有一个线程允许存在于临界区中。这点可以应用在多处理机器、或运行在单处理器上的抢占式内核中需要的锁定服务。

三、四种IO访问模型(内核层---应用层)
1、阻塞(readwrite)
2、非阻塞(readwrite)
3、IO多路复用 (应用层:select  内核层:poll)
3、信号驱动IO  (应用层:fcntl  内核层:fasync)
 
四、内存访问

【笔试题1】 linux内核里面,内存申请有哪几个函数,各自的区别?

(1)__get_free_pages:按物理页分配,物理内存连续,可分配大小:4M~8M,一页4k.

 (2)kmalloc:按指定大小分配,物理内存连续:1byte~128K

 (3)vmalloc:按指定大小分配,物理内存不连续:

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

五、中断机制(内部中断&外部中断)

 

【笔试题1】说明linux设备驱动中申请中断的函数原型及其相关参数
 int request_irq(unsigned int irqno,irq_handler_t handler,unsigned long flags,const char *name,void *dev_id);
 irqno:中断号
 handler:中断处理函数
 flags:中断标志位
 name:申请中断的设备或驱动的名称,会出现在/proc/interrupts
 dev_id:传递给中断处理函数的参数

【笔试题2】linux将中断服务程序分成上半部分和下半部分的原因,如何实现?

中断处理程序:(1)不允许睡眠(2)中断执行时间尽可能短。

    为了在中断执行时间尽可能短和中断处理需完成大量工作之间找到一个平衡点,linux将中断处理程序分解为两个半部;顶半部和底半部。

    顶半部完成比较紧急、不耗时的操作,一般就是简单读取寄存器中的中断状态并清除中断标志,进行登记中断的工作。【登记中断 即将底半部处理程序挂到该设备的底半部执行队列中】,这样,顶半部执行速度就会很快,可以服务更多中断请求。

    底半部完成耗时的操作,包括中断事件的绝大多数任务,可以被新的中断打断,即中断是打开的。

      另外,如果中断要处理的工作本身很少,则可以直接在顶半部完成所有任务。
【笔试题3】linux实现底半部的机制主要有:tasklet、工作队列、软中断
六、时钟
 
七、简单字符设备驱动
 1、LED
 2、BEEP(PWM_TIMER)
 3、ADC
 4、KEY_EINT
 5、WATCHDOG
八、基于总线的字符设备驱动
1、plateform
2、IIC
3、SPI

【笔试题1】 I2C触摸屏芯片与CPU的数据传输流程?画出相关图例?(这题目记得不是太清楚了,大概是考查I2C设备驱动的数据传输过程)

 

基础知识点

1、linux系统中,内核以设备号区分设备

2、驱动程序运行在内核空间
3、驱动程序编译方式:静态编译、动态编译
4、模块中指定加载函数的宏:module_init
5、用来加载模块 的命令:insmod  modprobe
6、linux2.6内核中,设备的主设备号12位,次设备号20位
7、linux系统中,字符设备块设备有设备节点。
8、实现互斥机制的原子操作、信号量、自旋锁
9、中断标志位中,表示关中断嵌套的宏,IRQF_DISABLED
10、通常情况下,kmalloc函数能分配的最大内存128K
12、保证物理空间上连续的内存分配函数是_get_free_pages  kmalloc
13、linux系统中通过add_timer添加的timer是 一次性的
14、当platform_device和platform_driver匹配时,会执行的函数是probe函数
15、linux 系统中以模块方式组织设备驱动程序,内核模块中必不可少的组成部分:
模块三要素:   
   MODULE_LICENSE(GPL);//模块许可
module_init(XXX);//模块加载函数
  module_exit(XXX);//模块卸载函数
 
16、字符设备和块设备的区别
  字符设备:按字节访问设备;一般只支持顺序访问;无缓冲区
  块设备:按固定大小访问;支持随机访问;有缓冲区
17、内核模块和应用程序的区别
内核模块:运行于内核空间;工作模式SVC模式;调用内核函数;入口是加载函数;自己释放资源
应用程序:运行于用户空间;工作模式USR模式;调用库函数;入口是main函数;操作系统自动回收资源
18、说明linux设备驱动中申请中断的函数原型及其相关参数
 int request_irq(unsigned int irqno,irq_handler_t handler,unsigned long flags,const char *name,void *dev_id);
 irqno:中断号
 handler:中断处理函数
flags:中断标志位
name:申请中断的设备或驱动的名称,会出现在/proc/interrupts
dev_id:传递给中断处理函数的参数
19、简述信号量和自旋锁的异同
  相同点:都可用于实现互斥
  不同点:信号量无法获得时,进程处于等待态;获得信号量后可睡眠,可长时间占有,不能用于中断
                自旋锁无法获得时进程处于运行态;持有锁期间不可睡眠,时间尽可能短,可用于中断
20、请列举linux设备驱动程序中,程序延缓执行的机制:
    tasklet、工作队列、内核定时器
21、mmap机制的作用和使用mmap的好处
  mmap可以把设备的物理内存映射到用户空间访问,相比在用户空间和内核空间互相拷贝数据,提高了效率。
22、驱动中采用动态申请设备号的,如何创建设备文件?
在驱动中创建相应的class和device,通过udev或mdev自动创建设备文件

 

 

原文地址:https://www.cnblogs.com/lemon-tree/p/5223051.html