「BUAA OS」操作系统假期预习

「BUAA OS」操作系统假期预习

Squirrel7ang Lv3

预习内容

OS的假期预习发布时间远晚于 CO 的假期预习,将近开学才开放预习内容,正确的。

按照个人理解,假期预习大概就是理解这么几件事:

  1. 学习使用linux和 linux 中基本的GNU工具,如ls make vim等等
  2. 学习一个标准一点的、系统一点的 MIPS 程序长什么样子
  3. 学习 C 语言是怎么被翻译成 MIPS 汇编,再翻译成二进制可执行文件,再跑起来的
  4. 学习使用 GDBQEMU

一步步来。

安装Linux

我安装的是Ubuntu22.04,使用vmware workstation运行。理由是配置比较白痴。同时我也在WSL上安装了Ubuntu。虽然还没弄明白wsl的图形化界面要怎么安装,但即便没有图形化界面,个人感觉使用体验要远好于vmware

本地代理

wsl的开本地代理可以在本地的”C:\Users%USERNAME%.wslconfig”文件中进行配置完成。一般来说该文件不存在,需要自行创建。创建后向其中写入以下内容:

1
2
3
4
5
6
[experimental]
autoMemoryReclaim=gradual
networkingMode=mirrored
dnsTunneling=true
firewall=true
autoProxy=true

然后在命令行将wsl关掉:

1
2
> wsl --shutdown
> wsl

如果打开wsl没有出现“NAT模式下不支持localhost”之类的文字就算成功了

在vmware的Ubuntu中进行本地代理则稍微有一点麻烦。我使用的是clash for windows进行联网,在Ubuntu中也可以启动本地代理通过windows的clash访问指定网站。

  1. 先在windows下打开命令行,输入ipconfig,找到无线局域网适配器 WLAN下的IPv4 地址
  2. 将clash中的Allow LAN打开,记录Port号。
  3. 在ubuntu的网络设置中选择本地代理-手动,将https代理http代理Socks主机三个选项的每一个都分别写入IPv4 地址以及Port号。随后就可以正常上网了

安装相关GNU工具

基本gcc工具

1
sudo apt install build-essential

mips相关模拟开发工具

1
sudo apt install gcc-mips-linux-gnu qemu-system-mips gdb-multiarch

之后的作业如果遇到奇怪的报错可能还有一下其他的库没有装。这个到时候再说吧。

作业

我们直接看Makefile,这里参考了绿导师的makefile查看技巧。

1
2
$ make -nB # 查看make命令都会执行哪些命令,并输出到标准输出(但是不执行这些命令)
$ make run -nB # 查看make run命令都会执行哪些命令,并输出到标准输出(但是不执行这些命令)

-n-B选项可以用man make | vim -来查看

对于make中眼花缭乱的指令,可以在vim中输入:%s/ /\n /g命令来完成一种简单的formatting。

拿mips-exercise的makefile来说,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# make
mips-linux-gnu-gcc --std=gnu99 -EL -G 0 -mno-abicalls -fno-pic -ffreestanding -fno-stack-protector -fno-builtin -Wa,-xgot -Wall -mxgot -mno-fix-r4000 -march=4kc -g -ggdb -I./include/ -c -o hello.o hello.c
mips-linux-gnu-gcc --std=gnu99 -EL -G 0 -mno-abicalls -fno-pic -ffreestanding -fno-stack-protector -fno-builtin -Wa,-xgot -Wall -mxgot -mno-fix-r4000 -march=4kc -g -ggdb -I./include/ -c -o output.o output.c
mips-linux-gnu-gcc --std=gnu99 -EL -G 0 -mno-abicalls -fno-pic -ffreestanding -fno-stack-protector -fno-builtin -Wa,-xgot -Wall -mxgot -mno-fix-r4000 -march=4kc -g -ggdb -I./include/ -c -o start.o start.S
mips-linux-gnu-ld -EL -G 0 -static -n -nostdlib --fatal-warnings -o hello -N -T linker.lds hello.o output.o start.o

# make run
qemu-system-mipsel -cpu 4Kc -m 64 -nographic -M malta -no-reboot -kernel hello

# make dbg
make dbg_run >/dev/null 2>&1 & gdb-multiarch hello -ex "target remote localhost:1234"
killall qemu-system-mipsel

# make clean
rm -rf *~ *.o hello *.objdump

# make dbg_run
qemu-system-mipsel -cpu 4Kc -m 64 -nographic -M malta -no-reboot -s -S -kernel hello

可以发现:

  1. make就是简单的生成了一个hello的可执行文件。它忽略了标准库,使用静态链接,禁用内联函数和栈保护器,禁用对mips-r4000的修复。简单来说,这些编译操作都是为了保证我们写的程序能够在裸机上运行
  2. 使用qemu-system-mipsel 在4Kc, MIPS Malta Core运行了hello。在Debug的时候使用了-S选项让CPU在开始运行的时候停下来,使用-s指令在localhost:1234开启了一个gdbserver用于远程调试。
  3. 使用gdb-multiarch进行remote dbg,完成之后再干碎qemu进程。

观察运行情况

gdb自带tui,能够方便地查看运行结果

1
2
(gdb) layout asm
(gdb) layout src

asm这可以将CPU从启动时的0xBFC00000开始执行的所有指令都显示出来,能够很好地观察到每一条指令的运行

1
$ mips-linux-gnu-objdump -d hello | vim -

将可执行文件hello反汇编来看到hello是怎么运行的。在asm的tui下也可以显示相同的内容。

  • 标题: 「BUAA OS」操作系统假期预习
  • 作者: Squirrel7ang
  • 创建于 : 2024-03-03 15:08:00
  • 更新于 : 2024-03-16 22:05:33
  • 链接: https://redefine.ohevan.com/2024/03/03/OS/Pre/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论
目录
「BUAA OS」操作系统假期预习