linux内核学习笔记之设备与模块

模块
linux设备类型分为字符设备(cdev)、块设备(blkdev)、网络设备(netdev)。
字符设备是不可寻址的,仅提供对数据的流式访问,如键盘、鼠标等。通过称为“块设备节点”的特殊文件来进行访问,该设备通常被挂载为文件系统。
块设备是可寻址,支持对数据的随机访问,如硬盘、光碟等。可以直接通过文件接口访问设备节点来进行交互。
网络设备提供了对网络的访问,通过特定的协议(如IP),来进行通信。但该设备打破了“一切皆文件”的原则,通过套接字API来进行访问。
此外,其实还有一些伪设备,仅提供对内核功能的访问,设备驱动是虚拟的,如空设备/dev/null、内核随机数发生器/dev/random和/dev/urandom、零设备/dev/zeor等。

众所周知,linux内核是模块化组成的,它允许内存在运行时动态的向其中插入或删除代码。这些代码通过特定的格式组合在一个二进制中,称为模块,也就是我们常说的驱动模块。这是热插拔设备的基础,也给调试内核代码提供了便利。

先看一下最简单的模块代码:
#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
static int hello_init(void)
{
    printk("hello module init\n");
    return 0;
}
static void hello_exit(void)
{
    printk("hello module exit\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");

驱动的加载和卸载流程
[root@bogon drv_module]$ insmod hello.ko
[root@bogon drv_module]$ dmesg
hello module init
[root@bogon drv_module]$ rmmod hello
[root@bogon drv_module]$ dmesg
hello module init
hello module exit
[root@bogon drv_module]$

源码中 hello_init()和hello_exit()分别为驱动加载和卸载调用的钩子函数。

使用module_param(name,type,perm)给模块增加参数,如:
static int num;
module_param(num,int,0664);
加载驱动:insmod hello.ko num=10
name是变量量,也是参数名。
type是变量类型,可以是byte、short、ushort、int、uint、long、ulong、charp、bool,分别是字节型、短整型、无符号短整型、整型、无符号整型、长整型、无符号长整型、字符指针、布尔型。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值