不知不觉,已经接触Linux 操作系统四年多,对于什么是Linux 下的驱动,这件事需要说明一下。

1. 什么是driver 驱动

首先,需要有计算机组成原理的知识,才方便了解驱动这个翻译过来的概念。以单片机为例,CPU,存储器,时钟,IO输入输出设备组成最小系统。

Linux 平台驱动程序与 单片机程序 的异同

类似的,只要将各个信号线,按照定义和CPU 连接起来,硬件上,外设就挂载到最小系统成功了。 此时,还需要软件上,让系统更准确的说让CPU 访问硬件、使用该硬件work起来。这部分的软件代码,就叫作驱动。

    通常的驱动程序,就是按照硬件的datasheet 上的操作流程[先后顺序],配置寄存器,初始化设置硬件处于某种工作模式下。

其实,走到这一步,单片机的驱动,甚至可以说整个单片机程序就算完成了。

2. Linux 系统下的driver 驱动程序

 然而,面对日益增长的需求。人们的惰性,就想要让所有的事情都交给别人来完成。或者机器也可以,反正就是不愿自己动手,于是就产生了日益庞大的Linux 操作系统。有了更好的人机交互,更智能的调度管理算法,集成了更完备的服务,更强的算力。

     Linux 就出现分时复用的调度管理 和 多线程多进程编程,相应的IPC 进程间通信。

     Linux 便于人机交互,使用sys 等虚拟文件系统和统一的系统调用,提供统一规范的接口给Linux 应用人员开发,将任务剥离。

     Linux 支持各种子模块,比如input 输入子模块、mtd 存储设备子模块、hwmon 传感器子系统等等,每个模块都基本上走类似的软件架构; Hardware --> driver model --> HAL ---> framework ---> system call interface.

Linux 平台驱动程序与 单片机程序 的异同Linux 平台驱动程序与 单片机程序 的异同

     上面一大段,稍微分析了下 什么是Linux 操作系统。 那么Linux 下的driver ,就是按照Linux 下的驱动模型 实现的驱动硬件的单片机程序, 韦东山老师曾在博客上写到,Linux 的driver 开发,类同于 “Linux 下模块化的驱动模型 + 裸机驱动”; 比裸机驱动复杂的地方就是需要,1. 熟悉Linux 各模块提供的接口来编写驱动,比如申请栈内存、已有的结构体组件、链表helper 函数类、dts 解析[硬件参数配置]、sys 文件系统,file_operation 成员函数变量 ;其中sys 虚拟文件系统和file_operation 中的open、read、write、ioctl、mmap 等就是为给用户态提供接口或服务使用的,甚至你还可以使用netlink 套接字的方式来编程,实现用户态程序和内核态程序的交互。

    交互这两个字看似简单,但其内涵很广博。 包含异步通讯[fsync,netlink]、同步通信[poll、select]会导致阻塞。还有lock 锁机制,中断机制等等的牵扯。

      所以,我定义的Linux 下的驱动:

1. Linux 下的内核模块开发[kernel 作为开源社区,模块化开发可以减少开发者的相互影响。内核开发都是模块化的 ]

2. Linux 下的LDD 设备、驱动、总线模型;有固定的内核接口与流程 Linux 驱动框架,比如字符设备驱动程序;给用户层提供/dev 或/sys 接口。

3.裸机驱动程序;

以上三点是Linux 内核驱动所必须的,但还是没能完全满足需求。

4. struct file_operation 接口的mmap() 、poll()、fsync() 等等 

5. 中断服务的注册 devm_request_irq() & 等待队列 用于异步唤醒,通知。

6. work_queue() 工作队列, 当有任务分发的情况时,就需要使用到。

        INIT_DELAYED_WORK(&epf_channel->cmd_handler,pci_data_channels_cmd_handler);
        
        queue_work(epf_channel->kpcitest_workqueue, &epf_channel->cmd_handler.work);

7. 互斥锁、spinlock 自旋锁 防止共享资源出现竞争关系。

其实还有许多,Linux 机制 和模块,能力有限,就记录这么多。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-12-05
  • 2021-12-26
  • 2022-12-23
  • 2021-12-05
猜你喜欢
  • 2021-06-07
  • 2022-01-15
  • 2021-09-15
  • 2022-12-23
  • 2022-12-23
  • 2021-09-24
  • 2021-11-17
相关资源
相似解决方案