Linux 驱动开发笔记(一)

Linux 驱动开发笔记(一)

   本文是学习过程中的笔记,对准备开始学的同学有一定的指导作用,用于理清各个知识点的目的。文章写于学习开始的阶段,希望在对知识未知时记录下有哪些问题,防止学会后感觉什么都很简单,很多东西都理所当然,对小萌新十分不友好。

一、为什么要有驱动

   由于计算机软件的不断发展,开发人员希望将软件与硬件分离。尽可能的使应用软件开发者不必关心设备的类型和具体操作方式。这个进行硬件控制的任务就落到了操作系统头上,或者说从操作系统被设计开始就包揽下了计算机系统中所有硬件控制的活。任务调度管理CPU资源;内存分配管理内存资源;驱动管理外部设备资源。因此驱动模块的存在是操作系统对硬件资源管理的细分。

二、驱动开发相关的主要问题

我认为这一类问题是任何操作系统的驱动都不能逃避的问题。也是学习Linux驱动必须要知道的。

1). 驱动如何与操作系统协同工作

1. 驱动如何加载到操作系统内核

   微内核与宏内核。微内核指仅包含操作系统必要功能,即任务调度,内存分配等模块的内核。宏内核包含微内核的所有模块外,文件系统、驱动程序等也包含在内。因此宏内核由于将驱动程序集成于内核内部,因此运行速度相对较快。同时也导致了驱动的添加不灵活,每次添加都需要重新编译内核。Linux系统使用的是宏内核,为了弥补不足引入了内核模块的概念。内核模块可以在运行时动态加载到内核中,不需要重新编译内核或停止内核运行。因此Linux中驱动可以直接编译到内核中(在启动时操作系统进行装载执行),也可以在运行时动态加载到内核中(由用户或脚本装载入内核中)。

2. 操作系统如何知道程序入口

   驱动有许多工作要做,外设的初始化,外设的关闭,数据的读写等。每次应用程序对设备进行操作时操作系统应该调用驱动的具体方法实现该功能。操作系统如何知道具体操作的函数入口地址非常重要。实际的做法是操作系统与驱动约定好有哪些具体的方法,驱动遵守该规则进行开发,编译时写入驱动文件中,操作系统装载驱动文件时从文件中解析出相应的信息即可。

2). 内存管理问题

   驱动由于在操作系统中,申请的内存应该是虚拟内存。但是作为驱动需要操作硬件,这就需要驱动程序中可以直接操作物理内存。学习中……后续补

3). 外设中断的管理方式

   在裸机开发中对中断的管理一般是直接写中断服务函数,并将入口地址存入中断向量表中,在使用某些库函数时可能会使用回调函数(钩子函数),而不直接写中断服务函数,因为库函数中包含中断的处理,使用回调函数可以简化编程过程。在模块化更明显的操作系统中应该也存在相应的回调函数对中断进行操作。学习中……后续补

4). 多进程下的数据同步问题

学习中……后续补

5). 如何管理多个同型设备

   在一个芯片中往往支持许多同类型的设备,比如多个USB接口,不可能为每一个设备添加独立的驱动。在驱动管理的过程中是如何管理多个设备的。即是由用户或者配置文件之类的将设备和具体的联系起来的,还是在驱动中使用程序直接配置具体的设备。学习中……后续补

三、其它次要问题

1). 调试输出问题

如何输出,如何查看输出。

2). 驱动的分类

   在Linux中将设备分为三类。字符设备、块设备、网络设备。区分三类设备的主要依据是数据的流动方式(因为不管是什么设备,对处理器而言都是通过接口进行数据交互)。
   字符设备通常指的是由事件驱动的数据流,例如按键按下导致按键接口产生数据,这类数据未到达之前并不存在,只有事件产生才产生数据流;
   块设备一般对应有存储能力的设备,但是这并不规定数据如何传输,即也可能是网络上的存储,重点在于可以按照指定的大小读取数据,直到结束,即数据基本是固定的,在开始操作时就已经确定;
   网络设备对应于通过同一个接口,可以同时与多个应用程序建立数据交互的设备。例如有线网络接口,无线网络接口,基本的串行接口,SPI,IIC等也可以通过设置相应的协议实现同样的功能。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值