# ArchLinux 搭建 MIT 6.S081 环境

# 环境搭建

最近打算通过MIT 6.s081深入学习下操作系统，因为我自己本身使用的是ArchLinux，所以就不用通过服务器或者虚拟机的方式搭建环境了，直接在本机终端上运行就行了。其实Arch上环境搭建比较简单，官网就有。

[mit 6.s081官网](https://pdos.csail.mit.edu/6.S081/2020/tools.html)

只需要一步就能安装好。

```bash
sudo pacman -S riscv64-linux-gnu-binutils riscv64-linux-gnu-gcc riscv64-linux-gnu-gdb qemu-arch-extra
```

但是好像并不管用，安装完之后，运行make qemu会卡住，具体原因可能是qemu版本太高了吧。这里只需要使用使用pacman安装时不安装qemu-arch-extra就行了。

```bash
sudo pacman -S riscv64-linux-gnu-binutils riscv64-linux-gnu-gcc riscv64-linux-gnu-gdb 
```

然后使用官网的教程安装qemu5.1版本。

下载qemu5.1源码，源码可以随便放。

```bash
$ wget https://download.qemu.org/qemu-5.1.0.tar.xz
$ tar xf qemu-5.1.0.tar.xz
```

编译即可。

```bash
$ cd qemu-5.1.0
$ ./configure --disable-kvm --disable-werror --prefix=/usr/local --target-list="riscv64-softmmu"
$ make
$ sudo make install
```

再次进入到xv6项目下运行make qemu应该就行了。

# 关于项目调试

直接在项目目录下运行`make qemu-gdb`，然后在开另一个终端进入项目目录运行`riscv64-linux-gnu-gdb`，不出意外的话应该会有警告。

> warning: File "你的项目目录/.gdbinit" auto-loading has been declined by your \`auto-load safe-path' set to "$debugdir:$datadir/auto-load".

而且想要列出代码也会提示我们没有导入可执行文件

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1713875590447/984b32d2-fa45-4d49-829e-22285315cd02.png align="center")

这是因为我们需要连接`make qemu-gdb`命令运行时所启动的gdbserver，端口号没修改过的话应该是26000。而连接gdbserver的配置文件位于`你的项目目录/.gdbinit`中，上面的警告就是说由于你的 GDB 配置中 `auto-load safe-path` 选项的限制，加载被拒绝了，所以就连不上gdbserver。`.gdbinit` 文件如下：

```bash
set confirm off
set architecture riscv:rv64
target remote 127.0.0.1:26000
symbol-file kernel/kernel
set disassemble-next-line auto
```

解决办法如下：

1. 解决方案一
    
    在`$HOME/.gitinit`中添加如下设置(如果没有就创建一个)
    
    ```bash
    set auto-load safe-path /home/ce/workspace/xv6-labs-2020 #这里换成你的项目目录
    ```
    
2. 解决方案二
    
    直接将你项目目录下的`.gdbinit`文件拷贝到`$HOME/`下：
    
    ```bash
    cp /home/ce/workspace/xv6-labs-2020/.gdbinit ~/
    ```
    
3. 解决方案三
    
    在运行`riscv64-linux-gnu-gdb` 命令是指定配置文件
    
    ```bash
    riscv64-linux-gnu-gdb -x .gdbinit # 你需要在项目目录执行
    ```
    

再次启动调试`make qemu-gdb` ，并在另一个终端运行`riscv64-linux-gnu-gdb` (第三种方法运行riscv64-linux-gnu-gdb -x .gdbinit) 注意上面两个命令都需要在项目目录运行。此时在gdb调试程序中输入`l`若列出了程序，应该就是成功了。

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1713875447878/6eba5751-8c86-43c6-b8ea-c2d9a2302788.png align="center")
