M1 macbook上安装docker 编译内核 并使用qemu启动内核。

一、编译内核并通过qemu启动内核

1、在M1上安装docker这个就不用提供步骤了,网上自行搜索。

2、在M1上pull一个ubuntu的容器。docker pull ubuntu:18.04

docker images
REPOSITORY               TAG       IMAGE ID       CREATED        SIZE
ubuntu                   18.04     d1a528908992   4 weeks ago    56.7MB

3、通过拉取的ubuntu镜像启动一个容器,相当于运行了一个ubuntu虚拟机

docker run -d -t -i -p 5002:22 --hostname mycontainer --name mycontainer --privileged=true ubuntu:18.04 /bin/bash

进入容器:

4、下载内核kernel源码linux-5.13.18

wget http://ftp.sjtu.edu.cn/sites/ftp.kernel.org/pub/linux/kernel/v5.x/linux-5.13.18.tar.gz

5、安装一些依赖包

apt-get install vim git tmux openssh-server tar -y apt install build-essential flex bison libssl-dev libelf-dev libncurses-dev -y

配置内核

make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 O=build menuconfig -j16

6、编译内核

make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 O=build -j16

编译成功后在build/arch/arm64/boot/目录下会生成内核镜像文件

file build/arch/arm64/boot/Image

7、制作内核启动根文件系统,通过busybox制作

下载busy box源码,编译busy box工具

wget https://busybox.net/downloads/busybox-1.35.0.tar.bz2

tar xvf busybox-1.35.0.tar.bz2

配置编译选项,要设置Build static binary (no shared libs)

make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 menuconfig -j16

在图形化界面勾选以下配置 Settings [*] Build static binary (no shared libs)

编译busy box:

make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 install -j16

编译成功后会在_install/bin/目录下生成busybox。

file _install/bin/busybox

然后执行以下步骤制作根文件系统

cd busybox-1.35.0/_install

mkdir dev

mknod dev/console c 5 1

mknod dev/ram b 1 0

touch init

这里其实就是在_install目录下通过的 mknode 分别创建了一个面向块设备和一个面向字符设备的特殊文件。相当于在系统的根文件系统目录下有一些这些目录。

然后打开init文件写入这些信息

#!/bin/sh
echo "INIT SCRIPT"
mkdir /proc
mkdir /sys
mount -t proc none /proc
mount -t sysfs none /sys
mkdir /tmp
mount -t tmpfs none /tmp
echo -e "\nThis boot took $(cut -d' ' -f1 /proc/uptime) seconds\n"
exec /bin/sh

然后通过下面命令生成rootfs

# 首先为 init 赋予可执行权限
$ sudo chmod +x init
# 进入 busybox 编译成果目录
cd ~/kvm/busybox-1.32.1/_install
# 使用 cpio 制作成 rootfs,为区分方法一,这里使用另一个名称并压缩
find . -print0 | cpio --null -ov --format=newc | gzip -9 > ./initramfs-busybox-arm64.cpio.gz
# 注意:该命令一定要在busybox的 _install 目录下执行
# 注意:每次修改_install,都要重新执行该命令

8、在容器中下载编译qemu

wget https://download.qemu.org/qemu-7.2.0-rc1.tar.xz
tar xvf qemu-7.2.0-rc1.tar.xz
cd qemu-7.2.0-rc1 
mkdir build 
cd build 
../configure --target-list=aarch64-softmmu make -j16 file aarch64-softmmu/qemu-system-aarch64

将initramfs-busybox-arm64.cpio.gz文件拷贝到/test/qemu-7.2.0-rc1/build/aarch64-softmmu/目录下。

将之前编译好的内核镜像也拷贝到/test/qemu-7.2.0-rc1/build/aarch64-softmmu/目录下。

9、通过qemu运行内核

./qemu-system-aarch64 -nographic -M virt -cpu cortex-a57 -kernel ./Image -initrd ./initramfs-busybox-arm64.cpio.gz --append "nokaslr root=/dev/ram init=/init"

 系统启动了,停留在了一个命令行界面,同时可以查看到系统内核是5.13.18版本,这样实现了在容器中使用qemu把内核5.13.18跑起来了。

二、单步调试内核kernel

1、安装cgbd 这样可以可视化调试

# apt install cgdb

qemu按照调试模式启动内核

# ./qemu-system-aarch64 -nographic -M virt -cpu cortex-a57 -kernel ./Image -initrd ./initramfs-busybox-arm64.cpio.gz --append "nokaslr root=/dev/ram init=/init" -s -S

  • 在调试模式下启动qemu,其中“-s”选项表示:使用tcp 1234端口;“-S”选项表示只有在GDB连上tcp 1234端口后,CPU才会继续执行。

此时启动qemu的窗口会hang住,此时在启动一个CMD窗口。运行内核镜像文件

root@ubuntu:/test/linux-5.13.18/build# cgdb vmlinu

  • 在GDB命令中输入“target remote localhost:1234”

 这样就可以单步调试内核了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值