前几天正好看见一本新书出来了,叫做《自研操作系统: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__)
|
最后编译,享受!