一文了解riscv软件系列之linux内核编译运行

news2024/11/17 15:36:47

一、交叉编译工具链的安装

【推荐阅读文章】

代码大佬的【Linux内核开发笔记】分享,前人栽树后人乘凉!

一篇长文叙述Linux内核虚拟地址空间的基本概括

一文了解Linux内核的Oops

需要多久才能看完linux内核源码?

详细讲解磁盘及文件系统管理(图例解析)

交叉编译工具链可以通过源码进行编译安装:

1.下载工具链源码: 该仓库包含多个submodules,因此需要添加 --recursive 选项来下载所有子模块的代码

$ git clone --recursive https://github.com/riscv/riscv-gnu-toolchain

或者:

$ git clone https://github.com/riscv/riscv-gnu-toolchain
$ cd riscv-gnu-toolchain
$ git submodule update --init --recursive

2.安装编译依赖

为了编译该工具链,先安装如下工具:

  • Ubuntu:
sudo apt-get install autoconf automake autotools-dev curl python3 libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev
  • Fedora/CentOS/RHEL:
 sudo yum install autoconf automake python3 libmpc-devel mpfr-devel gmp-devel gawk  bison flex texinfo patchutils gcc gcc-c++ zlib-devel expat-devel 

3.编译

为了同时支持32位系统和64位系统,我们编译支持两种系统的交叉编译工具链:

$ ./configure --prefix=/opt/riscv --enable-multilib
$ make linux

编译后,我们的交叉编译工具链就被安装到/opt/riscv目录下。工具链的前缀为 riscv64-unknown-linux-gnu-,能同时支持32-bit和64-bit系统。

4.配置工具链的路径

将/opt/riscv添加到系统搜索路径(这里自己去添加,就不演示了)。

为了简便,我们可以使用sifive编译好的交叉编译工具链,直接下载就好:

  • window版本:http://static.dev.sifive.com/dev-tools/r…
  • linux版本(ubuntu):http://static.dev.sifive.com/dev-tools/r…
  • linux版本(centos):http://static.dev.sifive.com/dev-tools/r…

二、编译linux内核

下载linux 5.2.4源码(可以选择其他实现了riscv的内核版本),进入linux内核根目录(以后用'linux-5.2.4$' 作为linux内核根目录的提示符),如下:

 linux-5.2.4$
 linux-5.2.4$

配置riscv内核选项

  1. 为了配置的方便,我们先试用riscv的默认配置选项,然后再在此基础上进行配置的修改:
linux-5.2.4$ make ARCH=riscv defconfig

执行该命令后,会将 linux-5.2.4/arch/riscv/configs/defconfig拷贝到linux-5.2.4/.config。

2.配置内核选项

linux-5.2.4$ make ARCH=riscv menuconfig

我们不做任何修改直接保存退出,采用系统提供的默认配置。默认采用的是riscv 64位系统配置。

3.编译linux内核

linux-5.2.4$ make ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu-

我系统中已经编译制作好riscv的交叉编译工具链,交叉编译工具链的前缀为riscv64-unknown-linux-gnu-,因此,我们在编译riscv64平台的linux内核时,需要添加CROSS_COMPILE=riscv64-unknown-linux-gnu- 选项。

编译完成后,在linux-5.2.4/arch/riscv/boot目录下就能找到编译后的内核镜像,分别为Image和Image.gz

三、根文件系统制作

  1. 下载busybox:

curl -L http://busybox.net/downloads/b… >busybox-1.26.2.tar.bz2

  1. 编译riscv版本busybox
  • 解压后,进入busybox根目录进行配置:
busybox-1.26.2$ make menuconfig

在Bosybox Settings 选项下:

勾选上Build BusyBox as a static binary (no shared libs): [*] Build BusyBox as a static binary (no shared libs)

如果选择Build BusyBox as a static binary (no shared libs)方式进行编译时,所需的库已经与程序静态地链接在一起,这些程序不需要额外的库就可以单独运行,但是自己编写的程序在文件系统上运行必须采用静态编译,否则会报诸如:bin/sh: hello :not found的错误。

静态编译如:
riscv64-unknown-linux-gnu-gcc –static hello.c –o hello
配置交叉编译工具链的前缀(riscv64-unknown-linux-gnu-) Cross Compiler prefix:

这里我的工具链前缀为risc64-unknown-linux-gnu-,配置为这个前缀后,在编译时就不用再选择编译平台以及编译的工具链。

  • 编译busybox busybox-1.26.2$ make 编译完成后,生成的文件都在busybox-1.26.2/_install目录下

3.制作根文件系统镜像

  • 先制作128M大小的镜像文件
$ dd if=/dev/zero of=rootfs.img bs=1M count=128 
  • 将镜像文件格式化为ext4文件系统
 $ mkfs.ext4 rootfs.img 
  • 挂载rootfs.img
 $ sudo mount -o loop rootfs.img /mnt
  • 创建文件系统结构
进入/mnt
$ cd /mnt
创建常见文件夹
$ sudo mkdir dev mnt proc var tmp sys root lib

注意: 可能需要改变一下权限才能执行创建文件的操作(mnt默认为root权限)。

拷贝busybox生成的文件到该目录下 busybox生成文件的路径为: /home/caipengxiang/software/linux-kernel/busybox-1.26.2/_install/
$ sudo cp -av /home/caipengxiang/software/linux-kernel/busybox-1.26.2/_install/* ./
将busybox可执行文件生成init软连接
$ sudo ln -s bin/busybox init

执行完以上命令后,/mnt的目录结构如下:

  • 添加配置文件 我们使用busybox提供的example对跟文件系统进行配置
 sudo cp -av /home/caipengxiang/software/linux-kernel/busybox-1.26.2/examples/bootfloppy/etc etc 

修改文件系统挂载配置,修改etc/fstab内容如下:

#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
proc            /proc   proc    defaults    0   0
sysfs           /sys    sysfs   defaults    0   0
tmpfs           /var    tmpfs   defaults    0   0
tmpfs           /tmp    tmpfs   defaults    0   0
tmpfs           /dev    tmpfs   defaults    0   0
系统启动参数设置,修改etc/init.d/rcS文件:
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
mount -a
mdev -s
  • 卸载rootfs.img
$ sudo umount /mnt

卸载完rootfs.img后,我们的根文件系统镜像文件rootfs.img也就制作完成。

四、qemu模拟器运行linux内核

  1. 当前qemu已支持对riscv的模拟。为了方便,我们直接使用sifive官网提供的qemu模拟器,该模拟器是已经编译好了的压缩包,解压即可使用。

windows版本:http://static.dev.sifive.com/dev-tools/r…
linux版本(ubuntu):http://static.dev.sifive.com/dev-tools/r…
linux版本(centos):http://static.dev.sifive.com/dev-tools/r…

当然,我们也可以直接通过qemu的源码来编译riscv的模拟器,有兴趣的同学可以自己尝试。

2.运行linux

linux-5.2.4$ qemu-system-riscv64 -machine virt -m 256M -nographic -bios default -kernel ./Image -drive file=./rootfs.img,format=raw,id=hd0 -device virtio-blk-device,drive=hd0 -append "root=/dev/vda rw console=ttyS0"

运行起来的结果如下(此图时我在windows下运行的截图):

  • qemu 默认支持OpenSBI的bios,该bios会为我们引导内核的加载,-bios default该选项就是使用默认OpenSBI的bios。
  • Image为我们的内核镜像
  • rootfs.img为跟文件系统镜像

结束语

至此:我们就完成了内核的配置,编译,文件系统的编译等工作,并且成功运行了linux系统。

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

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

相关文章

【antd vue pro】设置项目默认语言为中文:

文章目录一、官网文档&#xff1a;二、解决&#xff1a;1、在src\locales\index.js文件修改默认语言2、src\core\bootstrap.js文件&#xff0c;修改初始化的语言3、src\store\modules\app.js4、清空本地存储&#xff0c;然后npm run serve重启&#xff1a;5、遇到问题&#xff…

Linux文件权限管理:chomd命令和chown命令

Linux文件权限管理&#xff1a;chomd命令和chown命令前言介绍文件类型文件权限文件所属文件信息chomd命令chown命令前言 在服务器部署项目、安装应用会经常涉及到文件权限的问题&#xff0c;在此记录chomd命令和chown命令它们的用法及区别。 介绍 以下图为例&#xff0c;进行…

如何解决全局工业相机飞拍拖影问题

1.问题描述: 物体静态拍摄时图像正常&#xff0c;但是动态拍摄时会有拖影现象。 2.问题原因&#xff1a; 只要物体存在运动&#xff0c;拍摄就一定会存在拖影&#xff0c;那么如何判断飞拍项目能否使用&#xff1f;拖影是否会对飞拍造成影响呢&#xff1f;这就要看具体的检测…

Viterbi维特比译码误码率仿真,调制为QPSK,信道为高斯白噪声

目录 1.算法描述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法描述 整体思路如图1中所示&#xff0c; 其中输入序列使用randn函数来产生&#xff0c;卷积也采用matlab本身的函数conv&#xff0c;加性高斯白噪声用wgn函数来产生&#xff0c;由于实验的重点…

世上最全NVDIA GPU参数列表: 3090,4090, A40, A30,V100, A100, A800性能参数

-1&#xff09;GeForce RTX 4090 GeForce RTX 4090 GPU 引擎规格&#xff1a;NVIDIA CUDA 核心数量16384加速频率 (GHz)2.52基础频率 (GHz)2.23显存规格&#xff1a;标准显存配置24 GB GDDR6X显存位宽384 位技术支持&#xff1a;Ray Tracing Core第 3 代Tensor Cores第 4 代N…

CRDB-多区域部署

多区域部署允许cockachdb数据库跨越多个地理区域。多区域部署的配置对集群的容错和区域性能有影响。一般来说&#xff0c;我们将一个cockachdb集群配置为多个区域&#xff0c;以实现以下两个目标中的一个或两个&#xff1a; 允许集群在其中一个区域的计算资源不可用时继续服务…

磨金石教育摄影技能干货分享|花朵怎样拍才能不凌乱

喜欢养花种花的朋友&#xff0c;除了享受花朵在自己精心培育下绽放之外&#xff0c;给爱花拍照发在朋友圈炫耀也是一大乐趣之一。 但是别看花朵静静地盛开&#xff0c;娇艳欲滴&#xff0c;想要拍得好看却不是一件容易的事。作为摄影小白常常遇到的情况就是&#xff0c;拍出的花…

即兴发言怎样避免语无伦次?记住这个即兴发言万能公式

作为PMO和项目经理&#xff0c;经常要组织和参与各种会议&#xff0c;在会议中难免需要即兴发言&#xff0c;但是很多人即兴发言时总语无伦次&#xff0c;不知所云&#xff0c;而PMO和项目经理又是依靠外在表现来体现自己的专业性的&#xff0c;这时候就很难获得被人的认可&…

Docker Desktop Installer 安装无反应的,如何解决?

docker教程 Docker 教程 | 菜鸟教程 下载地址&#xff1a; Docker Desktop 官方下载地址&#xff1a; Install on Windows | Docker DocumentationHow to install Docker Desktop for Windowshttps://docs.docker.com/desktop/install/windows-install/ 问题&#xff1a;出…

webpack

webpack一、前端工程化1、前端开发历程2、什么是前端工程化3、前端工程化的解决方案二、webpack的基本使用1、什么是webpack2、列表隔行变色例子3、安装和配置webpack1.安装webpack2.配置webpack4、webpack.config.js的作用5、配置webpack.config.js自定义打包入口和出口三、we…

乘用车排气系统流场的数值模拟

目 录 摘 要 I Abstract II 第1章 绪论 1 1.1 课题背景及意义 1 1.2 国内外研究现状 1 1.3 课题主要研究内容 2 第2章 流体力学及流场分析软件的介绍 4 2.1 概述 4 2.2 流体力学及应用现状 4 2.3 Solidworks软件的应用范围 5 2.4 Flow Simulation 软件简介 5 第3章 排气系统理论…

软件测试的行业现状,我们的未来在哪里?

1.现状 1.1建立软件测试团队的公司规模 可看出主要当前是以中小型公司为主&#xff0c;因为大厂毕竟就那么几个&#xff0c;数量少。 1.2软件测试团队的规模 可看出主要目前的软件测试团队主要是以50人以内的团队为主(外包除外)。 1.3各公司软件测试工作的规范程度 可看出大…

优化器scipy.optimize参考指南

原文&#xff1a;https://mp.weixin.qq.com/s/BDHXQHXSzDk-RTi-VNMNEw 1 scipy.optimize简介 该scipy.optimize包提供几种常用的优化算法。 该模块包含&#xff1a; 1、使用多种算法&#xff08;例如BFGS&#xff0c;Nelder-Mead单形&#xff0c;牛顿共轭梯度&#xff0c;C…

在线预约系统开发的用途_分享在线预约小程序的作用

在微信小程序上进行在线预约&#xff0c;不管是商家还是顾客&#xff0c;都可以自由选择时间&#xff0c;顾客还可以通过预约小程序&#xff0c;了解到所选服务的详情和功能特色&#xff0c;不必等到去店内听介绍&#xff0c;顾客能节省等候时间&#xff0c;商家能解放招待人力…

【34-业务开发-基础业务-属性组和基本属性-属性组和基本属性建立关联-属性组和基本属性解除关联-未关联属性查询-确认新增】

一.知识回顾 【0.三高商城系统的专题专栏都帮你整理好了&#xff0c;请点击这里&#xff01;】 【1-系统架构演进过程】 【2-微服务系统架构需求】 【3-高性能、高并发、高可用的三高商城系统项目介绍】 【4-Linux云服务器上安装Docker】 【5-Docker安装部署MySQL和Redis服务】…

【动手学深度学习】权重衰减(含Pytorch从零开始实现的源代码)

目录&#xff1a;权重衰减一、理论知识二、高维线性回归的实现步骤2.1 准备数据2.2 初始化模型参数2.3 定义L2L_2L2​范数惩罚2.4 定义训练代码实现2.5 是否加入正则化2.5.1 忽略正则化2.5.2 加入正则化三、简单实现四、源代码一、理论知识 前面我们已经介绍学习了过拟合的问题…

从发现问题到创造价值 数据智能如何助力商家双11高质量增长?

近年来&#xff0c;随着消费者的购买行为趋于多样化&#xff0c;很多品牌商家开始布局多平台及多渠道的经营&#xff0c;但随之也带来跨平台多渠道经营的数据不互通、生意数字难以追踪的难题。许多商家也借助双11等大促节点&#xff0c;围绕线下和线上开展全域营销&#xff0c;…

[附源码]java毕业设计宿舍管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Bio-Helix丨Bio-Helix艾美捷100bp DNA ladder说明书

Bio-Helix艾美捷100bp DNA ladder (11条条带&#xff0c;100-1,500pb)背景&#xff1a; PCR产物和许多专有质粒的独特组合&#xff0c;用适当的限制性酶消化&#xff0c;产生11个片段&#xff0c;适合用作琼脂糖凝胶电泳的分子量标准。DNA包括100-1500个碱基对的片段。500和15…

【Java开发】 Spring 05 :Project Reactor 响应式流框架(以Reactive方式访问Redis为例)

响应式编程基于 Project Reactor&#xff08;Reactor 是一个运行在 Java8 之上的响应式框架&#xff09;的思想&#xff0c;当你做一个带有一定延迟的才能够返回的 IO 操作时&#xff0c;不会阻塞&#xff0c;而是立刻返回一个流&#xff0c;并且订阅这个流&#xff0c;当这个流…