自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(22)
  • 收藏
  • 关注

原创 使用Rust开发操作系统(UEFI的内核加载过程)

ELF头部编译出的内核文件使用readelf -h kernel能获取到以下信息ELF Header: Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 Class: ELF64 Data: 2's com...

2020-06-14 11:49:55 1680

原创 Rust的各种花式汇编操作

Rust的各种花式汇编操作使用nightly rust的asm!宏assembly template约束输出约束输入约束Clobber约束options更多例子在stable rust中嵌入汇编代码使用静态链接来嵌入汇编代码汇编函数的参数传递汇编函数的返回值向汇编函数传递指针向汇编函数传递数组向汇编函数传递结构体使用T作为参数使用&T作为参数使用nightly rust的asm!宏Ru...

2020-04-19 22:17:41 4847 6

原创 使用Rust开发操作系统(4级分页内存)

基础控制位基础控制位是用于控制内存分页行为,主要为以下寄存器CR0寄存器: CR0寄存器的WP(第16位)和PG位(第31位)CR4寄存器: CR0寄存器的PSE(第4位),PAE(第5位),PGE(第7位),PCIDE(第17位),SMEP(第20位),SMAP(第21位),PKE(第22位),CET(第23位)标志位MSR寄存器:MSR寄存器LME(第8位)和NXE(第11位)标志位...

2020-02-27 15:42:44 1585

原创 使用Rust开发操作系统(UEFI抽象文件系统)

在上一篇文章中我们介绍了rust在uefi中的基本使用,在本章中我们开始编写UEFI基础设置,主要包括File结构和uefi编译脚本用来简化内核文件读取和qemu启动过程建立基础异常在标准库中为我们提供了Result,但是在UEFI开发中将Result分成了2种,UEFI服务执行的Result和用户自定义的Result,在本节中我们仿照标准库的io::Result建立我们自己的Result设...

2020-02-21 13:06:02 1748

原创 使用Rust开发操作系统(UEFI内存管理和文件系统使用)

在上一篇文章中我们简单介绍了UEFI的基本概念在本章中我们介绍uefi-rs库的基本使用基本结构uefi-rs中基本的结构已经画成脑图的形式uefi-rs中主要分为以下内容信息类: 固件的信息,UEFI信息,uefi配置表服务类: 在uefi-rs中主要包含运行时服务,启动服务,退出启动服务等Protocol(协议): 在uefi-rs中支持以下协议,所有的Protocol需要使用...

2020-02-13 00:13:08 2237

原创 使用Rust开发操作系统(UEFI基本介绍)

在上一篇文章中我们编写一个基本的操作系统,但是这个操作系统只有很简单的字符输入和输出功能,没有调度,没有内存管理等,但是没关系我们会一一实现他们,现在我们需要解决系统引导启动问题,之前的章节中我们接住了``的Bootloader库来完成系统引导,但是BootLoader库只提供了最基本的功能,并且是BOIS引导启动,为了让我们的系统更具现代化一些,我们使用UEFI引导启动系统关于UEFI在本章...

2020-01-25 21:47:57 4043 2

原创 使用Rust开发编译系统(C以及Rust编译的过程)

C语言编译的过程主流的编译器GCCLLVMC语言编译过程LLVM编译过程将C源码转为LLVM IR将IR转化为BitCode将BitCode转为目标平台汇编码执行BitCode主流的编译器GCCGCC编译器是由GNU开发的编译器,原名为GUN编译器,原本只能处理C语言随着发展,后续支持了C++,Java,Go等语言,所以改名为GNU编译器套件,GCC主要分为以下接口前端接口: 将源码经过...

2020-01-21 15:35:40 7306 3

原创 使用Rust开发编译系统(基本介绍以及建立项目)

建立项目基本介绍建立项目下一步要做什么基本介绍在本专栏中我们将使用rust编写C语言的编译系统,包括编译器,链接器,汇编器,文章跟之前的风格一样,将项目分为独立的子模块,每篇文章对每个模块或者子功能进行讲述,编写代码之前会讲述所需要的理论知识建立项目Rust安装请看这里建立一个项目需要用到Cargo,Cargo在安装Rust时就会安装通过Cargo提供的命令很容易创建一个Rust项目...

2020-01-21 15:35:09 1499

原创 使用Rust开发操作系统(使用中断,时钟中断,键盘驱动)

使用中断,时钟中断,键盘驱动定义一个中断处理函数定义中断向量时钟中断关于时钟中断键盘中断下一步要做什么在上一篇文章中我们讲述了如何定义一个异常处理函数以及如何向IDT注册异常处理函数,在本篇中我们开始定义一个中断处理函数以及启用我们的中断处理函数定义一个中断处理函数定义一个中断函数很简单,函数的签名与异常处理函数的签名一致,只不过中断处理函数是不需要错误返回码的定义一个基本中断处理函数如下...

2020-01-17 13:38:18 1327

原创 使用Rust开发操作系统(异常处理)

异常处理注册异常处理函数定义异常处理函数注册异常处理函数双重异常Double Faults堆栈切换为双重处理添加一个堆栈注册双重异常处理函数下一步要做什么?在上一篇文章中我们完成了对GDT,IDT,TSS以及PIC8259A的初始化以及加载工作,现在我们需要为操作系添加一些异常处理功能,并且使用8259A编写一个简易的键盘驱动注册异常处理函数在实现IDT的过程中我们提到了x86-interr...

2020-01-16 13:23:52 731

原创 使用Rust开发操作系统(GDT,IDT加载,以及GDB调试内核)

我们花费了好大力气完成了全局描述符表,中断描述符表,TSS,PIC等结构和对应功能的代码,在本章中我们根据之前编写的GDT,IDT结构以及对应的方法来完成GDT,IDT的加载明确一下目标我们现在的项目结构是这样的.├── kernel│ ├── Cargo.lock│ ├── Cargo.toml│ ├── Makefile│ ├── src│ │ ├──...

2020-01-09 07:56:07 1712

原创 使用Rust开发操作系统(可编程中断控制器(PIC)8259A)

8259A PIC可编程中断控制器(PIC)8259A PIC可编程中断控制器(PIC)中断的产生有两种原因,一个是外部中断(由硬件产生的中断),另一个是由指令int n产生的中断,指令int n中n位向量号(IDT中定义),外部中断有些复杂些,因为需要建立硬件中断和向量号之间的对应关系,外部中断分为不可屏蔽中断(NMI)和可屏蔽中断两种,分别由CPU的两根引脚NMI和INTR来接受,Inte...

2019-12-31 17:40:09 1084 2

原创 使用Rust开发操作系统(中断描述符表--IDT)

中断描述符表--IDT

2019-12-20 14:57:29 993

原创 使用Rust开发操作系统(TSS,Task State Segment)

Task State Segment一些理论知识任务(Task)任务管理的数据结构TSSTSS的结构一些理论知识任务(Task)在计算机中,任务是处理器用于调度,执行和挂起的工作单元。它可以用于执行程序,任务或进程,操作系统服务程序,中断或异常处理程序或内核程序。在IA-32e模式中提供了在调度执行任务时保存任务状态,可以从一个任务切换到另一个任务的机制,在保护模式中,所有处理器都需要任务...

2019-12-18 09:28:50 736

原创 使用Rust开发操作系统(Rust内联汇编)

段描述符,描述符与GDTRust内联汇编assembly template约束输出约束输入约束间接输入和输出Clobber约束Asm模板参数修饰符Rust内联汇编Rust的内联汇编基础语法如下asm!( assembly template : 输出操作数 : 输入操作数 : 覆盖 : 选项);assembly templateassembly template是唯一需要...

2019-12-16 15:34:02 5146 1

原创 使用Rust开发操作系统(段描述符,描述符与GDT)

段描述符,描述符与GDT描述符(Descriptor)和全局描述符表(GDT)实模式寻址方式保护模式寻址方式段描述符保护模式段描述符代码段描述符数据段描述符系统段描述符IA-32e段描述符代码段描述符数据段描述符系统段描述符描述符(Descriptor)和全局描述符表(GDT)实模式寻址方式在16位模式中我们的寻址方式以段基址*16+偏移地址形式寻址,其中段基址*16+偏移地址得到的地址是线...

2019-12-10 21:22:42 811

原创 使用Rust开发操作系统(Canonical地址以及虚拟地址和物理地址操作)

地址操作地址空间虚拟地址空间物理地址寻址实模式寻址保护模式寻址保护模式段描述符代码段描述符数据段描述符系统段描述符IA-32e模式寻址IA-32e段描述符代码段描述符数据段描述符系统段描述符开始干活虚拟地址地址对齐物理地址下一步要做什么在上一章中我们实现了基本的位操作,在本节中我们使用之前写好的位操作开始实现地址的操作,我们先了解一下地址的理论知识地址空间地址空间在一般情况下分为两类:虚拟地...

2019-12-05 20:39:15 959

原创 使用Rust开发操作系统(自旋锁以及print!和println!宏实现)

print!和println!宏实现自旋锁原子操作Rust中的原子操作Ordering顺序一致性获取 - 释放Relaxed实现改造之前的代码print!和println!接下来要做什么在上一章中我们实现了基本的打印功能,现在的打印功能使用起来不是很方便,因此我们对之前编写打印功能进行优化自旋锁原子操作为了更好理解自旋锁,我们需要了解一下原子操作,原子操作指在执行过程中不会被任何其它任务或...

2019-12-04 20:37:24 2606 5

原创 使用Rust开发操作系统(VGA缓冲区)

VGA缓冲区一些无聊的理论建立库开始干活下一步是什么在上一篇中我们使用bootimage制作bootloader并通过QEMU来引导并调入到内核中,我们的内核现在很干净,我们迫切希望能够在屏幕上显示一些字符,本节我们开始实现这个功能一些无聊的理论为了能在屏幕上显示一些字符,我们需要通过文本缓冲器写入VGA硬件,VGA文本缓冲区是一个二维的数字,总共25行,80列,他们直接渲染到屏幕上,在这个...

2019-12-02 17:57:10 1132

原创 使用Rust编写操作系统(位运算)

位运算位运算与运算或运算兼或异或非运算位移运算位运算的用途计算2的N次幂合并位提取位大小写转换BitMask设置状态清楚状态判断状态开始干活使用宏开始测试接下来要做什么在上一片文章中我们实现了两个基础的宏print和println在本节中我们需要开始编写常用的函数,在编写之前我们需要掌握一些位的运算知识位运算我们知道计算机中采用二进制数表示,其中每个二进制数字称为位(bit)取值范围为0或1...

2019-12-02 17:56:35 2531 2

原创 使用Rust开发操作系统(一个最小的内核)

一个最小的内核启动编译LLVMTarget TripleData Layout重新编译core库运行下一步要做什么在上一节中我们搭建了编写内核程序的最基本的项目结构,并且使用了nightly版的Rust编译器,在本节中我们构建一个最小的适用于x86结构的64位系统,我们启动当你按下电源按钮的时候,它开始执行存储在主板ROM中的固件代码,此代码执行开机自检,检测可用的RAM,然后预处理CPU和...

2019-12-01 13:49:33 4033 1

原创 使用Rust开发操作系统(第一章建立基本项目,连载中~)

使用Rust开发操作系统项目环境安装项目初始化准备工作添加`no_std`属性panic_handlerlanguage item参数下一步要做什么项目环境使用rust写操作系统时使用的环境如下操作系统Linux version 5.0.0-27-generic (buildd@lgw01-amd64-031) (gcc version 7.4.0 (Ubuntu 7.4.0-1ubunt...

2019-11-29 16:31:31 2455

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除