Linux中的ko怎么玩?:进阶版

1、基础版本

#include <linux/init.h>  ///这两个为内核编译必备头文件
#include <linux/module.h>  
#include "helloworld.h"
 
MODULE_LICENSE("GPL");  ///module证书?
static int hello_init(void)  ///加载ko,insmod
{  
  printk("999 Hello, world\n");  
  return 0;  
}  
static void hello_exit(void)  ///卸载ko,rmmod
{  
  printk("Goodbye, cruel world\n");  
}  
  
module_init(hello_init); ///每个ko文件的最后都必须有module_init和module_exit 
module_exit(hello_exit);
MODULE_LICENSE("GPL V2");

2、稍微多几个-MODULE_*

此时这个ko还是独立的,不依赖与别的module。

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

static int sum = 100;
static int __init hello_init(void)
{
	printk("hello world ,nihao\n");
	printk("param sum = %d\n",sum);
	return 0;
}

static void __exit hello_exit(void)
{
	printk("hello world,baibai\n");

}

module_init(hello_init);
module_exit(hello_exit);
module_param(sum,int,S_IRUGO);

MODULE_LICENSE("GPL V2");
MODULE_AUTHOR("WANG LONGHUI");
MODULE_DESCRIPTION("A SIMPLE EXAMPLE KO");
MODULE_ALIAS("HAHA");

3、依赖于别的ko

#include <linux/init.h>  ///这两个为内核编译必备头文件
#include <linux/module.h>  
#include "helloworld.h"
 
MODULE_LICENSE("GPL");  ///module证书?
static int hello_init(void)  ///加载ko,insmod
{  
  printk("999 Hello, world\n");  
  test_world();
  return 0;  
}  
static void hello_exit(void)  ///卸载ko,rmmod
{  
  printk("Goodbye, cruel world\n");  
}  
  
module_init(hello_init); ///每个ko文件的最后都必须有module_init和module_exit 
module_exit(hello_exit);

MODULE_LICENSE("GPL V2");

观察一下这个ko的源码文件,发现里面有个test_world()。

如果我们直接编译这个.ko,那么会发现运行不起来。会提示你fail to load,no such file。

编译的时候也会提示你warning 没有这个符号test_world()。

这是因为你编译的这个ko安装到内核的时候,运行的时候它会去内核的符号表中查找,但是你这个test_world没有编译进内核源码。所以你安装ko的这个kernel镜像得重新构建一版,当然你也可以使用kinux已经有的符号。(当然你聪明的小脑袋肯定知道了,那我是不是可以在ko的编译文件里面加上这个test_world的源码文件,是的,可以的哦)

world.c

#include <linux/kernel.h>
void test_world(void){
printk("world---\n");
} 

编译文件

obj-m :=start.o
start-objs := hello.o world.o
LINUX_KERNEL := $(shell uname -r)
LINUX_KERNEL_PATH :=/usr/src/linux-headers-${LINUX_KERNEL}/
PWD :=$(shell pwd)  
modules :  
        $(MAKE) -C $(LINUX_KERNEL_PATH) M=$(PWD) modules  
.PHONEY:clean  
clean :  
        rm -f *.o *.ko *.mod.c 

宗旨就一个: 你这个ko里面调用的函数,归根jiedi就是一个符号,你要确定这个符号有。
(因为这个问题难过了很久,定位问题的手段太单一~~~~~~)

其他的东西边用边再补充吧啦啦啦!!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TrustZone_Hcoco

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值