Rust in Action笔记 第十一、十二章 简易操作系统内核

news2024/11/28 4:32:55

本章讲了如何用Rust写一个简易的操作系统(FledgeOS),除了Rust的知识外,可以了解操作系统主要的组成部分,加深对操作系统的理解

  1. 首选需要掌握和了解一些工具或者技术,QEMU是一种虚拟化技术,用于搭建一个虚拟机来让你的程序运行在上面;bootimage库可以帮助减少底层代码的开发;
  2. 一开始需要安装几个库,cargo-binutils可以让cargo直接操作可执行文件,bootimage让cargo可以直接构建一个初始化镜像(boot image),镜像可以直接在硬件上初始化;rustup toolchain install nightly & rustup default nightly使用rust的一些尚未稳定的特性和功能;rustup component add rust-src下载rust语言的源码,让rust能为新的操作系统编译一个编译器;rustup component add llvm-tools-preview安装LLVM编译器的扩展,是rust编译器的一部分;
  3. 使用书中对应的代码编译成功后可以看到一个QEMU的黑色框,说明成功编译,在这个过程中bootimage库帮忙做了很多事情,a. 为目标操作系统创建了一系列机器可读(machine-readable)的定义和术语,例如目标CUP架构;b. 编译Rust core代码在目标OS上运行;c. 用刚编译的Rust语言来编译OS内核;d. 编译一个引导程序(bootloader)来读取刚编译的OS内核;e. 在虚拟环境QEMU中执行引导程序,引导程序运行OS内核;
  4. 项目结构中出现了.cargo/config.toml,里面提供了额外的配置参数,这里的作用是让编译器自己来编译std::core的部分,而不是依赖已经预先安装好的版本;cargo.toml里出现的run-command = ["qemu-system-x86_64", "-drive", "format=raw,file={}"]表示在cargo run的时候运行一个QEMU session,
  5. 代码列表11.4里出现了很多新的属性(attributes),Page373页有详细介绍;主程序的代码永不返回,设置了返回值是!;当程序挂掉的时候相当于整个电脑崩溃了,这里用到的是LLVM的abort()方法;在新的OS里为了避免动态分配内存选择了禁用标准库#![no_std];Rust的编译器有一部分是LLVM提供的,叫做intrinsic functions,为了使用这部分功能需要在开头加上#![core_intrinsics]属性,同时由于LLVM跟Rust的非耦合关系,其提供的API可能会变化,所以要显式地引入Rust nightly的编译器;Rust在引入外部crate的时候为了避免有些变量的名称冲突会引入name_mangling,但在这里需要禁用这个功能,通过#![no_mangle]属性;引入外部C代码要加上关键字extern "C";禁用main函数,使用#![no_main]属性,因为main函数的参数是由编译器_start()提供,所以这里不能有main函数;
  6. VGA兼容的模式下,往屏幕写数据的逻辑是,屏幕在硬件里被划分成一个80x25的网格,每一格由2个字节来表示,包括背景色、字符色等等,具体可见Page375,这个网格被叫做frame buffer,通过计算知道buffer大小是4000字节,本项目设置0xb8000为buffer的起始位置,通过.offset(1)来定位要写的buffer的位置,.write_volatie(0x30)来往对应的byte写入数据;
  7. FledgeOS如何启动,不是通过main()函数,而是需要软件能直接跟CPU通信,这个软件是BootLoader,由linker将某个符号(_start)链接到初始代码(entry point)处,CPU读取初始代码的指令开始执行;
  8. x86_64库能直接写指令跟CPU沟通,例如hlt()能让CPU休眠,减少CPU的使用率和电量;
  9. #![feature(lang_items)]注释表示当前文件提供的是语言条款(language item),语言条款是Rust实现的除了编译器以外的库,因为一开始标注了#[no_std]不能使用Rust标准库,所以为了新OS必须实现一些必要的库和函数;
  10. 后续这个OS主要讲了如何在QEMU虚拟环境如何处理输入输出和panic handling,与其他OS开发无异,详细可以看对应的章节;
  11. 区分信号(signals)和中断(interrupts),信号是软件层级的一种抽象,与OS相关;中断是硬件层级的抽象,主要是跟CPU有关;可见下图图12.1
  12. 中断(interrupt)会强制让应用的控制流改变,信号(signal)在某些情况下可以忽略(ignored),一旦收到中断,CPU要跳到对应的中断处理代码,中断处理代码由BIOS和OS在初始化进程(bootup process)预先定义;
  13. Rust实现软中断可以通过std::asm库带上#![feature(asm)属性,asm!("int 42") 宏可以插入中断,硬件中断最常见的是键盘中断,原理如下图12.3所示fig12.3

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/723953.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CANoe的面板控件input/output关联信号的问题分析

1、引子 当我们想在CANoe中制作一个面板,实现:在一个文本框中输入某个信号的值,点击发送按钮,就能把信号所在的CAN消息发送出去,此时信号的值就是文本框中输入的值。 要实现此功能很简单,在CANoe上新建一个面板,在工具箱中把Input/Output Box和Button两个控件拖到面板…

测试函数-ZDT函数.txt版本免费下载

多目标优化问题中,改进NSGA-II算法需要测试函数ZDT函数来查看改进的效果如何,大多博客下载需要积分,在这附上免费网址,大家自行下载。包含ZD1-ZDT6 如下 Emoobook - Appendix D

Azure 中 Linux的时间同步问题

问题概述 Azure环境中,将群集主机放置在不同的可用区。由于网络限制比较严格没有开启外部或内部NTP时间同步,而是考虑用Azure主机的时间同步,但群集会由于时间差异而出现异常告警信息。 问题分析 问题主要是以下原因形成: 自…

NSS [HNCTF 2022 Week1]2048

NSS [HNCTF 2022 Week1]2048 前端小游戏,小菜。 flag:

vue+Nodejs+Koa搭建前后端系统(七)-- 用户注册、注销

前言 前端采用vue3前端组件库采用ElementPlus本篇文章需要结合上一篇《vueNodejsKoa搭建前后端系统(六)-- 用户登录》一起看 客户端用户注册页面 添加注册页面 添加 /src/pages/register/register.vue 文件 安装md5 md5是加密插件,用于…

算力井喷、全球布局,亚马逊云科技生成式AI不断创新解决企业需求

时至今日,生成式AI在创意输出(如写作、编程、设计)、功能增强(如写摘要、搜索)、交互式体验(Q&A、聊天)和决策支持(各类助理)这四个领域已展现出惊人潜力。 在亚马逊…

软件测试外包

目录 前言: 评估软件测试服务提供商 为什么将测试外包出去 测试服务外包应当考虑因素 参与模式 地理位置 服务协议 灵活性 质量改进 如何选择测试外包服务商 需要什么外包 调查 互动 结论 前言: 在当今的软件开发行业中,越来越…

k8s Volume之Persistent Volume持久卷

一、Persistent Volume yaml详情: kind: PersistentVolume apiVersion: v1 metadata:# PV卷名称name: nfs-mvn-repo spec:# 容量capacity:# 存储大小storage: 20Ginfs:server: 192.168.80.170path: /srv/nfs/disk/mvn-repo# 该卷支持的访问模式accessModes:- ReadW…

SPEC CPU 2006 在 CentOS 5.0 x86_64 古老系统测试【2】

上一篇 SPEC CPU 2006 在 CentOS 5.0 x86_64 古老系统测试_hkNaruto的博客-CSDN博客 虚拟机时间,一天后获得结果 由于ssh版本太低,采用nc把文件拷贝出来 结果 SPEC CFP2006 Result Copyright 2006-2023 Standard Performance Evaluation Corporatio…

MES系统

MES系统,全称制造执行系统(Manufacturing Execution System),是一种用于实时监控、追踪和控制生产过程的计算机化系统。 SAP Fiori概览 相信工作中接触过SAP的人,肯定对SAP Fiori不陌生。那什么是SAP Fiori呢? SAP Fiori是一种用于…

基于STM32单片机的智能视力保护台灯设计

硬件方案 智能台灯以专门感应人体红外信号的红外传感器为基础,这意味着仅当有人的时候,红外传感器才输出一个信号,经放大处理后达到单片机的输入门限电压,单片机开始运行,台灯自动点亮。当人离开的时候,单…

CSRF漏洞

前言 作者简介:不知名白帽,网络安全学习者。 博客主页:不知名白帽的博客_CSDN博客-网络安全,CTF,内网渗透领域博主 网络安全交流社区:https://bbs.csdn.net/forums/angluoanquan 目录 CSRF漏洞原理 CSRF常见分类 GET型 POST型…

GIT版本控制常规性操作演示汇总

文章目录 GIT基本操作GIT配置个人信息配置:GIT查看个人信息配置:GIT的三大区域GIT回滚:git resetGIT恢复日志:git reflogGIT三大区域转换GIT新建分支GIT合并分支GIT删除分支码云上创建项目GIT变基:git rebase合并提交记…

轮询-实时调用接口

https://www.cnblogs.com/zhangliang88/p/16254460.htmlhttps://www.cnblogs.com/zhangliang88/p/16254460.html

软件测试 | Selenium对多浏览器处理

在执行自动化测试过程中,我们往往会针对不同的浏览器做兼容性测试,可以通过对测试用例代码的改造,实现对不同浏览器的自动化兼容性测试。 注:实现对不同浏览器的自动化兼容性测试,需要先将各个浏览器的驱动在PC端配置…

基于PyQt5的桌面图像调试仿真平台开发(15)图像融合

系列文章目录 基于PyQt5的桌面图像调试仿真平台开发(1)环境搭建 基于PyQt5的桌面图像调试仿真平台开发(2)UI设计和控件绑定 基于PyQt5的桌面图像调试仿真平台开发(3)黑电平处理 基于PyQt5的桌面图像调试仿真平台开发(4)白平衡处理 基于PyQt5的桌面图像调试仿真平台开发(5)…

AMEYA360:尼得科nidec恩布拉科变频压缩机介绍

能源安全、能源价格方面的挑战与气候危机交织 提高能源效率比以往任何时候都更为紧迫。 能源效率是应对当今全球能源危机的核心 也是能源价值创造的重要体现。 尼得科恩布拉科大金 带来制冷方面的节能研究 LMSEY系列冷库一体机使用变频调速可 节能约14%! 全球制冷技术供应商、尼…

浅谈配电能效平台在城市地下综合管廊的应用

摘要:电气设计是综合管廊设计的重要组成部分,文章对综合管廊的断面设计、供配电系统和缆线设计进行了分析阐述,并结合设计案例,简要总结了综合管廊电气设计要点。 关键词:综合管廊;断面设计;供配电系统;缆…

微信小程序如何进行开发?

文章目录 0.引言1.注册微信公众平台账号2.准备微信开发者工具3.创建微信小程序并预览 0.引言 笔者编程一般编得较多的是桌面软件,有时也会编手机软件,这些软件都必须安装才能使用,这限制了软件的推广。而现有社交软件如微信使用得较广泛&…

使用GitHub Actions 来进行项目远程服务器部署

由于项目源码是托管在github的,而部署是放在远程服务器上,并且使用nginx部署。 现在的部署流程时,需要更新时,在本地切换到master分支,执行构建操作,拿到构建出的dist目录,将其上传到远程服务的…