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

一、需求

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

二、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.rhkb.cn/news/235551.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java中输入和输出处理(三)二进制篇

叮咚&#xff01;加油&#xff01;马上学完 读写二进制文件Data DataInputStream类 FilFeInputStream的子类 与FileInputStream类结合使用读取二进制文件 DataOutputStream类 FileOutputStream的子类 与FileOutputStream类结合使用写二进制文件 读写二进制代码 package 面…

盘活存量GPU资源 破局高校算力不足窘境

“凭啥做大模型的优先分配算力&#xff1f;人家1个人4块A800&#xff0c;我们10个人用2块3090&#xff01;这日子没法过了&#xff01;”听着团队成员们的吐槽&#xff0c;某国内顶尖高校非大模型团队带队的博士老W也颇为无奈&#xff1a;“我们虽然不是做大模型的&#xff0c;…

竞赛保研 基于深度学习的行人重识别(person reid)

文章目录 0 前言1 技术背景2 技术介绍3 重识别技术实现3.1 数据集3.2 Person REID3.2.1 算法原理3.2.2 算法流程图 4 实现效果5 部分代码6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的行人重识别 该项目较为新颖&#xff0c;适合…

Unity报错:[SteamVR] Not Initialized (109)的解决方法

问题描述 使用HTC vive 头像进行SteamVR插件的示例场景进行测试&#xff0c;发现头显场景无法跳转到运行场景&#xff08;Unity 项目可以运行&#xff0c;仅出现警告&#xff09;。 具体如下&#xff1a; [SteamVR] Not Initialized (109) [SteamVR] Initialization failed…

STL源码阅读总结从小白到大神:vector

一、vector概述 vector的数据格式与array非常相似&#xff0c;两者的差别在于空间的灵活运用&#xff0c;array是静态空间&#xff0c;一旦配置内存空间就不容易更改原来的空间大小。而vector是动态空间&#xff0c;随着元素的加入&#xff0c;它的内部机制就会自动扩容以容纳…

【算法】基础算法001之双指针

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.数组分块&#xf…

NACHI机器人模拟示教器如何切换中文

前言 现在开始学习机器人的编程语言&#xff0c;那么要学习会用首先得用模拟示教器来学习&#xff0c;但是全是英文确实比较难受一些些&#xff0c;没有中文来的直观。所以摸透一下如何给示教器更换语言。 具体步骤 步骤一&#xff1a;将中文的汉化包下载下来。具体的下载链…

JMeter 批量接口测试

一、背景 最近在进行某中台的接口测试准备&#xff0c;发现接口数量非常多&#xff0c;有6、70个&#xff0c;而且每个接口都有大量的参数并且需要进行各种参数验证来测试接口是否能够正确返回响应值。想了几种方案后&#xff0c;决定尝试使用JMeter的csv读取来实现批量的接口…

Window Docker安装

1.下载安装Docker 在Windows上安装Docker桌面_Docker中文网 (dockerdocs.cn)https://dockerdocs.cn/docker-for-windows/install/index.html2.安装完&#xff0c;修改镜像 Docker——Windows版本Docker安装_docker windows-CSDN博客https://blog.csdn.net/weixin_51351637/ar…

【软考中级-软件设计师】day7:图

概述 1-2道选择 图的存储 图的遍历 图的最小生成树 prim算法 kruscal算法 2135476 选7不选6是因为4的先删除&#xff08;vi必须在vj之前&#xff09;跟4有关的删了以后&#xff0c;入度为0的结点只剩下7&#xff0c;所以选7再6

13.若依代码自动生成功能详解

文章目录 1.代码自动生成功能2.功能的使用3. 代码的导出和使用 1.代码自动生成功能 基于若依的目录结构&#xff0c;若依本身提供了代码生成功能&#xff0c;可以根据数据库表的内容&#xff0c;生成一些基本的CRUD的前后端的功能。本文将生成过程中的一些注意事项&#xff0c…

【APACHE】的认识和基础配置参数

#主页传送:江南的江 #每日鸡汤&#xff1a;人生没有如果和假设&#xff0c;只有后果和结果。生活有进有退&#xff0c;输什么也不能输心情。生活简单就是迷人的&#xff0c;学会简单其实就是不简单。要学会平静地接受现实&#xff0c;学会对自己说声顺其自然&#xff0c;学会坦…

如何在OpenWRT部署uhttpd搭建服务器实现远程访问本地web站点

文章目录 前言1. 检查uhttpd安装2. 部署web站点3. 安装cpolar内网穿透4. 配置远程访问地址5. 配置固定远程地址 前言 uhttpd 是 OpenWrt/LuCI 开发者从零开始编写的 Web 服务器&#xff0c;目的是成为优秀稳定的、适合嵌入式设备的轻量级任务的 HTTP 服务器&#xff0c;并且和…

版本控制背景知识

版本控制背景知识 本文是关于 Git 系列文章的导读&#xff0c;我们先介绍一下版本控制的背景知识。 什么是版本控制 版本控制是一种记录一个或若干文件内容变化&#xff0c;以便将来查阅特定版本修订情况的系统。它将什么时候、什么人更改了文件的什么内容等信息如实记录下来…

【2023 - 探索】博0到博1,游戏新地图的探索日志

【2023 - 探索】博0到博1&#xff0c;游戏新地图的探索日志 写在最前面CSDN探索日志2023的探险 探索日志年终回顾探索 冒险回顾实习6月开始跟着老师做科研年中的一些其他事情9月开始上课开学后11月&#xff0c;读者互动 新年展望新年祝福 写在最前面 2023&#xff0c;我解锁了新…

JVM:从零到入门

JVM&#xff0c;就是Java虚拟机。 JVM是一个巨大的话题&#xff0c;我们本文主要简单介绍一些围绕JVM相关的基础知识。 目录 JVM内存区域划分 本地方法栈 虚拟机栈 堆 程序计数器 方法区/ 元数据区 类加载 1.加载 2.验证 3.准备 4.解析 5.初始化 双亲委派模型 …

Kafka消息存储

一、层次结构 具体到某个broker上则是, 数据目录/分区名/日志相关文件集合。其中日志文件集合内包括.log文件, index索引文件和.timeindex时间戳索引文件。 二、.log 结构 .log中记录具体的消息。一般消息由header和body组成, 这点儿在Kafka消息中也同样适用。 message MES…

NSSCTF Interesting_include

开启环境: 通过审计,我们可知: flag在flag.php中,可以利用php中伪协议 payload:?filterphp://filter/readconvert.base64-encode/resourceflag.php 将其base64解码就是flag. NSSCTF{3dc54721-be9e-444c-8228-7133fba76ad4}

【设计模式-02】Strategy策略模式及应用场景

一、参考资料 Java 官方文档 Overview (Java SE 18 & JDK 18)module indexhttps://docs.oracle.com/en/java/javase/18/docs/api/index.html Java中使用到的策略模式 Comparator、comparable Comparator (Java SE 18 & JDK 18)declaration: module: java.base, pa…

RHCE9学习指南 第20章 计划任务

有时需要在某个指定的时间执行一个操作&#xff0c;此时就要使用计划任务了。计划任务有两种&#xff1a;一个是at计划任务&#xff0c;另一个是crontab计划任务。 下面我们分别来看这两种计划任务的使用。 20.1 at at计划任务是一次性的&#xff0c;到了指定的时间点时就开始…