#### 编译过程

```
make	# 编译
make run	# 编译且在qemu里运行
```

##### 1 initramfs

```sh
make initramfs
	# $(IMAGE)代表docker镜像,如定义了此变量则直接在镜像里查找initramfs，如没定义此变量则先构建一个docker镜像再在刚构建的镜像里查找initramfs。
	# 在Docker里编译生成busybox, curl, dropbear，制作initramfs，是为了编译环境的统一
```

##### 2 cargo_build

```
cargo +nightly build -Z build-std=core,alloc -Z build-std-features=compiler-builtins-mem --target kernel/arch/x64/x64.json  --manifest-path kernel/Cargo.toml
```

##### 3 裁减

```
cp target/x64/debug/kerla kerla.x64.elf
rust-nm kerla.x64.elf | rustfilt | awk '{ $2=""; print $0 }' > kerla.x64.symbols
python3 tools/embed-symbol-table.py kerla.x64.symbols kerla.x64.elf
rust-strip kerla.x64.elf -o kerla.x64.stripped.elf
```

##### 4 运行

```
python3 tools/run-qemu.py --arch x64 kerla.x64.elf
```



#### 问题汇总

```
# 问题一
# 问题描述：curl timed out
# 原因分析：本地运行那条curl命令没问题，原因未知
# 解决方法：在initramfs/Dockerfile里把相关的命令注释掉。它只是提供一个用户态的程序，所以不编译是没问题的。

# 问题二
# 问题描述：'buildx' is not a docker command.
# 原因分析：buildx子命令似乎不是免费版本的docker的功能
# 解决方法：在Makefile里把buildx直接删除，用build子命令即可

# 问题三
# 问题描述：When using COPY with more than one source file, the destination must be a directory and end with a /
# 原因分析：initramfs/Dockerfile里的语句语法错误
# 解决方法：给对应的bin目录后面加个/

# 问题四
# 问题描述：panicking in constant functions is unstable，说是kernel/arch/x64/address.rs里的debug_assert!(self.0 >= KERNEL_BASE_ADDR)有问题，我把#![feature(const_panic)]加进文件里也没效
# 解决方法：先把那些宏注释掉了。它只是用来验证参数的，把它注释掉了内核也是可以运行的。
```

