内核驱动-如何编译内核以及给内核中添加新文件

news2024/12/27 14:38:15

1.编译内核

         想要编译内核,首先需要先下载内核源代码。可以在官方网站下载源代码压缩包,然后放在Ubuntu的目录下,然后解压(解压的指令为:sudo tar -xvf xxxx.gz)。解压之后在当前目录下可以看到解压之后的文件夹。

        编译步骤:

        1.复制默认配置文件给 .config:在内核源代码中找到适合自己开发板版本的源代码。然后将默认的配置文件复制给.config。在.config文件中存放着关于需要编译文件的配置信息。

                提示:因为Linux内核的功能是很多的,所有有很多的源文件,我们想要根据自己想要实现的功能对那部分功能的代码进行编译即可。所以可以选择需要编译的文件,但是因为整个Linux内核文件的数量是在是太多,我们无法一个一个文件去寻找我们所需要的文件,所以在makefile中关于关于目标文件的写法是:obj-$(CONFIG_TEST)         + = test.o。正常的makefile中是没有这个$(CONFIG_TEST)的。这个就是.config中的配置信息了。在每一层目录下,都有一个Makefile和一个Kconfig.Makefile中存放这该目录下所有文件的这个 obj-$(CONFIG_TEST),而Kconfig就是用来保存这个CONFIG_TEST的。CONFIG_TEST的值为y/n,则表示这个文件是否需要被编译。简单的说就是,makefile中保存所有文件,而文件是否需要被编译则是由Kconfig中的值来决定的。而最终的所有文件的编译与否,都是保存在.config这个文件中的。

        2.通过make menuconfig这个可视化程序来配置哪些文件是需要编译的。退出的时候会保存这配置信息到.config中。

                提示:make menuconfig又被称为内核活地图。若是我们想要修改某个功能,但是不知道这个功能的文件存放在哪个地方,可以在这个里面进行查找,然后就能找到这个文件所在的位置。需要注意的是,若是添加或删除某个Kconfig中的配置信息之后,一定要记得make menuconfig进行保存。还有就是,这个make menuconfig只能在内核的最高目录之下打开。

        3.编译内核:make uImage。

                整个编译的过程是:先生成image映像文件,这个文件是可以直接执行的内核程序。然后是将image文件压缩生成zimage文件。这个是image的压缩文件,这个文件的组成是一段解压程序+压缩后的image文件。最后是将zimage文件加上64字节的头信息后生成uImage文件。我们使用的是带头信息的uImage文件。

                在项目中首次编译的时候,会报错。这个错误是:define(xxxxx)类似这个样子的话。需要在kernel timeconst.pl中去将这一行的内容注释掉。

                在每次将内核编译完成之后,都需要将这个uImage文件复制到 tftpboot文件夹之下。不然开发板每次同构Ubuntu获得的内核程序都是未修改的。

                当将uImage放到tftpboot之后,开发板在运行uboot程序时使用 tftp 0x30008000 uImage将这个内核程序下载到内存上之后,bootm 0x30008000之后会出错,无法正确运行kernel。会出现undefined instruction的错误提示。出现这个问题是因为我们编译之后的uImage程序是包含64字节头信息的内核程序,而我们执行bootm 0x30008000的时候,pc是指向uImage的头信息开始执行的,所以会出现undefined instruction。我们需要让pc从0x30008040开始执行。想要让程序从这里执行,需要在arch/arm/boot/Makefile中修改:

 修改之后重新编译uImage.

2.将文件添加到Linux内核中

        将自己的.c文件放在对应目录下,在该目录下的makefile中添加上该.c文件的obj.然后在Kconfig中添加对应的配置文件。然后在内核文件的最高目录下make menuconfig ,保存配置。然后再编译uImage。

 3.相对跳转/绝对跳转。

        地址相关代码

        地址无关代码

        加载地址;链接地址。

        

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

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

相关文章

java8 双冒号(::)使用方法

双冒号(::)运算符是跟函数式接口相关的运算符,作为函数式接口的赋值操作。 双冒号用于静态方法 使用方法:将类的静态方法赋值给一个函数式接口,静态方法的参数个数、类型要跟函数式的接口一致。调用这个函数式接口就…

数字化转型:别让技术迷了眼,战略觉醒才是关键。新媒体营销大客户销售AIGC大模型创新思维专家培训讲师谈数字化转型商业模式短视频内容社私域数字经济人工智能

​数字化转型从根本上讲不是关于技术,而是关于战略。 数字化转型使用新的数字技术来实现重大的业务改进,如增强客户体验、精简运营或创建新的商业模式。数字化转型描述了一家公司试图为数字时代做好准备的旅程。 数字化转型不是关于技术或获取新的技术技能。事实上,它是关于获得…

永磁同步电机环路反步法(backstepping)控制

文章目录 1、反步控制原理1.1 李雅普诺夫稳定性定理1.2 严格反馈系统1.3 一般设计流程 2、永磁同步电机反步控制2.1 反步控制器设计2.2 反步控制仿真 参考 写在前面:本人能力、时间、技术有限,没有对一些细节进行深入研究和分析,也难免有不足…

简易CPU设计入门:取指令(四)

项目代码下载 还是请大家首先准备好本项目所用的源代码。如果已经下载了,那就不用重复下载了。如果还没有下载,那么,请大家点击下方链接,来了解下载本项目的CPU源代码的方法。 下载本项目代码 准备好了项目源代码以后&#xff…

SOMEIP_ETS_174: SD_Unknown_Option_type

测试目的: 验证DUT能够拒绝一个引用了未知选项类型的SubscribeEventgroup消息,并以SubscribeEventgroupNAck作为响应。 描述 本测试用例旨在确保DUT遵循SOME/IP协议,当接收到一个引用了未知选项类型的SubscribeEventgroup消息时&#xff0…

Solidedge二次开发(C#)-将dft文件转换为dwg格式文件

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1、前言2、在Solid Edge中创建一个par文件3、通过二次开发将dft转换为dwg4、结果显示1、前言 Solid Edge提供了将dft转换为dwg的接口,也即是保存功能。有时在不显示Solid Edge界面的情况下,将其…

【C语言刷力扣】1436.旅行终点站

题目: 解题思路: 两层循环查找,第一次循环中初始化 destination 为 path中每次旅行的终点作为最终的终点。二次循环查找当前 destination ,若是作为某次旅行的起点,说明不是最后的终点。 char* destCity(char ***paths…

[Linux#62][TCP] 首位长度:封装与分用 | 序号:可靠性原理 | 滑动窗口:流量控制

目录 一. 认识TCP协议的报头 1.TCP头部格式 2. TCP协议的特点 二. TCP如何封装与分用 TCP 报文封装与解包 如何封装解包,如何分用 分离有效载荷 隐含问题:TCP 与 UDP 报头的区别 封装和解包的逆向过程 如何分用 TCP 报文 如何通过端口号找到绑…

多功能快捷回复软件

各位亲爱的客服宝宝们,每天面对大量的客户咨询,您是否还在手动一个一个地打字回复呢?别担心,我们为您带来了一款多功能快捷回复软件——客服宝。有了它,您的工作将变得无比轻松! 客服宝是一款集成了内容存储…

网络编程(14)——基于单例模板实现的逻辑层

十四、day14 今天学习如何通过单例模板实现逻辑层 1. 利用C11特性封装单例模板 和上一节设计的单例模板有些不同,本节设计的单例模板利用了以下四个C11新特性,优化了代码 unique_lock和lock_guard once_flag和call_once std::function condition_v…

1打家劫舍三部曲

刷题刷题找工作! s198.打家劫舍 动态规划:开始打家劫舍! dp数组表示到第i家的最高金额 dp递归公式,要么抢劫这家,加上i-2所抢的钱,要么不抢,保留上一家的。 …

linux中的火墙优化策略

1.火墙介绍 1. netfilter 2. iptables 3. iptables | firewalld 2.火墙管理工具切换 在rocky9 中默认使用的是 firewalld firewalld -----> iptables dnf install iptables - services - y systemctl stop firewalld systemctl disable firewalld systemctl mask fi…

Vue3 使用 pinia

什么是Pinia Pinia是 Vue 的存储库,它允许您跨组件/页面共享状态,与vuex功能一样。 准备 安装 npm install pinia 或者 yarn add pinia使用 首先修改main.ts文件 main.ts import ./assets/main.cssimport { createApp } from vue import App from…

HTB:Tactics[WriteUP]

目录 连接至HTB服务器并启动靶机 1.Which Nmap switch can we use to enumerate machines when our ping ICMP packets are blocked by the Windows firewall? 2.What does the 3-letter acronym SMB stand for? 3.What port does SMB use to operate at? 4.What comma…

Comfyui segmentAnythingUltra V2报错

🎅问题表现及解决方案 Comfyui segmentAnythingUltra V2报错,找不到VITMatte模型,这个报错报的比较模糊,所以花了一点时间找模型。 简单来说,到huggingface上: https://huggingface.co/hustvl/vitmatte-s…

麒麟系统串口配置篇

麒麟系统串口配置篇 1.配置串口驱动(编译/动态加载串口) 解压文件夹,然后在解压后的文件夹所在目录,右键选择打开终端,依次执行以下命令: 以麒麟系统下的CH341串口驱动为例,解压CH341SER_LINUX.zip sudo…

【微服务】网关 - Gateway(下)(day8)

网关过滤工厂 在上一篇文章中,主要是对网关进行了一个总体的介绍,然后对网关中的断言进行了一个描述。在这篇文章中,主要是对网关中的最后一大核心——过滤进行介绍。 当客户端发送过来的请求经过断言之后,如果还想在请求前后添…

如何在 MySQL 中处理 BLOB 和 CLOB 数据类型

在 MySQL 数据库中,BLOB(Binary Large Object)和 CLOB(Character Large Object)数据类型用于存储大量的二进制数据和字符数据。本篇文章我们来一起看看如何在 MySQL 中处理 BLOB 和 CLOB 数据类型,并加入如…

7.3美团—Java日常实习面经

7.2晚上投的,发邮件约到了7.3晚上 总时长1小时10分钟左右 自我介绍 拷打项目30min 缓存三兄弟 Redis除了缓存,还能做什么 Redis的数据结构,什么时候用哈希,什么时候用字符串 线程池的执行流程 MySQL索引的数据结构 聚簇索引…

基于PHP+uniapp微信小程序的个性化影视推荐系统的设计54lfb

目录 项目介绍技术栈和环境说明具体实现截图php技术介绍文件解析微信开发者工具HBuilderXuniapp开发技术简介解决的思路性能/安全/负载方面数据访问方式PHP核心代码部分展示代码目录结构解析系统测试详细视频演示源码获取 项目介绍 首先要进行需求分析,分析出电影信…