打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Linux 2.4内核动态模块编程(摘)

linux 2.4的动态模块是.o结尾,不是.ko

1.1        example1

#define MODULE

#include<linux/module.h>

#include<linux/kernel.h>

#include<linux/init.h>

MODULE_LICENSE("GPL");

static int __initlkp_init(void)

{

printk("<1>helloworld from the kernel space.. \n");

return 0;

}

static void __exitlkp_cleanup(void)

{

printk("<2>goodbyeworld, leaving kernel space.. \n");

}

module_init(lkp_init);

module_exit(lkp_cleanup);

以上是源代码,2.4内核中动态可加载模块文件开始出一定要有一个MODULE宏定义,不然会出现版本不匹配等错误,

__init告知编译程序相关的函数和变量只用于初始化,编译程序将标有__init的所有代码存储到特殊的内存中,初始化结束后就释放这段内存,同样宏__exit__exitdata仅用于退出和关闭例程,

代码中的最后两行module_init(lkp_init);module_exit(lkp_cleanup);可以不用加入,但这样的话模块在加入和移除时将不会调用lkp_init, lkp_cleanup,则文件/var/log/message中将不包含提示信息,如果不想使用这种方法,可以使用下面的代码

 

1.2        example2

#define MODULE

#include<linux/module.h>

MODULE_LICENSE("MYGPL");

 int init_module(void)

{

    printk("<1>Hello,world\n");

    return 0;

 }

 void cleanup_module(void)

 {

     printk("<1>Goodbye cruelworld\n");

 }

在此代码中可以直接将example1中的初始化和退出函数名字直接改为init_modulecleanup_module,这样内核在加载和移除该模块时自动调动初始化和清除函数.

 

1.3        example3

#define MODULE

#include<linux/kernel.h>

#include<linux/module.h>

MODULE_LICENSE("GPL");

int init_module(void)

{

printk("<1>hello\n");

return 0;

}

voidcleanup_module(void)

{

printk("<1>bye\n");

}

 

1.4        makefile文件

#Makefile for linuxloadable kernel module

CC=gcc

CFLAG := -I/usr/src/linux-2.4.20-8/include-D__KERNEL__ -D__MODULE -O -Wall

OBJ=test

$(OBJ).o:$(OBJ).c

      -rm $@ -f

      $(CC) $(CFLAG) -c $(OBJ).c -o test.o

 

注意其中的gcc选项一定要包含D_KERNEL__D__MODULE这两个选项,不管对于什么的架构,一定要使gcc在编译时的环境版本和运行时的环境版本相匹配,也即在运行环境中,假如你使用ARM或者2.4.20-8这些个版本,那么在编译时所用的头文件也一定要是2.4.20-8这个版本的,不然会导致版本不匹配,其中的-I/usr/src/linux-2.4.20-8/include可以用-I/usr/src/’uname -r’/include 来代替,

MODULE_LICENSE("GPL");本句代码可以不要,但不要的话,运行时会出现"hello:module license 'unspecified' taints kernel.",词典上对taints的解释是"感染,污点".

1.5        编译过程

在命令行输入make命令编译生成ELF文件,

insmod hellomod来加载模块

rmmod hellomod移除hellomod模块

lsmod查看当前已加载模块

hellomod向模块发出的信息可以在/var/log/message文件中查看到,

可用dmesg命令来查看

readelfojbdump用于查看目标文件的信息

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Linux内核之旅
Linux内核异常
最简单的内核模块编程
内核线程
netlink简单介绍 (linux
Intercepting System Calls and Dispatchers – Linux | ruined
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服