os lab0

os lab0

记录一些lab中需要掌握的东西

1.有关makefile和make

alt text makefile文件是一个自动化构建和管理项目的脚本,相当于将一系列的编程语言项目编译成了可以让make命令使用的内容;之后,当你运行make命令时,其就会自动执行makefile文件中的指令和规则。

4.1 交叉编译工具链

alt text 这里面所谓的“套件”指的是一组相关的开发工具、软件和库,可以提供一个完整的功能集合;整个交叉工具编译链 的作用是使用 目标套件下的编译器 将源代码编译为 对应系统 下的 目标架构语法下的可执行文件。

执行以下任务时,对应的命令如下(我的文件名为helloworld.c):

  1. 生成对应的RISC-V汇编代码:

    riscv64-linux-gnu-gcc -S helloworld.c -o helloworld.s

    解释一下:-S告诉编译器停止在汇编阶段即可;而后面的.s文件就是生成的对应的汇编文件。

(2)将其编译为 RISC-V 可执行程序:

riscv64-linux-gnu-gcc -c helloworld.c -o helloworld.o riscv64-linux-gnu-gcc helloworld.o -o helloworld

这两个代码的意思是,首先转化为编译后的目标文件(.o文件),-o的意思是指定生成文件的名字(仅此而已);之后通过这个.o文件和可能依赖的库文件等等链接起来解释,就生成了可执行文件

(3)将 RISC-V 可执行程序反汇编

riscv64-linux-gnu-objdump -d helloworld > helloworld.txt

三个步骤中,前两个使用了riscv64-linux-gnu下的gcc编译器,最后一个使用了objdump进行反汇编

4.2 编译本地架构内核

需要掌握的内容: alt text (1)执行完make help之后,会对这些命令有简单的解释。其中,对于上述运行的命令解释如下: defconfig - New config with default from ARCH supplied defconfig(也就是说,根据现有的文件生成一个默认的配置文件)

distclean - mrproper + remove editor backup and patch files(清除所有与配置相关的文件)

另外,make -j$(nproc) 将 -j 和 $(nproc) 结合起来,意思是 使用系统中所有可用的 CPU 核心数来并行编译。nproc会返回系统可用的 CPU 核心数。

(2)命令 make V=1 可以让编译的过程中显示出来详细的内容;make -d 可以诊断makefile等详细问题

(3)alt text 内核映像是指,如果内核是电脑各个部分的”主控“的话,那么内核映像就是记录这一系列信息的“图纸”。在启动的过程中,会被加载和运行。

4.3 交叉编译 RISC-V 架构内核

交叉编译不是让同一个内核映像在不同架构上运行,而是在一种架构上编译生成能在另一种架构上运行的内核映像。如下所示:alt text 这个部分的核心命令在文档中如下所示: alt text 因此,最终执行的命令应该为

make ARCH=riscv CROSS_COMPILE=riscv64-linux-gnu- defconfig

make ARCH=riscv CROSS_COMPILE=riscv64-linux-gnu- -j$(nproc)

也就是说,这和编译本地内核的情况很像,只不过是说由于要让其在不同架构上运行,因此使用了交叉编译工具。

回答问题:

(1)两个关键变量为ARCH与CROSS_COMPILE,其中第一个在arch目录下都是有效的架构名称,而第二个就是之前的交叉编译工具了

(2)就是按照那个格式来就可以了

4.4 使用 QEMU 运行 RISC-V 内核

什么是QEMU? QEMU 支持多种硬件架构的虚拟化,允许在主机系统上创建虚拟机(VM)。它通过在虚拟环境中运行操作系统来模拟不同的硬件(如 CPU、内存、磁盘、网络设备等)

QEMU 中,首先掌握如下的几个命令:

(1)(qemu) info registers 查看CPU中寄存器的状态

(2)(qemu) info mem 查看虚拟机中的内存映射

(3)(qemu) info qtree 查看虚拟机中的设备树

(4)(qemu) x/[n][f] addr 查看内存的格式:n为查看的内存数量,指定想查看的内存字节数或是单元数;f为希望查看的内存格式(byte、halfword、word、doubleword,分别用字母b h w g表示);addr就是你要查看的地址。

特别地,

4.6 RISC-V 执行环境

熟悉所谓的SEE:SEE相当于是

回答需要掌握的问题:你需要查看 RISC-V Supervisor Binary Interface (SBI) 规范;SBI 是 RISC-V 架构中定义的操作系统内核与监督模式执行环境(SEE)之间的接口规范。

4.7 GDB调试内核

alt text 介绍一下在makefile文件有关于 $的各个不同的作用 alt text

需要掌握的内容: 1. make run与make debug:alt text 2. gdbinit中的内容:退出的时候自动kill掉这个进程;连接到运行在 localhost:1234 的远程调试目标;设置页面的布局 3. 各种gdb命令的综合运用:alt textalt text 4. 关于最后一个具体打断点的部分:alt text 因此,在openSBI 起始处打断点: break *0x80000000 查看a2寄存器的值:info registers a2 查看具体内容:x/16x $a2 (16和x可以更改为你需要查看的格式)

(gdb) info register 查看某一寄存器


os lab0
https://zrwrz.github.io/2025/09/22/os-lab0/
作者
zrw
发布于
2025年9月22日
许可协议