[linux]编译一个ko文件并运行

news2024/12/25 0:13:02

一、需求

有一段代码需要在运行时加载注入内核中,当用户层需要访问时可以提供内核态环境去运行。

二、c代码构建

// #include <errno.h>
// #include <string.h>
// #include <stdio.h>
// #include <fcntl.h>
// #include <stdlib.h>
// #include <unistd.h>
#include <linux/ioctl.h>
// #include <sys/syscall.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/time.h>
#include <linux/sched.h>
#include <linux/unistd.h>
// #include <asm/uaccess.h>

static int sk_init(void)
{
    printk(KERN_INFO "sk:init.\n");
    return 0;
}
module_init(sk_init);

static void sk_exit(void)
{
    printk(KERN_INFO "sk:exit.\n");
    return;
}
module_exit(sk_exit);

MODULE_AUTHOR("Even");
MODULE_LICENSE("GPL");
// MODULE_DESCRITION("secure key get module");
MODULE_ALIAS("a simplest module");

三、c代码讲解

3.1头文件声明

关键代码

// #include <errno.h>
// #include <string.h>
// #include <stdio.h>
// #include <fcntl.h>
// #include <stdlib.h>
// #include <unistd.h>
#include <linux/ioctl.h>
// #include <sys/syscall.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/time.h>
#include <linux/sched.h>
#include <linux/unistd.h>
// #include <asm/uaccess.h>

由于此部分代码属于内核,因此所有的函数都需要使用内核提供的库函数实现,被屏蔽的头文件是首先从应用层移植过来的应用层函数库,因此无法使用做屏蔽处理。已使用的函数库一般是在“linux/”目录下,少数可能会用到的函数库会在"asm/"路径下。

3.2初始化与退出函数构建

关键代码


static int sk_init(void)
{
    printk(KERN_INFO "sk:init.\n");
    return 0;
}
module_init(sk_init);

static void sk_exit(void)
{
    printk(KERN_INFO "sk:exit.\n");
    return;
}
module_exit(sk_exit);

此部分函数中,首先定义初始化函数“sk_init”以及退出函数“sk_exit”,注意,其中使用的打印函数为内核打印函数“printk”。其次使用模块安装函数向内核声明安装时要执行的函数“module_init”,此函数必须要写,否则会导致模块装载找不到初始化函数。同理,使用module_exit声明模块卸载函数。

3.3其他声明

关键函数

MODULE_AUTHOR("Even");
MODULE_LICENSE("GPL");
// MODULE_DESCRITION("secure key get module");
MODULE_ALIAS("a simplest module");

不可省略,此处会向模块声明作者、规范与介绍。

四、Makefile文件构建

在该c文件相同路径下,新建Makefile文件。

关键代码

obj-m:=secure_key.o
KDIR := /home/Evenurs/f1c100s/dev/f1c100s/tina/lichee/linux-3.10
PWD :=$(shell pwd)
CROSS_COMPILE := /home/Evenurs/f1c100s/dev/f1c100s/tina/prebuilt/gcc/linux-x86/arm/toolchain-sunxi-arm9-musl/toolchain/bin/arm-openwrt-linux-muslgnueabi-
ARCH := arm
all:
	make ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C $(KDIR) M=$(PWD) modules
clean:
	rm -f *.ko *.o 

五、Makefile讲解

第一行:obj-m:声明本文件以模块形式进行编译,m表示“module”。

第二行:KDIR:声明内核路径,即kernel dir。

第三行:PWD:声明当前工作目录绝对路径,$(shell pwd)表示执行pwd命令。

第四行:CROSS_COMPILE:声明编译工具,注意,需省去末尾的gcc,因为在编译时会自动补充“gcc”。

第五行:ARCH:声明架构为arm。

第六行及以后:声明命令与执行的内容。

注意:make指令的末尾的modules代表以模块形式进行编译。

六、目录结构

--root

  --*.c

  --Makefile

七、在Makefile文件目录下,执行make命令,会生成*.ko文件。

八、使用insmod指令装载ko

效果如下

 

九、结论

在处理ko时,时刻记住此时身处内核态下,操作都需要使用内核态的方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1374159.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

全新小白菜QQ云端机器人登录系统源码 /去除解密授权学习版源码

源码介绍&#xff1a; 全新小白菜QQ云端机器人登录系统源码&#xff0c;是一款经过全面解密的授权学习版源码。 这款源码已解除了授权版的限制&#xff0c;然而许多人可能对其用途并不了解。实际上&#xff0c;该源码主要面向群机器人爱好者设计。它是一个基于挂机宝机器人框…

基于3D Gaussian Splatting与NeRF实现三维重建(使用IPhone创建数据集)

基于Spectacular AI与NeRF实现三维重建-使用IPhone创建数据集 前言项目简介创建数据集扫描处理数据集 解析数据集Python环境 Windows ffmpeg 环境搭建数据集处理安装Nerfstudio需要CUDA环境 依次安装依赖pip install nerfstudio Nerfstudio实现效果开始训练参数配置实时训练浏览…

吐血整理,自动化测试框架总结,一篇从0到1策底打通...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、什么是框架 定…

目标检测开源数据集——道路坑洼

一、危害 对车辆的影响&#xff1a;道路坑洼会导致车辆行驶不稳&#xff0c;增加车辆的颠簸&#xff0c;不仅影响乘坐舒适度&#xff0c;还可能对车辆的悬挂系统、轮胎等造成损害。长期在坑洼路面上行驶&#xff0c;车辆的减震系统、悬挂系统等关键部件容易受损&#xff0c;进…

(超详细)2-YOLOV5改进-添加SimAM注意力机制

1、在yolov5/models下面新建一个SimAM.py文件&#xff0c;在里面放入下面的代码 代码如下&#xff1a; import torch import torch.nn as nnclass SimAM(torch.nn.Module):def __init__(self, e_lambda1e-4):super(SimAM, self).__init__()self.activaton nn.Sigmoid()self…

中国电子学会2022年12月份青少年软件编程Scratch图形化等级考试试卷二级真题(含答案)

1.运行下列哪段程序&#xff0c;可以让狗狗走到木屋门口&#xff1f;&#xff08;C&#xff09;(2分) A. B. C. D. 答案解析&#xff1a;小窝在狗狗前方90度方向&#xff0c;我们使用程序让狗狗向前移动即可&#xff0c;移动距离不会超过舞台的宽度&#xff08;480&#xf…

git init 执行后发生了什么?

首先在磁盘中创建一个新目录 Git&#xff0c;进入该目录后执行 git init 初始化。这个时候目录下会创建一个隐藏目录 ./git&#xff0c;这个./git 目录叫做 Git 版本库或者仓库 $ git init Initialized empty Git repository in D:/Git/.git/在讲解.git 目录内容前&#xff0c…

Xcode15 升级问题记录

这里写自定义目录标题 新版本Xcode15升级问题1&#xff1a;rsync error: some files could not be transferred (code 23) at ...参考 新版本Xcode15升级 下载地址&#xff1a;https://developer.apple.com/download/all/ 我目前使用的版本是Xcode15.2 我新创建了一个项目&…

《JVM由浅入深学习【七】 2024-01-11》JVM由简入深学习提升分享

亲爱的读者们&#xff0c;欢迎来到本篇博客&#xff0c;这是JVM第七次分享&#xff0c;下面是七个JVM常用常面的分享&#xff0c;请笑纳 目录 1. 几个与JVM 内存相关的核心参数2.如何计算一个对象的大小3.堆为什么要分为新生代和老年代4.JVM堆的年轻代为什么要有两个 Survivor…

分布式限流和本地限流那些事?

分布式限流和本地限流的目的是一样的&#xff0c;当然我建议技术人在自己的服务中优先考虑本地限流&#xff0c;那样对于自己的API的影响会小一点。 限流这种技术&#xff0c;在没有触发限流的阈值的时候&#xff0c;是不会有什么大的问题的&#xff0c;当时一旦触发阈值&…

全网独家:基于openEuler-22.03-LTS-SP4底包构建opengauss 2.1.0 rpm包安装的单机轻量版数据库容器

本文基于openEuler-22.03-LTS-SP4底包,使用rpm安装方式构建opengauss 2.1.0 单机轻量版数据库容器。 一、openEuler-22.03-LTS-SP4底包 1、下载镜像 下载链接 sha256:ffe6c97428d6e684519dd670c18d6681861bdc17719b0387c6e11a65e37a771f openEuler-docker.x86_64.tar.xz …

景联文科技:以高质量数据赋能文生图大模型

1月5日&#xff0c;在智求共赢・中国AIGC产业应用峰会暨无界AI生态合作伙伴大会上&#xff0c;中国AIGC产业联盟联合无界AI发布了《中国AIGC文生图产业白皮书2023》&#xff0c;从AIGC文生图发展历程、主流工具、产业实践以及规模预测等多个维度&#xff0c;全面揭示了中国AIGC…

electron+vue编辑Office Word?

Electron 桌面应用是基于 Chromium 内核的&#xff0c;而谷歌Chrome取消了对PPAPI插件支持后&#xff0c;在线Office方案纷纷失效&#xff0c;只能更换国产浏览器在低版本浏览器苟延残喘&#xff0c;不能用于electronvue项目。 经过小编不断的寻找&#xff0c;终于找到一款至今…

vue3的福音框架arco.design

前言&#xff1a; 在vue2于2023年底正式宣布不在维护&#xff0c;vue3使用越来越频繁的时刻&#xff0c;我们实现项目的辅助框架也越来越多。element, iview, antd 等经典框架继续风靡一时&#xff0c;不过也有很多好的框架&#xff0c;功能也强大&#xff0c;比如我们今天说的…

数据交付变革:研发到产运自助化的转型之路

作者 | Chris 导读 本文讲述为了提升产运侧数据观察、分析、决策的效率&#xff0c;支持业务的快速迭代&#xff0c;移动生态数据研发部对数仓建模与BI工具完成升级&#xff0c;采用宽表建模与TDA平台相结合的方案&#xff0c;一站式自助解决数据应用需求。在此过程中&#xff…

限流算法之计数器法

文章目录 一、计数器法是什么&#xff1f;二、模拟限流算法java版效果 一、计数器法是什么&#xff1f; 计数器法是限流算法里最简单也是最容易实现的一种算法。 比如&#xff1a;对于一个接口来说&#xff0c;我们1分钟的访问次数不能超过100个。那么我们可以这么做&#xff…

大话 JavaScript(Speaking JavaScript):第二十一章到第二十五章

第二十一章&#xff1a;数学 原文&#xff1a;21. Math 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 Math对象用作多个数学函数的命名空间。本章提供了一个概述。 数学属性 Math的属性如下&#xff1a; Math.E 欧拉常数&#xff08;e&#xff09; Math.LN2 2 …

论文阅读《Generalizing Face Forgery Detection with High-frequency Features》

高频噪声分析会过滤掉图像的颜色内容信息。 本文设计了三个模块来充分利用高频特征&#xff0c; 1.多尺度高频特征提取模块 2.双跨模态注意模块 3.残差引导空间注意模块&#xff08;也在一定程度上体现了两个模态的交互&#xff09; SRM是用于过滤图像的高频噪声 输入的图…

韩语干货-TOPIK韩语初级必备词汇|柯桥外语学校-小语种考级培训

물【名】水 좋다【形】好 나쁘다【形】坏&#xff0c;不好 맛있다【形】好吃 맛없다【形】不好吃&#xff0c;难吃 책【名】书 없다【形/动】没有/不在 있다【形/动】有&#xff0c;在 읽다【动】读 많다【形】多 적다【形】少 좋아하다【动】喜欢 싫다【形】讨厌 구두…

AI人工智能虚拟数字人行业运用那些领域较广?

AI人工智能虚拟数字人行业是一种新兴的技术应用领域&#xff0c;近年来得到了快速发展。据统计数据显示&#xff0c;该行业的市场规模逐年扩大&#xff0c;投资前景广阔。 首先&#xff0c;我们可以从技术创新的角度来分析AI人工智能虚拟数字人行业的发展情况。随着人工智能技…