前几天正好看见一本新书出来了,叫做《自研操作系统:DIM-SUM的设计与实现》。作者是一位工作二十多年的行业大牛,我平时也对操作系统十分感兴趣,但又屡次被linux内核的复杂度劝退。我决定买下来试试看。 该操作系统运行在arm64上,我们可以使用qemu来模拟运行环境。 我平时用的比较多的是archlinux,因此我将在archlinux下部署环境。 首先是前置准备工作: 首先qemu相关组件需要安装。

1
# pacman -S qemu qemu-arch-extra 

dim-sum使用了virtio系列的驱动来进行硬件的虚拟化,virtio有关内容见archwiki ​qemu 先说说我踩的坑,我遇到的问题是网络相关问题,有个叫/etc/qemu-if的脚本报错 256 status code。 经过一段时间的摸索和阅读archwiki,我找到了解决方案。

  • 首先:安装bridge-utils,目的是获取brctl命令
  • 开启ipv4 转发,我使用sysctl临时启用的,因为不想一直开着这个选项。大家嫌麻烦可以在配置文件中写好后重载设置。
  • 加载 tun 内核模块创建一个网桥br0
  • 最后创建脚本后修改用户和权限就ok了
1
2
3
4
5
    # pacman -S bridge-utils
    # sysctl net.ipv4.ip_forward=1
    # modprobe -a tun
    # ip link add name br0 type bridge
    # 

下面是创建的脚本和内容:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
/etc/qemu-ifup

#!/bin/sh

echo "Executing /etc/qemu-ifup"
echo "Bringing up $1 for bridged mode..."
sudo /usr/bin/ip link set $1 up promisc on
echo "Adding $1 to br0..."
sudo /usr/bin/brctl addif br0 $1
sleep 2


/etc/qemu-ifdown

#!/bin/sh

echo "Executing /etc/qemu-ifdown"
sudo /usr/bin/ip link set $1 down
sudo /usr/bin/brctl delif br0 $1
sudo /usr/bin/ip link delete dev $1

最后修改权限和用户组

1
2
3
4
# chmod 750 /etc/qemu-ifup
# chmod 750 /etc/qemu-ifdown
# chown root:kvm /etc/qemu-ifup
# chown root:kvm /etc/qemu-ifdown

使用visudo加入如下内容:

1
2
Cmnd_Alias      QEMU=/usr/bin/ip,/usr/bin/modprobe,/usr/bin/brctl
%kvm     ALL=NOPASSWD: QEMU

后面就是拉源码然后编译运行了。

这里我们可以使用gcc10而不是附带的编译器进行编译

1
 # pacman -S aarch64-linux-gnu-gcc aarch64-linux-gnu-gdb

修改Makefile kernel 部分,像这样:

1
CROSS_COMPILE=aarch64-linux-gnu- Image dtbs

最后gcc10会有两个位置编译报错,类似这样(把他注释掉):

1
#include gcc_header(__GNUC__)

最后编译,享受!