6.S081 Lab0 搭建系统
实验环境总结:XV6运行在一个RISC-V微处理器上,但是使用的并不是真正的RISC-V计算机,而是使用QEMU模拟器来模拟RISC-V微处理器,因此最终总结就是:XV6运行在QEMU上(一个RISC-V微处理器模拟器)。
建议去看官网的实验环境配置——十分详细,并且根据不同环境有不同的做法。
0. 总览
配置好的实验环境如下:
总共需要安装三个东西,编译器riscv-gnu-toolchain,qemu模拟器, 操作系统xv6-riscv-fall19。
(这里其实我并没有下载,因为19年的时候参与过OS的助教工作,因此我还是用的qemu-4.1.0和xv6-riscv-fall19)
wc@r740:~/OS_experiment$ ls -lh
total 4.0G
-rw-rw-r-- 1 wc wc 7.2K Jun 25 21:24 Makefile
drwxr-xr-x 50 wc wc 12K Jun 25 21:33 qemu-4.1.0
drwxrwxr-x 24 wc wc 4.0K Jun 25 21:32 riscv-gnu-toolchain
-rw-r--r-- 1 wc wc 4.0G Jun 25 21:22 riscv-gnu-toolchain.zip
drwxrwxr-x 2 wc wc 4.0K Jun 25 21:24 test
-rw-rw-r-- 1 wc wc 595 Jun 25 21:24 Untitled-1.c
-rw-rw-r-- 1 wc wc 20M Jun 25 21:22 xv6backup.zip
drwxrwxr-x 9 wc wc 4.0K Jun 25 21:58 xv6-riscv-fall19
1. 安装编译器:RISC-V GNU的编译工具链
地址是
https://github.com/riscv/riscv-gnu-toolchain
配置和安装命令
./configure --prefix=/usr/local
sudo make
2. 安装QEMU模拟器
这个是RISC-V微处理器模拟器,可以模拟内存和CPU等。
地址
https://download.qemu.org/qemu4.1.0.tar.xz
解压,配置,编译
tar xf qemu-5.1.0.tar.xz
./configure --disable-kvm --disable-werror --prefix=/usr/local --target-list="riscv64-softmmu"
sudo make
sudo make install
3. 下载操作系统xv6
git下载
git clone git://github.com/mit-pdos/xv6-riscv.git
编译
cd xv6-riscv
make qemu
成功界面(可以看到boot,内存初始化等,最终init: starting sh,$表示进入shell )
wc@r740:~/OS_experiment/xv6-riscv-fall19$ make qemu
qemu-system-riscv64 -machine virt -bios none -kernel kernel/kernel -m 128M -smp 3 -nographic -drive file=fs.img,if=none,format=raw,id=x0 -device virtio-blk-device,drive=x0,bus=virtio-mmio-bus.0
xv6 kernel is booting
virtio disk init 0
hart 2 starting
hart 1 starting
page table 0x0000000087f6e000
..0: pte 0x0000000021fda801 pa 0x0000000087f6a000
.. ..0: pte 0x0000000021fda401 pa 0x0000000087f69000
.. .. ..0: pte 0x0000000021fdac1f pa 0x0000000087f6b000
.. .. ..1: pte 0x0000000021fda00f pa 0x0000000087f68000
.. .. ..2: pte 0x0000000021fd9c1f pa 0x0000000087f67000
..255: pte 0x0000000021fdb401 pa 0x0000000087f6d000
.. ..511: pte 0x0000000021fdb001 pa 0x0000000087f6c000
.. .. ..510: pte 0x0000000021fdd807 pa 0x0000000087f76000
.. .. ..511: pte 0x000000002000200b pa 0x0000000080008000
init: starting sh
$
ls命令可以查看当前存在那些文件,ctrl + P可以查看进程;ctrl + a,然后按x可以退出当前系统。
4. 源码预览
可以进入xv6目录下的kernel文件夹下,查看内核程序,比如cat.c如下:
其实关键代码只有:write(1, buf, n); 也就是向fd = 1处写buf,其中1是标准输出,因此会输出到屏幕上。
#include "kernel/types.h"
#include "kernel/stat.h"
#include "user/user.h"
/*连接文件并打印到标准输出设备上。*/
//策略:打开文件,保存描述符fd,n = read(fd, buf, sizeof(buf)); 然后, write(1, fd, n)
char buf[512];
void
cat(int fd)
{
int n;
while((n = read(fd, buf, sizeof(buf))) > 0) {
if (write(1, buf, n) != n) {
printf("cat: write error\n");
exit(1);
}
}
if(n < 0){
printf("cat: read error\n");
exit(1);
}
}
int
main(int argc, char *argv[])
{
int fd, i;
if(argc <= 1){
cat(0);
exit(1);
}
for(i = 1; i < argc; i++){
if((fd = open(argv[i], 0)) < 0){
printf("cat: cannot open %s\n", argv[i]);
exit(1);
}
cat(fd);
close(fd);
}
exit(0);
}