向内核模块中添加新功能

news/2024/11/17 21:18:25/

一、向内核添加新功能

1.1 静态加载法:

即新功能源码与内核其它代码一起编译进uImage文件内

  1. 新功能源码与Linux内核源码在同一目录结构下

  2. 给新功能代码配置Kconfig

    #进入要添加的新功能的同级目录,这里用添加一个名为MY_HELLO的驱动做演示#cd到linux源码中driver文件下的char文件中,修改其Kconfig文件,
    vim Kconfig
    
    #在其中可以发现他们长的都差不多,我们在里面添加如下内容,在内容中解析每个都是什么意思
    config MY_HELLO //添加新功能MY_HELLOtristate "This is a hello test" //tristate表示这个功能可以动态加载,如果禁止动态加载的话就将其替换为bool即可help //对添加功能的解释,具体现象都在下方使用命令make menuconfig后This is a test for kernel new function
    
  3. 给新功能代码改写Makefile

    #cd进入添加功能源码的同级目录,并修改其makefile#拷贝一行,粘贴在下一行,修改成:
    obj-$(CONFIG_MY_HELLO)     += myhello.o //注意最后的文件是对应源码的.o文件,前方的CONFIG_后对应的是实现功能的名字,我们的源码是myhello.c,添加的功能叫做MY_HELLO

4.make menuconfig 界面里将新功能对应的那项选择成<*>

在命令行输入 make menuconfig后会出现如下界面,然后按步骤执行即可 :

#make menuconfig如果出错,一般是两个原因:

#1. libncurses5-dev没安装

#2. 命令行界面太小(太矮或太窄或字体太大了),只需将界面最大化后执行即可

 

 

 

  ​5.回到linux源码最上层执行 make uImage,生成的uImage就是添加完新功能的文件了,就可以将其使用tftp传输到开发板上进行测试

2.动态加载法:

即新功能源码与内核其它源码不一起编译,而是独立编译成内核的插件(被称为内核模块)文件.ko

1、新功能源码与Linux内核源码在同一目录结构下时:

  1. 给新功能代码配置Kconfig

  2. 给新功能代码改写Makefile

  3. make menuconfig 界面里将新功能对应的那项选择成<M>

  4. make uImage

  5. make modules

    make modules会在新功能源码的同级目录下生成相应的同名.ko文件(生成的ko文件只适用于开发板linux)

    注意此命令执行前,开发板的内核源码已被编译,上面三个make都是在源码的最顶层执行的,配置Kconfig和Makefile则是在要添加的目录下执行的

2、新功能源码与Linux内核源码不在同一目录结构下时

这里就需要一个makefile将其与内核连接起来,代码如下:

ifeq ($(KERNELRELEASE),)
#这里可以选择是编译为x86格式的.ko文件还是arm下的.ko文件
ifeq ($(ARCH),arm)
#此为linux源码的绝对路径
KERNELDIR ?= /home/linux/linux_4422/kernel/linux-3.14 
#此为根目录挂载的路径
ROOTFS ?= /opt/4412/rootfs
else
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
endif
PWD := $(shell pwd)modules:$(MAKE) -C $(KERNELDIR) M=$(PWD) modulesmodules_install:$(MAKE) -C $(KERNELDIR) M=$(PWD) modules INSTALL_MOD_PATH=$(ROOTFS) modules_installclean:rm -rf  *.o  *.ko  .*.cmd  *.mod.*  modules.order  Module.symvers   .tmp_versionselse
CONFIG_MODULE_SIG=n
obj-m += myhello.o //因为我们的功能源码为myhello.c,所以这里是myhello.oendif

我们在源码所在文件夹make后会生成x86下的.ko文件,使用 make ARCH=arm 则会生成arm下的.ko文件。

主机ubuntu下使用ko文件

sudo insmod ./???.ko  #此处为内核模块文件名,将内核模块插入正在执行的内核中运行 ----- 相当于安装插件
lsmod #查看已被插入的内核模块有哪些,显示的是插入内核后的模块名
sudo rmmod ??? #,此处为插入内核后的模块名,此时将已被插入的内核模块从内核中移除 ----- 相当于卸载插件
​
sudo dmesg -C  #清除内核已打印的信息
dmesg #查看内核的打印信息

开发板Linux下使用ko文件

#先将生成的ko文件拷贝到/opt/4412/rootfs目录下:
cp ????/???.ko  /opt/4412/rootfs
​
#在串口终端界面开发板Linux命令行下执行
insmod ./???.ko  #将内核模块插入正在执行的内核中运行 ----- 相当于安装插件
lsmod #查看已被插入的内核模块有哪些
rmmod ??? #将已被插入的内核模块从内核中移除 ----- 相当于卸载插件
​
内核随时打印信息,我们可以在串口终端界面随时看到打印信息,不需要dmesg命令查看打印信息


http://www.ppmy.cn/news/471269.html

相关文章

Java TheadLocal内存泄漏

Java TheadLocal内存泄漏 1、引言 过去&#xff0c;组内来了一个实习生&#xff0c;看这小伙子春光满面、精神抖擞、头发微少&#xff0c;我心头一喜&#xff1a;绝对是个潜力股。为了帮助小伙子快速成长&#xff0c;我给他分了一个需求&#xff0c;这不需求刚上线几天就出网…

数字图像处理(三)

目录 实验六、图像分割方法 实验七、图像识别与分类 实验六、图像分割方法 一、实验目的 了解图像分割技术相关基础知识&#xff1b;掌握几种经典边缘检测算子的基本原理、实现步骤理解阈值分割、区域分割等的基本原理、实现步骤。理解分水岭分割方法的基本原理、实现方法。…

作为超级自动化的重要先驱,流程挖掘正在成为组织运营标配

正在成为组织运营标配的流程挖掘&#xff0c;到底有哪些商业价值&#xff1f; 作为超级自动化的重要先驱&#xff0c;流程挖掘正在成为组织运营标配 文/王吉伟 AIGC正在影响越来越多的行业&#xff0c;流程挖掘领域亦不例外。 Mindzie首先宣布集成生成式AI&#xff0c;使用户…

【0211】tcpdump抓包分析pg_hba.conf以password作为认证证方式下frontend与Backend之间身份验证过程(13)

文章目录 1. 回顾2. pg_hba.conf为password,frontend与Backend如何进行验证2.1 身份认证过程1. 回顾 在前面的几篇文章中,详细讲解了PG数据库在 pg_hba.conf 认证方式为trust下的frontend与Backend进程之间的通信过程。结合抓包方式,分析了Backend进程向frontend、frontend…

[车联网安全自学篇] ATTACK安全之Frida反调试检测

也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 0x01 前言 在开始正式讲反调试之前,我们先来了解一些基础知识 1)什么是逆向?什么又是应用程序篡改技术? 逆向和篡改技术…

ios教程,用pc开发ios游戏

原文是Thomas Henshell对手机游戏Catch the Monkey的开发总结&#xff0c;由Lyra翻译。 传智播客今年6月开始ios培训&#xff08;http://ios.itcast.cn&#xff09;的课程&#xff1b;相对于一些应用&#xff0c;我本人对ios游戏开发更感兴趣&#xff0c;这些开发总结并不拘泥…

selenium自动化教程及使用java来爬取数据

目录 一、介绍二、下载浏览器驱动1.获取要下载的驱动版本号2.下载驱动 三、Maven如下四、简单使用五、定位器1.定位器2.说明(1) class name 定位器(2) css selector 定位器(3) id 定位器(4) name 定位器(5) link text 定位器(6) partial link text 定位器(7) tag 定位器(8) xpa…

MySQL存储引擎之Myisam和Innodb总结性梳理

Mysql有两种存储引擎&#xff1a;InnoDB与Myisam&#xff0c;下表是两种引擎的简单对比 MyISAM InnoDB 构成上的区别&#xff1a; 每个MyISAM在磁盘上存储成三个文件。第一个 文件的名字以表的名字开始&#xff0c;扩展名指出文件类型。.frm文件存储表定义。数据文件的扩 展…