编写自己的LINUX驱动并加载到系统中
1、Linux下的设备大体分为三类:
(1)块设备: 一次I/O操作以固定大小的数据块为单位,块设备通过缓冲区读写,如硬盘。
(2)字符设备:直接读取的,不必使用缓冲区,如串口。
(3)网络设备:Linux使用套接口(socket)以文件I/O方式提供了对网络数据的访问。
2、虚拟文件系统
Linux使用虚拟文件系统VFS(Virtual File System)做为统一的操作接口来处理文件和设备。
每个设备文件与普通的目录和文件一样,可用一个file结构来表示。其属性包括:文件名、设备类型、主设备号、次设备号。

3、file_operations结构体
通过file_operations来调用驱动程序的设备服务子程序。如:write( ) 函数:向设备发送数据,read()函数:从设备中读取数据。

4、查看当前设备
#cd /dev
#ls -l

5、查看设备的相关命令
# cat /proc/cpuinfo # 查看CPU信息
# hostname # 查看计算机名
# lsusb -tv # 列出所有USB设备
# env # 查看环境变量

6、编写源代码my_driver.c
在my_driver.c中编写源代码,它是一个非常简单的设备驱动程序代码框架,其任务是将内核模块中的init函数动态地注册到系统中并运行,由module_init()实现驱动的加载,由module_exit()实现驱动的卸载

7、Makefile及编译
编写Makefile,将源代码编译,其内容如下:
-------------------------------------------------
obj-m+=my_driver.o
all:
make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) clean
---------------------------------------------
其中my_driver.o就是目标文件,make工具会根据目标文件自动推导来编译my_driver.c文件。

8、加载到内核中
运行#make后,就会编译生成了内核文件my_driver.ko,我们使用以下命令,将其加载到内核中
#sudo insmod my_driver.ko //超级模式下加载驱动
#lsmod | grep "my_driver" //检查是否加载成功
#sudo rmmod my_driver.ko//卸载驱动
