Linux内核驱动“Hello World”

本文详细介绍了一个简单的Linux内核模块开发过程,包括模块的初始化和销毁函数编写、Makefile配置以及模块的加载与卸载步骤。通过实例演示了如何在Ubuntu环境下编译并运行内核模块。

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

01 驱动组成的三大部分

一个内核驱动主要分为三大部分:

  • module_init()——入口
    • 编写初始化函数并将函数名传入入口函数
      • 初始化函数的格式为int __init func_name(void)
      • 即返回值为int型,参数类型为void,函数名前的__init表示将其加载到init段。
  • module_exit()——出口
    • 编写驱动销毁函数并将函数名传入出口函数,释放资源。
      • 销毁函数的格式为void __exit func_name(void)
      • 返回值为void,参数类型为void,函数名前的__exit表示将其加载到exit段。
  • MODULE_LECENSE("GPL")——所遵循的证书
    • 标准操作

02 所需库及Makefile

调用以上三个函数需要包含两个内核库

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

且这两个库需要根据内核版本来配置,使用uname -r查看当前内核版本。

root@ubuntu:~/Desktop# uname -r
4.15.0-54-generic

则在ubuntu18.04下对应的编译路径为/usr/src/linux-headers-4.15.0-54-generic/

创建Makefile文件如下,一定要注意M要大写!!!!!!。

obj-m := first_module.o

PWD := $(shell pwd)
KERNEL_INFO := $(shell uname -r)
KERNEL_LIB := /usr/src/linux-headers-$(KERNEL_INFO)

all:
	make -C $(KERNEL_LIB) M=$(PWD) modules
clean:
	make -C $(KERNEL_LIB) M=$(PWD) clean


03 Show me the code

对应的first_module.c文件与Makefile在同一目录

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

// init function
int __init test_init(void)
{
	printk("<___My first module was put on the kernel.___>\n");
	return 0;
}

// exit function
void __exit test_cleanup(void)
{
	printk("<___My first module was moved of.___>\n");
}


module_init(test_init);	
module_exit(test_cleanup);
MODULE_LICENSE("GPL");

04 结果

在Makefile所在目录执行make,结果如下。

root@ubuntu:~/Desktop# make
make -C /usr/src/linux-headers-4.15.0-54-generic M=/home/ttyf/Desktop modules
make[1]: Entering directory '/usr/src/linux-headers-4.15.0-54-generic'
  CC [M]  /home/xxx/Desktop/first_module.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /home/xxx/Desktop/first_module.mod.o
  LD [M]  /home/xxx/Desktop/first_module.ko
make[1]: Leaving directory '/usr/src/linux-headers-4.15.0-54-generic'

  1. 执行dmesg -c查看未加载我们的驱动的日志,-c表示查看后清除日志。

  2. 执行insmode first_module.ko,将我们的驱动加载到内核。

  3. 执行dmesg查看加载我们的模块后init函数中的输出。

  4. 执行rmmod first_module,将我们的模块卸载。

  5. 执行dmesg查看卸载时,模块的输出。

  6. 执行make clean清理。

结果如下:

root@ubuntu:~/Desktop# insmod first_module.ko 
root@ubuntu:~/Desktop# dmesg
[ 3308.978497] <___My first module was put on the kernel.___>
root@ubuntu:~/Desktop# rmmod first_module 
root@ubuntu:~/Desktop# dmesg 
[ 3308.978497] <___My first module was put on the kernel.___>
[ 3324.548336] <___My first module was moved of.___>
root@ubuntu:~/Desktop# make clean
make -C /usr/src/linux-headers-4.15.0-54-generic M=/home/ttyf/Desktop clean
make[1]: Entering directory '/usr/src/linux-headers-4.15.0-54-generic'
  CLEAN   /home/ttyf/Desktop/.tmp_versions
  CLEAN   /home/ttyf/Desktop/Module.symvers
make[1]: Leaving directory '/usr/src/linux-headers-4.15.0-54-generic'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值