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

简介: 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就是一个符号,你要确定这个符号有。

(因为这个问题难过了很久,定位问题的手段太单一~~~~~~)

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

目录
相关文章
|
1月前
|
监控 网络协议 Java
Linux 网络编程从入门到进阶 学习指南
在上一篇文章中,我们探讨了 Linux 系统编程的诸多基础构件,包括文件操作、进程管理和线程同步等,接下来,我们将视野扩展到网络世界。在这个新篇章里,我们要让应用跳出单机限制,学会在网络上跨机器交流信息。
Linux 网络编程从入门到进阶 学习指南
|
5月前
|
运维 网络协议 Linux
腾讯T6-9首发“Linux内核源码底层原理开发进阶笔记”,差距不止一点点哦
腾讯T6-9首发“Linux内核源码底层原理开发进阶笔记”,差距不止一点点哦
|
6月前
|
监控 Linux Shell
(二)Linux命令行工具进阶:探索高级功能
在Linux系统中,命令行工具提供了丰富的高级功能,用于处理文本、管理进程、监控系统性能等任务。本文将深入探讨一些高级命令和技巧,帮助您更加高效地利用Linux命令行。
52 1
|
6月前
|
Shell Linux
Linux Shell 进阶:探索高级命令和脚本编程技巧
Linux Shell不仅仅是一个命令解释器,它还提供了许多强大的高级命令和脚本编程技巧,能够帮助用户更高效地管理系统和处理数据。在这篇文章中,我们将深入探讨Linux Shell的高级功能。
60 0
|
1月前
|
存储 消息中间件 网络协议
Linux 系统编程从入门到进阶 学习指南
本文旨在为初学者提供一个清晰的 Linux 系统编程入门指南,带你步入 Linux 系统编程的世界,从基本概念到实用技能,一步步建立起您的知识体系。
Linux 系统编程从入门到进阶 学习指南
|
5月前
|
存储 Linux 调度
2023年Linux的知识技术合集(基础入门到高级进阶)
2023年Linux的知识技术合集(基础入门到高级进阶)
|
8月前
|
监控 关系型数据库 MySQL
linux操作系统【进阶完整版】
linux操作系统【进阶完整版】
80 0
|
8月前
|
Linux 数据安全/隐私保护
第十四章、【Linux】磁盘配额与进阶文件系统管理
第十四章、【Linux】磁盘配额与进阶文件系统管理
77 0
|
9月前
|
Shell Linux 索引
Linux flock 原理(shell进阶)
flock申请的锁对象是处于 内核空间层的全局级别的open file table中的。
182 0
|
10月前
|
网络协议 Unix Linux
【Linux进阶命令 04】lsof (看看是谁动了我的文件?)
【Linux进阶命令 04】lsof (看看是谁动了我的文件?)