1. 什么是Linux驱动?
在各种书上都有对于驱动程序的介绍,大致的意思都为
处于内核与硬件之间的,由操作系统管理的,控制硬件设备的程序;是硬件和内核之间的桥梁
Linux驱动相关的基础知识
我们这里所说的驱动都是软件驱动的概念,是用来驱动硬件,或是提供硬件驱动方法的程序;
记住:是内核和硬件之间的桥梁

2. Linux内核的分类:
主要分为三大类:字符设备、块设备、网络设备
三类设备编写驱动的方式不太一样,目前只接触了字符设备和网络设备的内容;
字符设备: IO传输过程中以 字节为单位 进行传输;用户对于字符设备发出读写请求时,实际硬件读写操作一般紧接着发生(同步性
块设备:数据传输以块为单位(根据文件系统不同,一个块的大小有所不同,大多为4K);异步
前两个在linux中都通过
对应的设备文件进行访问
(字符设备文件、块设备文件)

**网络设备:**通过socket接口函数进行访问;

3. 字符设备驱动
开发阶段一般使用 驱动模块 来完成驱动功能的调试;
这涉及到:模块的编写、模块的编译、模块的使用、模块的卸载等问题;下面的456对应;
发布阶段一般将驱动程序编译进内核,这涉及到以下几个内容的修改,在修改后重新编译内核既能完成将驱动与内核融为一体;

4. 模块的编写
模块的编写是我们实现功能的过程,当然在这个过程中需要对于linux的驱动框架以及很多相关知识比如设备树、子系统等内容。
模块的框架请参考我的其他文章;

5. 模块的编译
编译工具的选择:这取决于我们的驱动所应用的平台,如果是x86的ubuntu,那么就使用对应的gcc即可;如果是嵌入式arm平台,就要选择对应的arm-linux-gcc编译器进行编译;这样驱动程序才能够在对应的平台下使用;

对于编译存在几个概念需要我们理清楚:
内部编译: 将模块的源文件.c文件,放到内核源码中进行编译;需要对内核文件:Kconfig、Makefile、make menuconfig进行修改;
外部编译:将内核模块源文件放到内核源码外进行编译
静态编译:将内核模块编译到内核镜像uimage / zimage中
动态编译:将内核模块编译成.ko文件

对应我们之前:开发阶段一般是 《外部编译 + 动态编译》;发布阶段一般是《内部编译 + 静态编译》

6. 模块的加载和卸载
请看另一篇文章,很简单。
3.第一个字符设备驱动(虚拟设备)框架搭建、驱动模块加载、驱动函数实现、应用程序编写;

相关文章: