Linux设备驱动开发 - 初始化

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内核模块的编译

  1. 内部编译(产品阶段)

    • 将demo.c拷贝到内核源代码目录下

      cp ~/work/day1/01demo/demo.c ~/linux-5.10.61/drivers/char

    • 在Kconfig中添加选项菜单

      config HQYJ_DEMO
          tristate "t
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘刘大顺610

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值