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

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

  1. Pascal游戏开发入门(二):渲染图片

    Pascal游戏开发入门(二):渲染图片 渲染静态图片 新增一个Texture,然后Render出来 创建Texture,并获取尺寸 procedure TGame.Init(title: strin ...

  2. java游戏开发入门(二) - 菜单

    java游戏开发入门(二) - 菜单 前言 编码 主菜单 游戏内菜单(按下ESC后出现,并会暂停游戏) 效果展示 主菜单 游戏内菜单 完整代码 完整项目 前言   上一章我们创建了一个600x600的 ...

  3. VAPS XT开发入门教程00:基本介绍

    昨天(2021.10.12)到某研究所对其人员进行培训,发现一些问题,经过整理之后,形成本文比较系统化的培训流程. 当然,如果需要打补丁,本文会更新. VAPS XT介绍 VAPS XT基于PC机的人 ...

  4. 从零开始安卓端相机功能开发(二)让我们来开发一个相机

    目前已有章节大家可以去学习也可以参考一下 1.从零开始安卓端相机功能开发(一)了解用什么去开发以及流程 2.从零开始安卓端相机功能开发(二)让我们来开发一个相机 3.从零开始开发Android相机ap ...

  5. wifi linux 驱动分析,Linux 下wifi 驱动开发(二)—— WiFi模块浅析

    一.什么是wifi 模块百度百科上这样定义: Wi-Fi模块又名串口Wi-Fi模块,属于物联网传输层,功能是将串口或TTL电平转为符合Wi-Fi无线网络通信标准的嵌入式模块,内置无线网络协议IEEE8 ...

  6. Linux 下wifi 驱动开发(二)—— WiFi模块浅析

    一.什么是wifi 模块 百度百科上这样定义: Wi-Fi模块又名串口Wi-Fi模块,属于物联网传输层,功能是将串口或TTL电平转为符合Wi-Fi无线网络通信标准的嵌入式模块,内置无线网络协议IEEE ...

  7. 内核编程入门——编译内核

    Linux内核编译安装笔记 内核版本与下载 版本号 4.9.16 下载地址 预备知识 menuconfig与Makefile Linux内核根目录下的scripts文件夹 scripts文件夹存放的是 ...

  8. Vue开发入门(二) | 说说Vue全家桶有哪些~

    全家桶,顾名思义,就是一个系列,可以组合开发成完整强大的Vue项目 前言: *Vue两大核心思想:组件化和数据驱动. 组件化:把整体拆分为各个可以复用的个体 数据驱动:通过数据变化直接影响bom展示, ...

  9. 基于TI Davinci架构的双核嵌入式应用处理器OMAPL138开发入门(TI达芬奇双核开发资料 [

    基于TI Davinci架构的双核嵌入式应用处理器OMAPL138开发入门 一.简介 TI的达芬奇架构嵌入式应用处理器使用DSP与ARM结合的非对称多核结构,当然现在也有管脚全兼容的单核.本文要介绍的 ...

最新文章

  1. 二叉树-二叉树的镜像(递归法)
  2. ECMAScript——基本数据类型之null和undefined
  3. notepadpython插件_Notepad++插件Emmet和Python Script的安装
  4. 优酷开放sdk-setOnerroListener
  5. BroadcastReceive之ip拨号
  6. 构造不可变类及其优点
  7. Shell入门(七)之关系运算
  8. 职业规划纵向横向_收下这份《职业规划喂饭式指南》
  9. eclipse——Error exists in required project Proceed with launch?
  10. 解决VS+QT无法生成moc文件的问题
  11. 如何解决json中携带的反斜杠_【经验分享】python干货:5种反扒机制的解决方法...
  12. WCF生成的json与Extjs交互的日期型问题
  13. 123.static静态函数和函数模板
  14. 自学如何去学习jQuery
  15. 苹果电脑如何双开微信
  16. 高考数学三角函数解题技巧 三角函数的图象与性质(高考题)
  17. 测试网站速度简单方法
  18. ios 获取沙盒文件名_iOS之沙盒路径
  19. java深度模仿支付宝订单号/交易流水号(高性能,不重复)
  20. 利用python爬取教务系统中成绩

热门文章

  1. 支付宝开放平台应用— 乡镇卫生院申请
  2. 杨钦鸿:支付宝开放平台开发助手安装已中止,安装程序并未成功地运行完成该如何处理?
  3. 酷派可以刷android8吗,酷派锋尚MAX的手机系统是什么?能升级安卓5.0吗?
  4. 【ubuntu】markdown作业部落安装,创建快捷方式
  5. NKOJ 4974 「NOIP模拟」乌鸦坐飞机【倍增优化DP】
  6. html手机端网页如何在手机显示
  7. newcoder刷题笔记一
  8. 安装VMware Workstation Pro以及纯国产的达梦数据库
  9. Android 判断手机有没有安装该应用的工具类
  10. Vue 使用i8n, 中英文页面版本切换