1.Linux驱动的层次及种类
字符设备驱动
:按照字节流来访问,只能顺序访问不能无序访问的设备就是字符设备驱动。
块设备驱动
:按照block(512字节)来访问,可以顺序访问也可以无序访问的设备就是块设备驱动
网络设备驱动
:网络设备没有设备节点(文件),将网络协议栈发来的数据转发到网卡硬件的驱动代码。
2.Linux内核模块
2.1内核模块的三要素
入口:在(insmod)安装驱动的时候入口函数执行,资源的申请工作。
出口:在(rmmod)卸载驱动的时候出口函数执行,资源的释放工作。
许可证:遵从GPL开源协议
2.2内核模块的代码实例
#include <linux/init.h>
#include <linux/module.h>
// 1.入口
// static:函数只能在当前文件被调用
// int:返回值类型
// __init:
// #define __init __section(".init.text")
// 内核的链接脚本vmlinux.lds vmlinux->Image->zImage->uImage
// .init.text是linux内核修饰的一个段地址。告诉编译器将demo_init
// 放在.init.text段中。
// demo_init:入口函数的名字,格式:led_init,uart_init,adc_init
// (void):形参
static int __init demo_init(void)
{
return 0;
}
// 2.出口
// static:函数只能在当前文件被调用
// void:返回值类型
// __exit:
// #define __exit __section(".exit.text")
// 内核的链接脚本vmlinux.lds vmlinux->Image->zImage->uImage
// .exit.text是linux内核修饰的一个段地址。告诉编译器将demo_exit
// 放在.exit.text段中。
// demo_exit:出口口函数的名字,格式:led_exit,uart_exit,adc_exit
// (void):形参
static void __exit demo_exit(void)
{
}
module_init(demo_init); //告诉内核入口地址
module_exit(demo_exit); //告诉内核出口地址
MODULE_LICENSE("GPL"); // 3.许可证
2.3内核模块的编译
-
内部编译(产品阶段)
-
将demo.c拷贝到内核源代码目录下
cp ~/work/day1/01demo/demo.c ~/linux-5.10.61/drivers/char
-
在Kconfig中添加选项菜单
config HQYJ_DEMO tristate "t
-