当前位置: 首页 > news >正文

linux内核开发入门二(内核KO模块介绍、开发流程以及注意事项)

linux内核开发入门二(内核KO模块介绍、开发流程以及注意事项)

一、什么是内核模块

内核模块:ko模块(Kernel Object Module)是Linux内核中的可加载模块,它可以动态地向内核添加功能。在运行时,可以通过加载或卸载ko模块来扩展或减少内核功能。ko模块通常包含驱动程序、文件系统、网络协议栈、安全模块等内核功能。内核开发人员可以通过编写ko模块来扩展或改进内核功能。

我们可以通过编写内核模块扩展内核功能,添加新的驱动程序或文件系统,或者修改内核的行为,而不需要重新编译整个内核。

二、编写内核模块的基本步骤:

  1. 编写模块代码:包括初始化和清除函数,以及其他需要的函数。

  2. 编写Makefile文件:定义编译模块的规则,指定编译器和编译选项等。

  3. 编译模块:使用make命令编译模块,生成ko文件。

  4. 加载模块:使用insmod命令加载模块。

  5. 卸载模块:使用rmmod命令卸载模块。

  6. 查看模块信息:使用modinfo命令查看模块的信息,包括作者、版本、描述等。

三、KO模块开发示例代码:

#include <linux/init.h>  //头文件信息
#include <linux/module.h>static int __init hello_init(void)  //初始化函数
{printk(KERN_INFO "Hello, world!\n");return 0;
}static void __exit hello_exit(void)	//清理函数
{printk(KERN_INFO "Goodbye, world!\n");
}module_init(hello_init);
module_exit(hello_exit);MODULE_LICENSE("GPL"); //表明该模块的源代码使用 GPL 许可证,可以在 GPL 许可证下被复制、修改和重新发布。如果模块没有正确声明许可证,那么它将被认为是专有软件,从而可能违反 GPL 许可证的条款。
MODULE_AUTHOR("xiaoming"); //作者信息
MODULE_DESCRIPTION("A simple security driver"); //内核模块描述

三、KO模块开发Makefile:

ko模块是通过make命令进行编译,因此我们需要编写对应的Makefile文件,定义编译模块的规则,指定编译器和编译选项等。

obj-m := security_md.o #内核模块名字,即生成security_md.kosecurity_md-objs := security.o sha.o aes.o #该security_md.ko涉及到的c源码,即security.c sha.c aes.cKDIR := /lib/modules/$(shell uname -r)/build  #指向当前系统正在运行的内核的源代码目录PWD := $(shell pwd) #当前路径all:make -C $(KDIR ) M=$(PWD) modulesclean:make -C $(KDIR ) M=$(PWD) clean
命令:make 

四、KO模块开发注意事项:

  1. 熟悉Linux内核的数据结构和API:内核模块需要使用Linux内核提供的数据结构和API,因此需要熟悉Linux内核的结构和编程接口。

  2. 避免使用标准C库:内核模块运行在内核空间,不能直接使用标准C库的函数,需要使用内核提供的函数来替代。

  3. 避免使用动态内存分配:内核模块需要分配内存来存储数据,但是不能使用标准C库的动态内存分配函数,因为它们会导致内核死锁或崩溃。内核提供了自己的内存分配器和管理机制。

  4. 谨慎使用全局变量:内核模块运行在内核空间,访问全局变量可能会影响整个系统的稳定性和安全性,需要谨慎使用。

  5. 编写安全的代码:内核模块运行在内核空间,具有很高的特权级别,必须编写安全的代码,避免因为漏洞或错误导致系统崩溃或被攻击。

http://www.lryc.cn/news/34893.html

相关文章:

  • 设计模式(十七)----行为型模式之模板方法模式
  • 【嵌入式Linux内核驱动】01_内核模块
  • Spring——数据源对象管理和Spring加载properties文件
  • Zeek安装、使用与压力测试
  • 【javaEE初阶】第三节.多线程 (进阶篇 ) 死锁
  • 基于密集连接的轻量级卷积神经网络,用于使用边云架构的露天煤矿服务识别
  • 无刷高速风筒方案介绍--【PCBA方案】
  • 花括号展开II[栈模拟dfs]
  • 神经网络分类任务(手写数字识别)
  • FCN网络(Fully Convolutional Networks)
  • 随想录二刷Day15——二叉树
  • docker-compose部署kafka服务时如何同时允许内外网访问?
  • 数据结构刷题(二十):17电话号码的字母组合、39组合总和、40组合总和II
  • Java面试总结(五)
  • 三维人脸实践:基于Face3D的渲染、生成与重构 <二>
  • 在linux上部署Java项目
  • 线性表的接口
  • spark三种操作模式的不同点分析
  • Vue3做出B站【bilibili】 Vue3+TypeScript【快速入门一篇文章精通系列(一)前端项目案例】
  • 猜数游戏--课后程序(Python程序开发案例教程-黑马程序员编著-第3章-课后作业)
  • Nvidia jetson nano 部署yolov5_技术文档
  • 获取当前天数前N天
  • Linux---基本指令
  • 【UE4 RTS游戏】02-摄像机运动_完成摄像机在X轴上运动的相关步骤
  • Kubernetes学习(五)持久化存储
  • 下一个7年,保持期待、持续思考,酷雷曼继续向前!
  • 天梯赛训练L1-010--L1-012
  • 三分钟完成Stable Diffusion本地安装(零基础体验AI绘画)
  • 电子台账:教程目录及软件下载
  • 多态的优势和弊端