操作系统实验报告
一、实验题目
实验一 环境配置
- 实验环境
ubuntu20
- 实验步骤
一、安装工具链
1、安装交叉编译工具链 (aarch64)
- 下载工具链,以下载工具链版本为11.2,宿主机为x86 64位 Linux机器为例
- wget https://developer.arm.com/-/media/Files/downloads/gnu/11.2-2022.02/binrel/gcc-arm-11.2-2022.02-x86_64-aarch64-none-elf.tar.xz
- 解压工具链
- tar -xf gcc-arm-(按Tab键补全)
- 重命名工具链目录
- mv gcc-arm-(按Tab键补全) aarch64-none-elf
将目录 /path/to/your/aarch64-none-elf/bin加入到环境变量 PATH 中。
测试工具链是否安装成功
2、安装QEMU模拟器
Linux
- sudo apt-get update
- sudo apt-get install qemu
- sudo apt-get install qemu-system
3、安装CMake
Linux
- sudo apt-get install cmake
二、创建裸机(Bare Metal)程序
由于我们的目标是编写一个操作系统,所以我们需要创建一个独立于操作系统的可执行程序,又称 独立式可执行程序(freestanding executable) 或 裸机程序(bare-metal executable) 。这意味着所有依赖于操作系统的库我们都不能使用。比如 std 中的大部分内容(io, thread, file system, etc.)都需要操作系统的支持,所以这部分内容我们不能使用。 但是,不依赖与操作系统的语言特性还是可以继续使用的。
创建项目
我们将参照UniProton设计项目的目录层次,但为了理解方便,将会进行相应简化。其初始目录结构如下图所示。
可以看到:在实验一 lab1 目录下有一个 src 目录,所有源代码均放在此处。其下包括 bsp 目录和 include 目录。其中 bsp 目录存放与硬件紧密相关的代码,include 目录中存放项目的大部分头文件。src 下目前仅 main.c 文件include 目录下有 prt_typedef.h 头文件,它是 UniProton 所使用的基本数据类型和结构的定义,如 U8、U16、U32、U64等。bsp 目录下目前包括 CMakeLists.txt 和两个汇编文件 start.S 和 prt_reset_vector.S。
在src/下创建main.c
- #include "prt_typedef.h"
- #define UART_REG_WRITE(value, addr) (*(volatile U32 *)((uintptr_t)addr) = (U32)value)
- S32 main(void)
- {
- char out_str[] = "AArch64 Bare Metal";
- int length = sizeof(out_str) / sizeof(out_str[0]);
- // 逐个输出字符
- for (int i = 0; i < length - 1; i++) {
- UART_REG_WRITE(out_str[i], 0x9000000);
- }
- }
S32 是在 prt_typedef.h 中定义的基本类型,这是为了屏蔽各硬件系统的区别,方便操作系统移植到多种不同规格的硬件上。
main 函数的主要功能(L12-L13)是把 out_str 中的字符通过宏 UART_REG_WRITE 逐个写入地址为 0x9000000 的地方。其作用将在 实验二 Hello, miniEuler 部分详细解释。
在src/include/下创建prt_typedef.h。
- /*
- * Copyright (c) 2009-2022 Huawei Technologies Co., Ltd. All rights reserved.
- *
- * UniProton is licensed under Mulan PSL v2.
- * You can use this software according to the terms and conditions of the Mulan PSL v2.
- * You may obtain a copy of Mulan PSL v2 at:
- * http://license.coscl.org.cn/MulanPSL2
- * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
- * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
- * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
- * See the Mulan PSL v2 for more details.
- * Create: 2009-12-22
- * Description: 定义基本数据类型和数据结构。
- */
- #ifndef PRT_TYPEDEF_H
- #define PRT_TYPEDEF_H
- #include <stddef.h>
- #include <stdint.h>
- #include <stdbool.h>
- #ifdef __cplusplus
- #if __cplusplus
- extern "C" {
- #endif /* __cpluscplus */
- #endif /* __cpluscplus */
- typedef unsigned