LINXU操作系统
Linux下的设备大体分为三类:(1)块设备: 一次I/O操作以固定大小的数据块为单位,块设备通过缓冲区读写,如硬盘。(2)字符设备:直接读取的,不必使用缓冲区,如串口。(3)网络设备:Linux使用套接口(socket)以文件I/O方式提供了对网络数据的访问。
虚拟文件系统 Linux使用虚拟文件系统VFS(Virtual File System)做为统一的操作接口来处理文件和设备。 每个设备文件与普通的目录和文件一样,可用一个file结构来表示。其属性包括:文件名、设备类型、主设备号、次设备号。
file_operations结构体 通过file_operations来调用驱动程序的设备服务子程序。如:write( ) 函数:向设备发送数据,read()函数:从设备中读取数据。
查看当前设备#cd /dev#ls -l
查看设备的相关命令# cat /proc/cpuinfo # 查看CPU信息 # hostname # 查看计算机名 # lsusb -tv # 列出所有USB设备# env # 查看环境变量
编写源代码my_driver.c 在my_driver.c中编写源代码,它是一个非常简单的设备驱动程序代码框架,其任务是将内核模块中的init函数动态地注册到系统中并运行,由module_init()实现驱动的加载,由module_exit()实现驱动的卸载
Makefile及编译编写Makefile,将源代码编译,其内容如下:-------------------------------------------------obj-m+=my_driver.oall: 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文件。
加载到内核中 运行#make后,就会编译生成了内核文件my_driver.ko,我们使用以下命令,将其加载到内核中 #sudo insmod my_driver.ko //超级模式下加载驱动#lsmod | grep 'my_driver' //检查是否加载成功#sudo rmmod my_driver.ko//卸载驱动
Makefile中的空格,需要用“tab”键
LINXU中,需要区分大小写。