向Linux内核添加新功能的静态加载与动态加载

news2024/12/23 22:12:36

目录

向Linux内核添加新功能的静态加载与动态加载

开发环境:

一、静态加载法

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

2、给新功能代码配置Kconfig

3、给新功能代码改写Makefile

4、使用make menuconfig 在配置界面里将新功能对应的那项选择成<*>

5、使用以下指令重新编译内核

6、使用以下命令将生成的uImage内核镜像文件拷贝到tftp的工作目录下

7、启动开发板观察串口终端中的打印信息即可

二、动态加载法

新功能源码与Linux内核源码在同一个目录结构下(大部分配置流程和静态加载时类似)

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


向Linux内核添加新功能的静态加载与动态加载

开发环境:

Ubuntu18.04
在进行linux驱动开发时,当我们想要向linux内核添加一些新功能时,一般可以采用静态加载和动态加载的方法。以下简要介绍下这两种不同的加载方式及一般流程。

一、静态加载法

所谓静态加载法,即将新功能的源码与内核其它代码一起编译进uImage内核镜像文件内。
内核源码顶层目录:/home/ubuntu/linux-3.14
新功能源码文件名:myhello.c
新功能源码路径和linux内核字符设备驱动的路径:/home/ubuntu/linux-3.14/drivers/char/
1、新功能源码与Linux内核源码在同一个目录结构下
myhello.c文件内容如下:
#include <linux/module.h>
#include <linux/kernel.h>
​
int __init myhello_init(void)
{
    printk("#####################################################\n");
    printk("#####################################################\n");
    printk("#####################################################\n");
    printk("#####################################################\n");
    printk("myhello is running\n");
    printk("#####################################################\n");
    printk("#####################################################\n");
    printk("#####################################################\n");
    printk("#####################################################\n");
    return 0;
}
​
void __exit myhello_exit(void)
{
    printk("myhello will exit\n");
}
MODULE_LICENSE("GPL");
module_init(myhello_init);
module_exit(myhello_exit);
2、给新功能代码配置Kconfig
#进入myhello.c所在目录
cd  ~/linux-3.14/drivers/char
​
vim Kconfig
在配置文件中添加如下内容:
config MY_HELLO
    tristate "This is a hello test"
    help
        This is a test for kernel new function
3、给新功能代码改写Makefile
#进入myhello.c所在目录
cd  ~/linux-3.14/drivers/char
​
vim Makefile
#使用obj指定要编译的对应的.o文件(前面的源文件是.c文件,这里是.c文件所对应的.o文件)
obj-$(CONFIG_MY_HELLO)  += myhello.o
4、使用make menuconfig 在配置界面里将新功能对应的那项选择成<*>
cd  ~/linux-3.14
make menuconfig
注意:
如果使用make menuconfig时出错,一般是以下两个原因:
1. libncurses5-dev没有安装
可以使用以下命令进行安装:
sudo apt-get update
sudo apt-get install libncurses5-dev
2. 命令行界面太小(太矮或太窄或字体太大了)
首先、在界面下找到Device Drivers(设备驱动)。如下图所示:

然后、找到Character devices(字符设备驱动)。如下图所示:

接着、可以找到我们之前添加的源文件myhello.c的配置信息。在对应的配置项前面设置为<*>,如下图所示:

最后,使用左右键选择Exit一步一步的退出,出现如下界面时选择Yes保存配置即可。

5、使用以下指令重新编译内核
make uImage(这里需要提前配置好所使用的交叉编译器,编译出在ARM平台使用的内核镜像文件)
6、使用以下命令将生成的uImage内核镜像文件拷贝到tftp的工作目录下
使用以下命令将生成的uImage内核镜像文件拷贝到tftp的工作目录下,我这里是/tftpboot。
cp arch/arm/boot/uImage /tftpboot
7、启动开发板观察串口终端中的打印信息即可
如下图所示,可以看到我们之前程序源码中的打印信息。这就说明我们向内核中新添加的功能正常运行了。

二、动态加载法

所谓动态加载法,即新功能源码与内核其它源码不一起编译,而是独立编译成内核的插件(被称为内核模块)文件.ko。
动态加载法又可以分为两种情况:
    1、新功能源码与Linux内核源码在同一个目录结构下。
    2、新功能源码与Linux内核源码不在同一个目录结构下。
新功能源码与Linux内核源码在同一个目录结构下(大部分配置流程和静态加载时类似)
1. 给新功能源码配置Kconfig
2. 给新功能代码改写Makefile,Makefile文件如下:
#======================================================================
ifeq ($(KERNELRELEASE),)
​
ifeq ($(ARCH),arm)
KERNELDIR ?= linux内核源码顶层目录的绝对路径
ROOTFS ?= 网络文件系统顶层目录的绝对路径
else
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
endif
PWD := $(shell pwd)
​
modules:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
​
modules_install:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules INSTALL_MOD_PATH=$(ROOTFS) modules_install
​
clean:
    rm -rf  *.o  *.ko  .*.cmd  *.mod.*  modules.order  Module.symvers   .tmp_versions
​
else
​
obj-m += myhello.o
​
endif
​
#注意:
#Makefile里如果没有配置交叉编译工具链,可以在~/.bashrc中进行配置,或者使用export等命令临时配置。
#obj-m用来指定模块名,注意模块名加.o而不是.ko。
#一个目录下的Makefile可以编译多个模块:
#添加:obj-m += 下一个模块名.o
#======================================================================
3. 使用make menuconfig,在配置界面里将新功能对应的那项选择成<M>
4. 使用make uImage重新编译内核
5. 将生成的uImage内核镜像文件拷贝到tftp的工作目录下
    cp arch/arm/boot/uImage /tftpboot
6. 使用make modules命令重新编译内核模块(注意此命令执行前,要保证开发板的内核源码已经被编译)
   make modules命令会在新功能源码的同级目录下生成相应的同名.ko文件
新功能源码与Linux内核源码不在同一目录结构下
内核源码顶层目录:/home/ubuntu/linux-3.14
新功能源码文件名:myhello.c
linux内核字符设备驱动的路径:/home/ubuntu/linux-3.14/drivers/char/
新功能源码路径:/home/ubuntu/mydrivercode
1. cd ~
2. mkdir mydrivercode
3. cd mydrivercode
4. cp  ~/linux-3.14/drivers/char/myhello.c  .   //拷贝之前的myhello测试程序源码
5. vim Makefile
6. make ARCH=arm  (生成的ko文件适用于linux开发板,注意此命令执行前,开发板的内核源码已被编译)
注意:
1、Makefile里如果没有配置交叉编译工具链,可以在~/.bashrc中进行配置,或者使用export等命令临时配置。
2、使用file命令可以查看编译出的ko文件适用于哪种平台,用法:
file  ko文件
输出结果带x86字样的适用于主机ubuntu,带ARM字样的适用于ARM linux开发板。
7、在ARM开发板下加载驱动模块
​
7.1首先将生成的.ko文件拷贝到网络文件系统nfs的工作目录下
cp xxx/xxx.ko  网络文件系统nfs的工作目录
​
7.2然后在开发板上使用mount命令挂载ubuntu主机上的网络文件系统
​
7.3接着使用mobaxterm等软件采用串口连接的方式连接开发板的串口,在其终端下输入:
insmod ./xxx.ko     #将内核模块插入正在执行的内核中运行 ----- 相当于安装插件
lsmod               #查看已被插入的内核模块有哪些
rmmod xxx           #将已被插入的内核模块从内核中移除 ----- 相当于卸载插件
​
内核随时打印信息,我们可以在串口终端界面看到打印信息。
完结。。。

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

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

相关文章

AI商业智能的一些分享

本文主要讲AI商业相关的&#xff08;特别是营销相关的&#xff09;一些知识点&#xff0c;比较零散。 简单总结 AI商业智能&#xff1a; 1&#xff09;将人员经验抽象化为算法规则&#xff0c; 2)打造数据驱动的精益运营能力&#xff0c; 3)长期保持价格竞争力并将商品毛利让…

Java中的重写

package day34; ​ public class Father {String name;int age;public void 输出(){System.out.println("father");} } ​ package day34; ​ public class Son extends Father{Overridepublic void 输出() {System.out.println("son");} } ​ package d…

【LAMMPS学习】八、基础知识(3.8)计算扩散系数

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语&#xff0c;以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…

Spring基础 SpringAOP

前言 我们都知道Spring中最经典的两个功能就是IOC和AOP 我们之前也谈过SpringIOC的思想 容器编程思想了 今天我们来谈谈SpringAOP的思想 首先AOP被称之为面向切面编程 实际上面向切面编程是面向对象的编程的补充和完善 重点就是对某一类问题的集中处理 前面我们写的统一异常管理…

2024接口自动化测试入门基础知识【建议收藏】

接口自动化测试是指通过编写测试脚本和使用相关工具&#xff0c;对软件系统的接口进行自动化测试的过程。 今天本文从4个方面来介绍接口自动化测试入门基础知识 一、接口自动化测试是什么&#xff1f; 二、接口自动化测试流程&#xff1f; 三、接口自动化测试核心知识点有那些…

Linux--uboot移植(二)

修改uboot以匹配开发板的方式有两种&#xff0c;一种是在NXP原厂开发板i.MX 6ULL EVK的文件上进行修改&#xff0c;另一种仿造NXP的开发板文件&#xff0c;添加自己的开发板文件。 为了能更多的了解uboot&#xff0c;我们使用代码改动较大的第二种方式进行uboot的移植。 在修…

HTML5+JavaScript实现语音合成(文字转语音)

HTML5JavaScript实现语音合成&#xff08;文字转语音&#xff09; 本文介绍用HTML5和JavaScript实现语音合成朗读&#xff08;文字转语音&#xff09;。 Web Speech API 有两个部分&#xff1a;SpeechSynthesis 语音合成&#xff08;文本到语音 TTS&#xff09;和 SpeechReco…

双周回顾#009 - 大黄和我

双周回顾#009 - 大黄和我 说一个笑话&#xff0c;被朋友催更了&#xff0c;这就有点尴尬了&#xff01;&#xff01;&#xff01; 最近一个月&#xff0c;把空闲时间都点在了“玩”上&#xff0c;看闲书、玩游戏、背包客。 部落冲突 《埃隆马斯克传》一书中&#xff0c;马斯…

ubunt18.04安装ROS避坑指南

1 前言&#xff1a; 本文是ubunt18.04下安装ros的&#xff0c;如果想使用ros2,请看我的下一篇文章,ubunt18.04安装ROS2 本来是不该写的&#xff0c;有官方文档&#xff0c;还有很多大神的分析。但里面的坑太多&#xff0c;我考虑了一下&#xff0c;还是想记录下避免下次在跳泥…

day06 51单片机-点阵led

1 点阵LED 1.1 需求描述 本案例介绍如何使用点阵LED显示一排由左上到右下的斜线。 1.2 硬件设计 1.2.1 硬件原理图 点阵内部的原理图: 点阵LED的原理也非常简单,就是LED点灯。例如,我们想要让13列(阳极端)9行(阴极端)的LED点亮,需要13为高电平,9为低电平。注意对于…

《王者荣耀》游戏攻略:角色排行榜——墨子

作为天蝎座黄金圣斗士&#xff0c;墨子以他的正义感和荣誉感闻名&#xff0c;一直站在正义的一方&#xff0c;忠于女神雅典娜。他的猩红毒针象征着审判和死亡&#xff0c;而他所施加的十五针“安达里士”更是生命终结的预兆。在冥王再次发动战争之际&#xff0c;墨子追随雅典娜…

ResNet详解

一、认识ResNet ResNet&#xff08;Residual Network&#xff09;是一种深度神经网络结构&#xff0c;被广泛应用于图像分类、目标检测和语义分割等计算机视觉任务中。它是由微软亚洲研究院的何凯明等人于2015年提出的&#xff0c;通过引入残差连接&#xff08;residual conne…

javaScript3

javaScript 一.对象1.概念2.创建对象的三种方法(1).字面量创建&#xff08;利用{}&#xff09;(2)变量、属性、函数、方法的区别(3).new Object创建(4).构造函数 3.new关键字的执行过程4.遍历对象&#xff08;for..in) 二.内置对象 一.对象 1.概念 一组无序的相关属性和方法的…

Pycharm破解流程

1.下载pycharm 网上很多&#xff0c;随便找一个&#xff0c;懒得找的话&#xff0c;或者去我传上去的资源pycharm部分直接取 2.下载文件 文件部分&#xff0c;我放在pycharm文件里面一起 打开下载好的激活包 3.执行脚本 先执行unisntall-all-users.vbs,直接双击打开&#xff0c…

咱们来唠唠2024年参加三下乡社会实践活动怎样联系媒体投稿?

作为一名在校大学生,我深深珍视每一次增长见识、锻炼能力的机会,每年寒暑假期间,我都积极参与学院的“三下乡”社会实践活动。这不仅是我贴近生活、体验基层的大好时机,更是我积累人生经验、拓宽视野的重要途径。每次活动结束后,按照学院的要求,我们需要将实践纪实整理成文,向各…

《神奇女侠3:暗黑之魂》AI制作电影短片(下)

《神奇女侠3&#xff1a;暗黑之魂》AI制作电影短片&#xff08;下&#xff09; 黑暗滋生&#xff0c;世界沦陷&#xff0c;神奇女侠独战群魔&#xff0c;唤醒挚爱&#xff0c;守护最后的光明&#xff01; 《神奇女侠3&#xff1a;暗黑之魂》&#xff08;下&#xff09;故事继续…

Scikit-Learn支持向量机分类

Scikit-Learn 支持向量机分类 1、支持向量机&#xff08;SVM&#xff09;1.1、SVM概述1.2、SVM原理1.3、SVM的损失函数1.4、支持向量机分类的优缺点 2、Scikit-Learn支持向量机分类2.1、Scikit-Learn支持向量机分类API2.2、支持向量机分类初体验&#xff08;手写数字识别&#…

AES和RSA加解密算法学习笔记(实战版)

1. 写在前面 今天整理一篇有关密码学的学习笔记,原因是最近做的一个任务是在网络传输的时候,需要对传输的包进行加密和解密工作,以保证传输过程的安全性。所以,这个过程用到了AES和RSA两个算法。 场景:假设我要给我的老师传送毕设代码和论文, 我已经把代码和论文打成了一…

创新入门|解锁您的潜在市场:探秘付费点击广告(PPC)的秘密武器

在我们的营销领域&#xff0c;按点击付费 &#xff08;PPC&#xff09; 广告是增加流量、提高知名度并最终将点击转化为客户的基石策略。这种有针对性的广告模式&#xff0c;即企业只在点击广告时付费&#xff0c;彻底改变了公司投资在线推广的方式。尽管它看起来很简单&#x…

云打印怎么下单?网上云打印下单教程来了!

近些年来&#xff0c;随着移动互联网的发展&#xff0c;云打印也越来越火热。如今有越来越多的用户选择云打印服务。但是现在仍有很多不知道如何下单。那么云打印怎么下单呢&#xff1f;今天小易就来和大家介绍一下网上云打印的下单教程。 云打印怎么下单&#xff1f;网上云打印…