简单认识驱动与模块

本文介绍了驱动程序的概念,它是硬件设备与操作系统之间的桥梁。在Linux中,设备分为字符设备、块设备和网络接口三类。驱动通常以模块的形式存在,可以在运行时加载和卸载。通过module_init和module_exit宏指定模块的加载和卸载函数,并使用printk进行内核级别的输出。编译模块时,可通过修改makefile文件并使用make命令完成。装载模块可使用insmod或modprobe,后者处理依赖关系,卸载则使用rmmod。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是驱动?

以下百度百科中对驱动解释。

驱动(计算机软件术语)

驱动程序全称设备驱动程序,是添加到操作系统中的特殊程序,其中包含有关硬件设备的信息。此信息能够使计算机与相应的设备进行通信。驱动程序是硬件厂商根据操作系统编写的配置文件,可以说没有驱动程序,计算机中的硬件就无法工作。

 

可以看到,驱动相对于一般的软件而言最大的区别是,它是直接与硬件设备进行通讯的。

 

Linux驱动的分类

 

Linux中,将设备分为三种基本的类型。

  • 字符设备
  • 块设备
  • 网络接口

Linux中还有一个很重要的概念,模块。

可在运行时添加到内核中的代码被称为模块。

一般来说一个设备驱动总是被写成一个模块。

 

一个简单的模块

#include <linux/init.h>
#include <linux/module.h>

MODULE_LICENSE("Dual BSD/GPL")

static int hello_init(void) {
    printk(KERN_ALERT "Hello world");
}

static void hello_exit(void) {
    printk(KERN_ALERT "Bye");
}

module_init(hello_init);
module_exit(hello_exit);

这里看到两个特殊的宏module_init和module_exit,这两个宏指明了模块被装载和卸载时所执行的函数。

printk函数定义在Linux内核中,和c标准库中的printf类似,最大的区别是它缺乏对于浮点的支持,因为内核代码不能实现浮点数运算。

 

模块的编译

对于上面的代码来说。在makefile文件中添加下面一行就足够了。

obj-m := hello.o

假设有两个源文件则可以写成如下形式。

obj-m := module.o

module-objs := file1.o file2.o

 

最后使用make命令编译即可

 

模块的装载和卸载

装载:insmod、modprobe

这里看到,装载时有两个方法可选,区别在于,modprobe会根据depmod所产生的相依关系,决定要载入哪些模块。若在载入过程中发生错误,在modprobe会卸载整组的模块。

modprobe是处理层叠模块的一个实用工具。

卸载:rmmod

显示已载入系统的模块:lsmod

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值