TinyEMU之Linux Kernel编译

TinyEMU之Linux Kernel编译

  • 1 准备工作
  • 2 安装RISC-V交叉编译器
  • 3 编译Linux Kernel
  • 4 镜像格式转换

本文属于《 TinyEMU模拟器基础系列教程》之一,欢迎查看其它文章。

1 准备工作

我们需要,下载以下内容。

  • 编译好的RISC-V交叉编译器:riscv64-glibc-ubuntu-20.04-nightly-2023.01.31-nightly.tar.gz

  • Linux内核源码:riscv-linux-riscv-linux-4.15.tar.gz

RISC-V交叉编译器,github仓库:https://github.com/riscv-collab/riscv-gnu-toolchain,也可以自己去选择,该仓库Release下其他版本的编译器。我们这里下载的是gcc version 12.2.0。
Linux内核源码,github仓库:https://github.com/riscvarchive/riscv-linux/tree/riscv-linux-4.15,我们这里与TinyEMU例子中,使用的Linux 4.15版本保持一致。

2 安装RISC-V交叉编译器

解压

tar -xvzf riscv64-glibc-ubuntu-20.04-nightly-2023.01.31-nightly.tar.gz

编辑.bashrc

vim ~/.bashrc

将编译器bin路径,加入.bashrc文件末尾

export PATH=/home/tools/riscv-gnu-toolchain-glibc/bin:$PATH

使路径生效

source ~/.bashrc

最后,查看编译器版本,以验证安装

riscv64-unknown-linux-gnu-gcc -v

编译器环境搭建好了。
在这里插入图片描述

3 编译Linux Kernel

解压

tar -xvzf riscv-linux-riscv-linux-4.15.tar.gz

将diskimage-linux-riscv-2018-09-23\patches\config_linux_riscv64,拷贝到riscv-linux-riscv-linux-4.15目录下,并修改文件名为.config。

  • Linux中的.config文件是一个非常重要的配置文件,通常位于内核源码目录下,通过修改.config文件,用户可以启用或禁用某些内核功能,也可以调整各种参数和选项,以适应自己的使用环境。
  • 说白了,就是可以选择哪些模块参与编译,哪些模块不参与编译,可进行功能的裁剪。
  • 执行make defconfig,可生成的.config文件;执行make menuconfig,可以修改.config文件。
  • 这里,我们使用TinyEMU例子中,提供的.config文件,就可以编译出,与例子中同样配置的Linux Kernel。
  • 不知道diskimage-linux-riscv-2018-09-23是什么的,可查看前文《TinyEMU之源码编译与使用》。

使用交叉编译器,来编译Linux Kernel

make ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu- -j64

遇到选择yes/no,默认回车即可。一会就编译完毕了。
在这里插入图片描述
编译完成后,在riscv-linux-riscv-linux-4.15目录下,生成了内核镜像文件:vmlinux。

使用file命令,查看其文件格式,为RISC-V的ELF格式。
在这里插入图片描述

4 镜像格式转换

在diskimage-linux-riscv-2018-09-23/readme.txt中,有明确描述:TinyEMU只支持原始(RAW)boot loader和kernel image。

因此,必须使用以下命令,将ELF格式镜像,转换为RAW格式镜像:

riscv64-unknown-linux-gnu-objcopy -O binary vmlinux kernel.bin

这个kernel.bin,才能在TinyEMU中,被正确加载执行。

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

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

相关文章

边缘计算网关的工作原理及其在工业领域的应用价值-天拓四方

随着物联网技术的快速发展,物联网时代已经悄然来临。在这个时代,数以亿计的设备相互连接,共享数据,共同构建智慧的世界。边缘计算网关通过将计算能力和数据存储推向网络的边缘,实现了对海量数据的实时处理,…

Vue命令式组件的编写与应用

目录 1.引言 2.传统的组件 3.命令式组件 4.命令式组件的应用场景 1.引言 大家好!今天我们来聊聊Vue.js中的一个有趣话题——命令式组件。你有没有觉得,有时候我们在Vue模板里写组件,就像是在玩搭积木,每个积木都有固定的形状…

什么又是线程呢??

线程: 线程可以并发的执行,但是线程的地址是可以共享的 进程与线程的比较: 进程>线程 线程分三种: 用户线程 只有用户程序的库函数来 用户线程 因为操作系统感知不到 线程,如果有线程在运行,然后不交…

Doris基本SQL语句(官方使用指南轻量化)

Doris 采用 MySQL 协议进行通信,用户可通过 MySQL client 或者 MySQL JDBC连接到 Doris 集群。 选择 MySQL client 版本时建议采用5.1 之后的版本,因为 5.1 之前不能支持长度超过 16 个字符的用户名。 #修改root密码 mysql> SET PASSWORD FOR root P…

攻防世界-misc-Make-similar

题目链接:攻防世界 (xctf.org.cn) 下载得到ogg文件。Olympic CTF 2014原题有提示120 LPM,对应Radiofax。需要将ogg格式文件转换成wav格式音频后,用OS X下的软件Multimode转换成单色传真图像: 文字部分为: section 1 of…

【JVM】GCRoot

GC root原理 通过对枚举GCroot对象做引用可达性分析,即从GC root对象开始,向下搜索,形成的路径称之为 引用链。如果一个对象到GC roots对象没有任何引用,没有形成引用链,那么该对象等待GC回收。 可以作为GC Roots的对…

AcWing.505 火柴排队(离散化逆序对)

题目 涵涵有两盒火柴,每盒装有 n  根火柴,每根火柴都有一个高度。 现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为: ∑i1n(ai−bi)2 其中 ai表示第一列火柴中第 i个火柴的…

MQ 延迟队列

MQ 延迟队列 1. 前言 延迟队列是我们日常开发过程中,经常接触并需要使用到的一种技术方案。前些时间在开发业务需求时,我也遇到了一个需要使用到延迟消息队列的需求场景,因此我也在网上调研了一系列不同的延迟队列的实现方案,在…

在SwiftUI中使用Buider模式创建复杂组件

在SwiftUI中使用Buider模式创建复杂组件 我们在前面的博客闲聊SwiftUI中的自定义组件中聊到了如何在SwiftU中创建自定义组件。 在那里,我们创建了一个非常简单的组件RedBox,它将展示内容增加一个红色的边框。 RedBox非常简单,我们用普通的方…

Android Binder机制解析

一 binder介绍: binder机制是一种基于Client-Server架构的IPC(Inter-Process Communication,进程间通信)机制,它允许不同进程之间进行高效的通信和数据交换。Binder机制在Android系统中扮演着至关重要的角色&#xff…

C++:类之六脉神剑——默认成员函数

个人主页:日刷百题 系列专栏:〖C/C小游戏〗〖Linux〗〖数据结构〗 〖C语言〗 🌎欢迎各位→点赞👍收藏⭐️留言📝 ​ ​ 一、默认成员函数 如果一个类中什么成员都没有,简称为 空类 。 空类中真的什么都…

HTTP服务器简单编译测试

目录 登入页面测试 登入测试 根目录请求测试 功能性请求访问测试 GET方法请求测试 POST请求方法测试 PUT方法请求测试 DELETE方法请求测试 本文为承接上文进行简单的测试 登入页面测试 登入测试 根目录请求测试 功能性请求访问测试 GET方法请求测试 POST请求方法测试 P…