[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.mzph.cn/news/616481.shtml

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

相关文章

Windows安装Rust环境(详细教程)

一、 安装mingw64(C语言环境) Rust默认使用的C语言依赖Visual Studio&#xff0c;但该工具占用空间大安装也较为麻烦&#xff0c;可以选用轻便的mingw64包。 1.1 安装地址 (1) 下载地址1-GitHub&#xff1a;Releases niXman/mingw-builds-binaries GitHub (2) 下载地址2-W…

Formnext2024法兰克福3D打印增材制造展览会现正接受报名

Formnext2024法兰克福3D打印增材制造展览会现正接受报名 Formnext法兰克福国际精密成型及 3D 打印制造展览会将于2024年11月19日至22日在法兰克福举办。 Formnext法兰克福国际精密成型及 3D 打印制造展览会在2023年迎来了32,851名专业人士和管理人员(50%来自国际)&#xff0c…

Excel地址

解题思路&#xff1a; 根据题中歪歪和笨笨的话可以有两种解法。 1.输入的数为多大&#xff0c;则循环1多少次&#xff0c;当值为27时就要进行进位操作。这时要分情况讨论。 当集合中元素为一个时&#xff0c;如26&#xff0c;则需要变为1 1&#xff0c;集合元素个数加一。 当…

2023年全球软件质量效能大会(QECon上海站):核心内容与学习收获(附大会核心PPT下载)

会议聚焦于软件质量和效能的提升。在智能时代&#xff0c;随着数字化的深入人心&#xff0c;软件正在随着云计算、移动互联网、物联网等的发展而不断进化&#xff0c;软件对企业的发展愈加重要&#xff0c;大家对软件的质量要求也在从传统功能、性能、安全这些基础层面向着用户…

easyui datagrid无数据时显示无数据

这里写自定义目录标题 需求解决办法 需求 使用datagrid显示记录时&#xff0c;结果查询记录数为0&#xff0c;此时需要显示无数据。 示例代码 <table id"dg"></table>$(#dg).datagrid({url:datagrid_data.json,columns:[[{field:code,title:Code,widt…

【OCR】实战使用 - 如何提高识别文字的精准度?

实战使用 - 如何提高文字识别的精准度 我们在平常使用OCR的时候&#xff0c;经常会出现文字识别不精准的情况&#xff0c;我们改如何提高文字识别的精度呢&#xff1f; 以下是一些提高OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;文字识…

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

1、在yolov5/models下面新建一个A2Attention.py文件&#xff0c;在里面放入下面的代码 代码如下&#xff1a; import numpy as np import torch from torch import nn from torch.nn import init from torch.nn import functional as Fclass DoubleAttention(nn.Module):def …

coco数据集格式转yolo数据格式

一、coco数据集是什么&#xff1f; COCO&#xff08;Common Objects in Context&#xff09;是一个广泛使用的目标检测和分割数据集&#xff0c;而YOLO&#xff08;You Only Look Once&#xff09;是一种流行的实时目标检测算法。 首先&#xff0c;导入了必要的库&#xff0c…

87.乐理基础-记号篇-反复记号(一)反复、跳房子

内容参考于&#xff1a;三分钟音乐社 上一个内容&#xff1a;86.乐理基础-记号篇-速度记号-CSDN博客 首先是反复记号表总结图&#xff1a; 当前是写前两个记号&#xff0c;其余记号后面写&#xff1a;这些反复记号最主要的目的很简单&#xff0c;还是为了节约纸张&#xff0c…

蓝桥杯单片机组备赛——LED指示灯的基本控制

&#x1f388;教程介绍&#xff1a;博客依据b站小蜜蜂老师的教程进行编写&#xff0c;文中会对老师传授的知识进行总结并加入自己的一些理解。教程链接 文章目录 一、点灯介绍二、相关数字芯片介绍2.1 74HC138介绍2.2 74HC573介绍2.3 74HC02介绍 三、代码设计思路四、代码编写…

Spring MVC 异常处理器

异常处理器 如果不加以异常处理&#xff0c;错误信息肯定会抛在浏览器页面上&#xff0c;这样很不友好&#xff0c;所以必须进行异常处理。 异常处理思路 系统的dao、service、controller出现都通过throws Exception向上抛出&#xff0c;最后由springmvc前端控制器交由异常处…

解决跨域问题的8种方案(最新最全)

什么是跨域: 浏览器对于javascript的同源策略的限制,例如http://a.cn下面的js不能调用http://b.cn中的js,对象或数据(因为http://a.cn和http://b.cn是不同域),所以跨域就出现了.同域&#xff1a;简单的解释就是域名相同,端口相同,协议相同 为什么需要跨域&#xff1f; 在最一…

关于java方法定义的回顾

关于java方法定义的回顾 我们在上一篇文章中&#xff0c;对java的面向对象有了一个初步的理解&#xff0c;因为类里面方法是必不可少的&#xff0c;我们本篇文章对方法进行一个回顾&#xff0c;以便加深一下对方法的了解程度和使用&#x1f600;。 我们把前面讲解到方法的文章…

LeetCode 590. N 叉树的后序遍历

590. N 叉树的后序遍历 给定一个 n 叉树的根节点 root &#xff0c;返回 其节点值的 后序遍历 。 n 叉树 在输入中按层序遍历进行序列化表示&#xff0c;每组子节点由空值 null 分隔&#xff08;请参见示例&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [1,null,…

Redis优化和解决缓存问题

目录 redis的2种持久化方式 RDB持久化 AOF持久化 redis优化 redis的三大缓存问题 缓存雪崩的解决方案&#xff1a; 缓存穿透的解决方案&#xff1a; 缓存击穿的解决方案&#xff1a; 如何保证 MySQL 和 redis 的数据一致性&#xff1f; redis的2种持久化方式 RDB持久化…

C桑(Cython)从入门到入土(2): np数组操作对比

C桑(Cython)从入门到入土 2. np数组操作对比 Node sc518 Copy has image data of type unsigned long long实际上, &#x1f446;&#x1f3fb;这个错误是我探索Cython的缘起… code1: Form: 更现代的方法是使用内存视图而不是指针&#xff1a; cdef np.uint32_t[:,:,::1] …

The True Beauty; What is beauty;

Tiny syposis on Beauty Standards I) webpage addressII) text content excerption I) webpage address URL route II) text content excerption I am forensic artist 素描师&#xff08;法医的&#xff09;, worked for the San Jose Police Department 警局&#xff0c;f…

一个神奇的SQL聚合查询案例

今天给大家分享一个 SQL 案例&#xff0c;假如存在以下两个表&#xff1a; CREATE TABLE t1 (val1 INT); INSERT INTO t1 VALUES (1), (2), (3);CREATE TABLE t2 (val2 INT); INSERT INTO t2 VALUES (10), (20), (30);每个表包含 3 条数据。请问&#xff0c;以下查询返回结果是…

在C++中控制调试信息的输出通常通过预处理指令(如 #define)和条件编译指令(如 #ifdef、#ifndef、#endif)来实现。

文章目录 在C中&#xff0c;控制调试信息的输出通常通过预处理指令&#xff08;如 #define&#xff09;和条件编译指令&#xff08;如 #ifdef、#ifndef、#endif&#xff09;来实现。这种方法提供了一种灵活的方式来包含或排除调试代码&#xff0c;而无需对代码本身进行大量修改…

【昕宝爸爸小模块】深入浅出之Java 8中的 Stream

深入浅出之Java 8中的 Stream 一、&#x1f7e2;典型解析1.1 &#x1f7e0;Java 8中的Stream 都能做什么1.2 &#x1f7e0;Stream的创建 二、✅ Stream中间操作2.1 &#x1f7e0;Filter2.2 &#x1f7e0;Map2.3 &#x1f7e0;limit / skip2.4 &#x1f7e0;sorted2.5 &#x1…