内核之旅起航---简单内核模块和内核编程规则

本文详细介绍了如何解决内核模块加载失败问题,包括更新内核、使用特定的makefile进行编译和加载模块。同时分享了内核编程的一些规则和规范,如谨慎使用带__的函数、注意并发问题、减少内存使用等。

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

                                                                                                      内核模块与内核编程一些常识

首先把我之前的hello word 模块加载失败问题解决了。

首先:

更新内核,yum update kernel 安装内核开发树。

     内核模块hello word 代码:

<span style="font-size:18px;">#include<linux/init.h>          //内核相关函数的头文件,内核编程不能调用C库
#include<linux/module.h>

MODULE_LICENSE("Dual BSD/GPL");  //用来告诉内核,这个模块遵循的许可

static int hello_init(void)      //初始化模块
{
    printk("the first modules\n\n");
    printk(KERN_ALERT "hello ,world\n");
    return 0;

}

static void hello_exit(void)    //清除模块
{
    printk(KERN_ALERT "GOODBYE,cure1 world\n");
}

module_init(hello_init);     //这两个宏分别注册初始化模块函数,注册退出函数
module_exit(hello_exit);     </span>

下面是makefile 

obj-m += hello.o
DIR:=$(shell pwd)
K_DIR:=$(shell uname -r)
k_path := /usr/src/kernels/$(K_DIR)

all:
	make -C $(k_path) M=$(DIR) modules

这个makefile 还有点缺点,就是没有clean ,不过对于这个演示并没有什么影响。


这个是编译结果:


然后是载入


但是并没有我们期待的输出。

这是因为根据系统传递消息的机制不同,得到的结果可能是不一样的,有的系统输出在终端,有的系统输出在某些文件里。

可是不论它输出在那里,都是从内核缓冲区出来的,所以我们可以使用dmesg 来查看内核缓冲区中的东西。


果然是OK 的。到这里这个模块就算是OK了。

下面是一些内核编程的规则和规范吧。

@前边有__的函数,一般就是接口的底层组件,应当谨慎使用,。本质是告诉程序员:“谨慎调用,否则后果自负”。

@不论代码是否使用,就算是睡眠的也一定要考虑并发的问题。

@少使用typedef 关键字

@内存的使用精打细算,能节省多少内存就减少多少内存。

@效率第一Linux内核的宗旨

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值