首页 > 系统相关 >编译linux riscv64 内核

编译linux riscv64 内核

时间:2022-10-26 03:44:05浏览次数:67  
标签:riscv64 __ cd 内核 linux qemu DIR

文档说明:只记录关键地方;
试验环境: linux debian 11
基础软件: qemu 6.2
目标:编译linux riscv64 内核 并用qemu-riscv64启动

环境准备

#!/bin/bash
set -exu

__DIR__=$(
  cd "$(dirname "$0")"
  pwd
)
cd ${__DIR__}

test ! -f /etc/apt/source.list.save && cp  /etc/apt/sources.list /etc/apt/sources.list.save
sed -i "[email protected]@mirrors.ustc.edu.cn@g" /etc/apt/sources.list 
sed -i "[email protected]@mirrors.ustc.edu.cn@g" /etc/apt/sources.list

apt update -y && apt install -y git curl python3 python3-pip python3-dev
apt install -y libssl-dev ca-certificates  make cmake gcc g++ zip

apt install -y tcpdump nmap traceroute net-tools dnsutils iproute2 procps iputils-ping rsync


apt install -y qemu qemu-system qemu-system-riscv64
apt install -y gcc-riscv64-linux-gnu binutils-riscv64-linux-gnu

apt install -y sudo
apt install -y flex bison bc libncurses5-dev libncursesw5-dev cpio

下载linux

#!/bin/bash
set -exu
 
__DIR__=$(cd "$(dirname "$0")";pwd)
cd ${__DIR__} 

test -d linux/.git && git -C linux  pull  --depth=1 --progress  --rebase=true 
test -d linux/.git || git clone https://mirrors.tuna.tsinghua.edu.cn/git/linux.git --depth=1 --progress


if [ ! -d busybox ] ;then
{
    git  clone  -b master https://github.com/mirror/busybox.git  --depth=1  --progress
} else {
    git   -C busybox pull origin master   --progress --depth=1  --rebase=true
}
fi

prepare-riscv64-image.sh


#!/bin/env bash

set -eux

__DIR__=$(cd "$(dirname "$0")";pwd)
cd ${__DIR__}

export DEBIAN_FRONTEND=noninteractive



cpu_numbers=`grep "processor" /proc/cpuinfo | sort -u | wc -l`
build_target_dir=`readlink -f  ${__DIR__}/build/`

echo build_target_dir
build_dir=`readlink -f  ${__DIR__}/../`


qemu-system-riscv64 --version
riscv64-linux-gnu-gcc --version
riscv64-linux-gnu-gcc -v


cd ${build_dir}/linux

test -f arch/riscv64/boot/Image && rm -rf arch/riscv64/boot/Image

make ARCH=riscv CROSS_COMPILE=riscv64-linux-gnu- defconfig
make ARCH=riscv CROSS_COMPILE=riscv64-linux-gnu- Image -j $cpu_numbers


cd ${build_dir}/busybox
test -d _install && rm -rf _install

# 参考
# 参考 https://zhuanlan.zhihu.com/p/258394849

# 打开配置菜单后进入第一行的 "Settings",
# 在"Build Options"节中,选中 “Build static binary (no shared libs)”,设置好后退出保存配置。
test -f ${build_dir}/busybox/.config && make oldconfig
test -f ${build_dir}/busybox/.config || make menuconfig
make -j $cpu_numbers && make install

cd ${build_dir}/busybox/_install

mkdir dev etc lib sys proc tmp var home root mnt
mkdir -p /sys/dev
cd dev
sudo mknod console c 5 1
sudo mknod null c 1 3

sudo mknod tty1 c 4 1
sudo mknod tty2 c 4 2
sudo mknod tty3 c 4 3
sudo mknod tty4 c 4 4


cd ${build_dir}/busybox/_install
cd etc
cat <<EOF | tee profile
#!/bin/sh
export HOSTNAME=dev
export USER=root
export HOME=/home
export PS1="[$USER@$HOSTNAME \W]\# "
PATH=/bin:/sbin:/usr/bin:/usr/sbin
LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH
export PATH LD_LIBRARY_PATH
EOF


cd ${build_dir}/busybox/_install

cd etc
cat <<EOF | tee inittab

#this is run first except when booting in single-user mode.
::sysinit:/etc/init.d/rcS

#/bin/sh invocations on selected ttys
#Start an "askfirst" shell on the console(whatever that may be)
#::askfirst:-/bin/sh
::respawn:-/bin/sh

#Stuff to do when restarting the init process
::restart:/sbin/init

#Stuff to do before rebooting
::ctrlaltdel:/sbin/reboot


EOF
cat <<EOF | tee fstab
#device  mount-point    type     options   dump   fsck order
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0


EOF

cd ${build_dir}/busybox/_install
cd etc
mkdir -p init.d
cd init.d
touch rcS
cat <<EOF | tee rcS
#!/bin/sh

#This is the first script called by init process
/bin/mount -a
mdev -s
ip  addr add 127.0.0.1/8 dev lo
ip  link set lo up
#ip  link set  eth0 down
#ip  link set  eth0 up
busybox --help
#udhcpc eth0
EOF

chmod +x rcS

cd ${build_dir}/busybox/_install
#cp -p /usr/riscv64-linux-gnu/lib/* ./lib

cd ${build_dir}/busybox/_install
mkdir -p usr/share/udhcpc/
cp ../examples/udhcp/simple.script usr/share/udhcpc/default.script
chmod 755 usr/share/udhcpc/default.script


test -d ${__DIR__}/build || mkdir -p ${__DIR__}/build
test -f ${build_dir}/rootfs.cpio.gz && rm -rf ${build_dir}/rootfs.cpio.gz
find . | cpio -o -H newc |gzip >  ${__DIR__}/build/rootfs.cpio.gz
cp -f  ${build_dir}/linux/arch/riscv/boot/Image ${__DIR__}/build/Image
cd ${__DIR__}



start-qemu-riscv64.sh

#!/bin/env bash

set -eux

__DIR__=$(cd "$(dirname "$0")";pwd)
cd ${__DIR__}

qemu-system-riscv64 -M help
qemu-system-riscv64  -cpu  help

qemu-system-riscv64 -device help
qemu-system-riscv64 -netdev help
#qemu-system-riscv64 -nic model=help
#qemu-system-riscv64 -M virt  -nic model=help
pwd
ls -lh  ${__DIR__}/build/
qemu-system-riscv64 \
-machine virt \
-m size=1024M \
-cpu rv64 \
-kernel ${__DIR__}/build/Image \
-initrd ${__DIR__}/build/rootfs.cpio.gz \
-append "console=ttyS0 rdinit=/linuxrc" \
-nographic \
-nic user,model=virtio-net-pci \
-device virtio-net-device,netdev=net0 \
-netdev user,id=net0,hostfwd=tcp::10000-:22

关闭qemu

#!/bin/env bash

set -eux

__DIR__=$(cd "$(dirname "$0")";pwd)
cd ${__DIR__}

pid=$(ps -ef | grep  'qa-config/qemu/qemu-riscv64/' | grep -v 'grep' | awk '{print $2}')
kill -15 $pid

参考文档

  1. 在 QEMU 上运行 RISC-V 64 位版本的 Linux
  2. linux 镜像

标签:riscv64,__,cd,内核,linux,qemu,DIR
From: https://www.cnblogs.com/jingjingxyk/p/16827006.html

相关文章

  • Linux安装多个CUDA版本可切换
    参考https://blog.csdn.net/tangjiahao10/article/details/125228143服务器的cuda版本比较老,需要更新,但很多人用的都是老版本cuda的代码,所以装个可切换的新版本。注意到1......
  • Linux基础知识一
    Linux基础知识一Linux目录结构/bin:Binaries,存放的都是二进制文件,包括一些常用的命令,例如:ls、cat/boot:存放系统内核和启动需要的文件,Linux的核心文件。/dev:存放......
  • 内核
    一、什么是内核?内核是操作系统中应用连接硬件设备的桥梁二、内核有什么作用?对于一个现代的操作系统来说,它的内核至少应该提供以下4种基本能力:管理进程、线程(决定哪个进程......
  • (六)Linux系统IO函数
    1open打开文件打开文件intopen(constchar*pathname,intflags);创建文件intopen(constchar*pathname,intflags);关闭文件intclose(intfd);不是重载,C......
  • LINUX第六节课
    VIM编辑器在linux中,皆于“一切都是文件”通过vim可以配置文件调整里面的内容来修改一些网卡,配置软件仓库,还有主机名等信息,还有其他的一些服务也可通过vim进行修改其中在vim......
  • linux下安装jdk步骤
    inux下安装jdk,都是下载压缩包解压,配置环境变量等步骤。这里记录一下安装1.8版本的过程,方便下次查阅。1.创建java安装目录mkdir-pjava/jdk2.下载jdk压缩包切换到jdk目......
  • linux下安装mysql5.7,实测成功
    1、下载MySQL包1)官网下载(可忽略)这里选择linux通用版本,MySQL5.7.28--64位   将压缩包通过ftp或其他方式传送至服务器上2)yum直接下载[root@A11home]#wget http......
  • linux配置免密钥登录
    1.ssh命令在linux中,可以通过ssh命令来登录另一台服务器。打开两台linux虚拟机,一台Linux01的ip为192.168.226.128,另一台linux02为192.168.226.129,开机后在linux01终端输入......
  • linux 多个php版本切换环境默认版本
    原版本为php7.2.18#找到php的位置whereisphp#删除默认版本rm-rf/usr/bin/php#创建软连接ln-sf/usr/local/php74/bin/php/usr/bin/php#查看php-v ......
  • linux LVS的NAT工作模式
    LVS:lvs是一个负载均衡的一个集群软件,由内核集成,性能强大,支持百万计并发。LVS集群的相关概念:VS:虚拟服务器,指LVS服务器自身RS:提供服务的服务器CIP:客户端ip地址......