内核模块开发基础

本文详细介绍Linux内核模块的Makefile编写方法、模块的安装与卸载过程、如何使用模块参数、模块间的相互调用机制及内核信息打印位置等内容。

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

1. hello module Makefile的编写
# Makefile2.6
obj-m += hellomod.o        # 产生hellomod 模块的目标文件
hellomod-objs := add.o xxx.o #依赖的文件

CURRENT_PATH := $(shell pwd)   #模块所在的当前路径
LINUX_KERNEL := $(shell uname -r)    #Linux内核源代码的当前版本
LINUX_KERNEL_PATH := /usr/src/linux-headers-$(LINUX_KERNEL) #Linux内核源代码的绝对路径
all:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules   #编译模块了
#make -C $(LINUX_KERNEL_PATH) M=$(PWD) modules   #也是可以通过的
clean:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean    #清理
#  tab before make 在每个命令前(例如make命令前)要键入一个制表符(按TAB键产生)


2. 安装与卸载
加载insmod(insmod hello.ko)
卸载rmmod(rmmod hello)
查看lsmod
自动加载依赖模块modprobe(modprobe hello)

3. 模块参数
module_param(name, type, perm)
type
bool
int
charp
perm
S_IRUGO :任何用户都对/sys/module中出现的该参数具有读权限
S_IWUSR :允许root用户修改/sys/module中出现的参数 
例子:
int age = 3;
char *name;
module_param(age, int, S_IRUGO);
module_param(name, charp, S_IRUGO);

使用:
insmod hello.ko age=3

4. 内核模块的相互调用
模块1
...
int add_intergar(int a, int b)
{
return a + b;
}
EXPORT_SYMBOL(add_intergar);
...
模块2
...
extern int add_intergar(int a, int b);
static int __init hello_init()
{
int value = add_intergar(1, 2);
}

5. 所有kernel信息打印
/var/log/messages


6. 控制台优先级配置
6 4 1 7
分别对应
Console_loglevel
Default_message_loglevel
Minimum_console_level
Default_console_loglevel




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值