【RISC-V】《从头写一个RISC-V OS》课程笔记

最近在入坑 RISC-V 的操作系统开发,准备跟着教程走一下,顺便把不太懂的东西都记录一下。

课程 Github 主页:https://github.com/plctlab/riscv-operating-system-mooc
课程 Bilibili 主页:https://www.bilibili.com/video/BV1Q5411w7z5/

基础知识

一、GCC 的命令参数

1
2
3
4
5
6
7
8
gcc -c # 只激活预处理,编译,和汇编
-S # 只激活预处理,编译
-E # 只激活预处理
-C # 预处理时不删除注释信息
-o # 指定输出的可执行文件名称
-std # 指定使用的 C 或者 C++ 标准
-g # 生成调试信息
-O # 优化代码

参考文章:
[1] GCC 参数详解

二、readelf 的命令参数

1
2
3
4
5
6
readelf -S hello.o # 显示头信息
-a ... # 显示全部信息
-h ... # 显示 elf 文件开始的文件头信息
-l ... # 显示程序头信息
-g ... # 显示节组信息
-t ... # 显示节的详细信息,-S 的详细信息

参考文章:
[1] readelf 全栈开发速查表

三、objdump 的命令参数

1
2
3
4
objdump -S -d hello.o # 反汇编出源代码
-d # 从 objfile 中反汇编那些特定指令机器码的 section
-D # 与 -d 类似,但反汇编所有 section
-t # 一般查看 elf 文件中各个变量都在哪个段就用这个

参考文章:
[1] objdump 全栈开发速查表

四、Linux 段管理

一、BSS 段(Block Started by Symbol)
BSS 段包含了程序中未初始化的全局变量,在内存中 bss段全部置零。

二、Data 段
数据段用来存放可执行文件中已初始化全局变量,换句话说就是存放程序静态分配的变量和全局变量。【静态分配内存就是编译器在编译程序的时候根据源程序来分配内存】

三、代码段
代码段是用来存放可执行文件的操作指令,为了防止运行时被更改,所以只准许读取操作,不允许写入操作。

四、堆(Heap)
堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。

五、栈
栈是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}”中定义的变量【不包括 static 声明的变量,static意味着在数据段中存放变量】。

参考文章:
[1] LINUX 内存管理

五、Linux 进程状态

  1. 运行态:占有 CPU,在 CPU 上运行
  2. 就绪态:已经具备运行条件,但是由于没有空闲的CPU,而暂时不能运行
  3. 阻塞态:因为等待某一事件而暂时不能运行
  4. 创建态:进程正在被创建,操作系统为进程分配资源、初始化 PCB
  5. 终止态:进程正在从系统中撤销,操作系统会回收进程拥有的资源、撤销 PCB

PCB:操作系统创建每个进程时,都会额外申请一块内存空间,用来存储、管理和控制该进程所需要的信息,这种数据结构就是进程控制块【Process Control Block】

环境搭建

一、riscv-gnu-toolchain 安装

本机系统环境:

  • Ubuntu 22.04 WSL2 on Windows 11 23H2
  • Intel 11th Gen i7-11800H

大致的安装步骤建议参考官方文档,此处不详细说明。本文主要记录编译时我的配置。

Installation (Linux):
在编译时我是使用以下步骤以同时覆盖 32 位和 64 位运行环境,建议不使用多线程编译,会报错:

1
2
../configure --prefix=/opt/riscv --with-arch=rv64gcv --with-abi=lp64 --enable-multilib
sudo make

参考文章:
[1] Setup Riscv-GNU-TOOLCHAIN and SPIKE for the Vector Extnesion

二、QEMU 环境安装

推荐自己进行编译后安装,大致步骤如下,记住配置 PATH 环境变量就行:

1
2
3
4
5
6
wget https://download.qemu.org/qemu-8.2.0.tar.xz
tar xvJf qemu-8.2.0.tar.xz
cd qemu-8.2.0
./configure
sudo make -j8
sudo make install

参考文章:
[1] QEMU 官方网站

课程内容

作者

Lebenito

发布于

2023-12-04

更新于

2023-12-24

许可协议