linux内核开发入门二(内核KO模块介绍、开发流程以及注意事项)
linux内核开发入门二(内核KO模块介绍、开发流程以及注意事项)
一、什么是内核模块
内核模块:ko模块(Kernel Object Module)是Linux内核中的可加载模块,它可以动态地向内核添加功能。在运行时,可以通过加载或卸载ko模块来扩展或减少内核功能。ko模块通常包含驱动程序、文件系统、网络协议栈、安全模块等内核功能。内核开发人员可以通过编写ko模块来扩展或改进内核功能。
我们可以通过编写内核模块扩展内核功能,添加新的驱动程序或文件系统,或者修改内核的行为,而不需要重新编译整个内核。
二、编写内核模块的基本步骤:
编写模块代码:包括初始化和清除函数,以及其他需要的函数。
编写Makefile文件:定义编译模块的规则,指定编译器和编译选项等。
编译模块:使用make命令编译模块,生成ko文件。
加载模块:使用insmod命令加载模块。
卸载模块:使用rmmod命令卸载模块。
查看模块信息:使用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模块开发注意事项:
熟悉Linux内核的数据结构和API:内核模块需要使用Linux内核提供的数据结构和API,因此需要熟悉Linux内核的结构和编程接口。
避免使用标准C库:内核模块运行在内核空间,不能直接使用标准C库的函数,需要使用内核提供的函数来替代。
避免使用动态内存分配:内核模块需要分配内存来存储数据,但是不能使用标准C库的动态内存分配函数,因为它们会导致内核死锁或崩溃。内核提供了自己的内存分配器和管理机制。
谨慎使用全局变量:内核模块运行在内核空间,访问全局变量可能会影响整个系统的稳定性和安全性,需要谨慎使用。
编写安全的代码:内核模块运行在内核空间,具有很高的特权级别,必须编写安全的代码,避免因为漏洞或错误导致系统崩溃或被攻击。
linux内核开发入门二(内核KO模块介绍、开发流程以及注意事项)相关推荐
- Pascal游戏开发入门(二):渲染图片
Pascal游戏开发入门(二):渲染图片 渲染静态图片 新增一个Texture,然后Render出来 创建Texture,并获取尺寸 procedure TGame.Init(title: strin ...
- java游戏开发入门(二) - 菜单
java游戏开发入门(二) - 菜单 前言 编码 主菜单 游戏内菜单(按下ESC后出现,并会暂停游戏) 效果展示 主菜单 游戏内菜单 完整代码 完整项目 前言 上一章我们创建了一个600x600的 ...
- VAPS XT开发入门教程00:基本介绍
昨天(2021.10.12)到某研究所对其人员进行培训,发现一些问题,经过整理之后,形成本文比较系统化的培训流程. 当然,如果需要打补丁,本文会更新. VAPS XT介绍 VAPS XT基于PC机的人 ...
- 从零开始安卓端相机功能开发(二)让我们来开发一个相机
目前已有章节大家可以去学习也可以参考一下 1.从零开始安卓端相机功能开发(一)了解用什么去开发以及流程 2.从零开始安卓端相机功能开发(二)让我们来开发一个相机 3.从零开始开发Android相机ap ...
- wifi linux 驱动分析,Linux 下wifi 驱动开发(二)—— WiFi模块浅析
一.什么是wifi 模块百度百科上这样定义: Wi-Fi模块又名串口Wi-Fi模块,属于物联网传输层,功能是将串口或TTL电平转为符合Wi-Fi无线网络通信标准的嵌入式模块,内置无线网络协议IEEE8 ...
- Linux 下wifi 驱动开发(二)—— WiFi模块浅析
一.什么是wifi 模块 百度百科上这样定义: Wi-Fi模块又名串口Wi-Fi模块,属于物联网传输层,功能是将串口或TTL电平转为符合Wi-Fi无线网络通信标准的嵌入式模块,内置无线网络协议IEEE ...
- 内核编程入门——编译内核
Linux内核编译安装笔记 内核版本与下载 版本号 4.9.16 下载地址 预备知识 menuconfig与Makefile Linux内核根目录下的scripts文件夹 scripts文件夹存放的是 ...
- Vue开发入门(二) | 说说Vue全家桶有哪些~
全家桶,顾名思义,就是一个系列,可以组合开发成完整强大的Vue项目 前言: *Vue两大核心思想:组件化和数据驱动. 组件化:把整体拆分为各个可以复用的个体 数据驱动:通过数据变化直接影响bom展示, ...
- 基于TI Davinci架构的双核嵌入式应用处理器OMAPL138开发入门(TI达芬奇双核开发资料 [
基于TI Davinci架构的双核嵌入式应用处理器OMAPL138开发入门 一.简介 TI的达芬奇架构嵌入式应用处理器使用DSP与ARM结合的非对称多核结构,当然现在也有管脚全兼容的单核.本文要介绍的 ...
最新文章
- 二叉树-二叉树的镜像(递归法)
- ECMAScript——基本数据类型之null和undefined
- notepadpython插件_Notepad++插件Emmet和Python Script的安装
- 优酷开放sdk-setOnerroListener
- BroadcastReceive之ip拨号
- 构造不可变类及其优点
- Shell入门(七)之关系运算
- 职业规划纵向横向_收下这份《职业规划喂饭式指南》
- eclipse——Error exists in required project Proceed with launch?
- 解决VS+QT无法生成moc文件的问题
- 如何解决json中携带的反斜杠_【经验分享】python干货:5种反扒机制的解决方法...
- WCF生成的json与Extjs交互的日期型问题
- 123.static静态函数和函数模板
- 自学如何去学习jQuery
- 苹果电脑如何双开微信
- 高考数学三角函数解题技巧 三角函数的图象与性质(高考题)
- 测试网站速度简单方法
- ios 获取沙盒文件名_iOS之沙盒路径
- java深度模仿支付宝订单号/交易流水号(高性能,不重复)
- 利用python爬取教务系统中成绩
热门文章
- 支付宝开放平台应用— 乡镇卫生院申请
- 杨钦鸿:支付宝开放平台开发助手安装已中止,安装程序并未成功地运行完成该如何处理?
- 酷派可以刷android8吗,酷派锋尚MAX的手机系统是什么?能升级安卓5.0吗?
- 【ubuntu】markdown作业部落安装,创建快捷方式
- NKOJ 4974 「NOIP模拟」乌鸦坐飞机【倍增优化DP】
- html手机端网页如何在手机显示
- newcoder刷题笔记一
- 安装VMware Workstation Pro以及纯国产的达梦数据库
- Android 判断手机有没有安装该应用的工具类
- Vue 使用i8n, 中英文页面版本切换