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

这篇具有很好参考价值的文章主要介绍了[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

效果如下

[linux]编译一个ko文件并运行,linux,ko,kernel,内核,Makefile,编译ko

 [linux]编译一个ko文件并运行,linux,ko,kernel,内核,Makefile,编译ko

九、结论

在处理ko时,时刻记住此时身处内核态下,操作都需要使用内核态的方法。文章来源地址https://www.toymoban.com/news/detail-789182.html

到了这里,关于[linux]编译一个ko文件并运行的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux:编写编译脚本Makefile文件

    一、生成可执行文件 1、一个源文件编译 本例子主要区别.c及.cpp文件及编译该文件时使用的编译链。 1).c文件 2) .cpp文件 经过以上测试,总结如下: 以.cpp为后缀的文件,为c++代码。代码最好使用C++语言。也可以使用c语言。 a 代码使用c++语言,编译时必须要用g++,不能使用

    2024年02月11日
    浏览(34)
  • Linux驱动1:入口与出口、头文件路径、makefile编译

    目录 Linux 驱动两种运行方式 字符设备驱动框架 1、创建目录和编写文件 2、添加头文件路径 3、Makefile编写和解释 4、编译测试 第一种就是将驱动编译进 Linux 内核中,这样当 Linux 内核启动的时候就会自动运行驱动程序; 第二种就是将驱动编译成模块(Linux 下模块扩展名为.ko),

    2024年02月10日
    浏览(43)
  • 如何编译linux驱动ko

    本文描述了liunx驱动ko的编译方法,其中单编驱动ko是本文的重点。 什么是ko? 在Linux中一个.ko文件就是一个模块文件。 linux提供了一种称为模块(Module)的机制,模块具有以下特点: 1、模块自身不被编译到内核映像中,从而不影响内核映像的大小 2、一旦模块被加载,模块和

    2024年02月03日
    浏览(23)
  • 【Linux Kernel】Linux内核裁剪

    目录 1. 内核简介 1.1 内核版本及特点 1.2 获取内核源码 1.3 内核启动过程简述 1.3.1 内核引导阶段 1.3.2 内核初始化阶段 2. 内核源码结构及Makefile分析 2.1 Linux内核Makefile分析 2.1.1决定编译那些文件 2.1.2 怎样编译这些文件 2.1.3 怎样链接这些文件 3. Kconfig分析 3.1 Kconfig文件的基本要

    2024年02月04日
    浏览(48)
  • IMX6ULLPRO单独编译kernel+dtb内核模块以及uboot

    目录 linux开发板启动流程 为什么编译驱动程序之前要先编译内核? 驱动程序要用到内核文件: 编译内核 编译安装内核模块 编译内核模块 安装内核模块到 Ubuntu 某个目录下备用  安装内核和模块到开发板上  Bootloader 介绍 编译 u-boot 镜像 Reset--ROM--bootloader--kernel+dtb--rootfs--AP

    2024年01月22日
    浏览(43)
  • ubuntu linux kernel内核操作

    1.内核编译前的准备工作 2.下载内核 4. 编译新内核 5. 内核安装 6. 安装模块 7. 生成initrd.img文件 8. 切换到/boot/grub/目录下,自动查找新内核,并添加至grub引导 9. 重启Ubantu,在previous version中选择启动新编译的内核 VMware虚拟机Ubantu20.04,Linux5.8.1内核源代码包 1.内核编译前的准备

    2024年02月19日
    浏览(42)
  • Linux驱动开发一、RK3568把hello编译到Linux内核中运行。‘rk_vendor_read’未定义的引用

    1、在字符设备目录下建立hello目录 ~/Linux/rk356x_linux/kernel/drivers/char/hello 2、进入hello目录,新建hello.c、Makefile、Kconfig三个文件 3、Kconfig是打开make menuconfig配置界面是后的选项,这Kconfig是在字符设备下的。 config后面的HELLO就是对应配置后在kernel目录下的**.config中的CONFIG_HELLO配置

    2024年02月11日
    浏览(70)
  • 【Linux内核解析-linux-5.14.10-内核源码注释】内核启动kernel_init解释

    static int __ref kernel_init(void *unused) : 声明一个静态整型函数 kernel_init() ,该函数不会被其他文件访问,使用 __ref 标记表示该函数是可重定位的,并且该函数不需要任何参数。 wait_for_completion(kthreadd_done); : 等待 kthreadd 线程完成初始化, wait_for_completion() 函数会阻塞当前进程,直到

    2024年02月02日
    浏览(69)
  • Linux Kernel内核整体架构(图文详解)

    本文是“Linux内核分析”系列文章的第一篇,会以内核的核心功能为出发点,描述Linux内核的整体架构,以及架构之下主要的软件子系统。之后,会介绍Linux内核源文件的目录结构,并和各个软件子系统对应。 注:本文和其它的“Linux内核分析”文章都基于如下约定: a) 内核版

    2024年02月11日
    浏览(43)
  • linux: 配置ko文件开机自动

    在CentOS 7中,要配置一个 .ko (内核模块)文件以便在开机时自动加载,可以按照以下步骤操作: 确认模块兼容性 :确保您的 .ko 文件与正在运行的内核版本兼容。可以使用 uname -r 命令来查看您的内核版本。 手动加载模块 :在自动加载之前,应该先手动加载模块以确保它能

    2024年02月19日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包