
操作系统
文章平均质量分 72
GP-Bullet
渊默而雷声
展开
-
分页机制详解
##### 解决内存不足> 解除线性地址与物理地址一一对应的关系,然后将它们的关系重新> 建立。通过某种映射关系,可以将线性地址映射到任意物理地址。>> 对于地址转换这种实时性较高的需求,查找页表的工作也是由硬件完成的。分页机制要建立在 分段机制的基础上,也就是说,段部件的工作依然免不了,所以,分页只能是在分段之后进行的,分页机制的作用有两方面。- 将线性地址转换成物理地址。- 用大小相等的页代替大小不等的段。原创 2023-10-14 11:23:36 · 810 阅读 · 0 评论 -
第八章 硬盘和显卡的访问与控制(2)
用于加载用户程序的物理地址phy_base是16字节对齐的,而用户程序中,每个段的汇编地址也是16字节对齐的。因此,每个段在内存中的起始地址也是16字节对齐的,将它们分别右移4位,就是它们各自的逻辑段地址。代码使用ror循环右移(ROtate Right),循环右移指令执行时,每右移一次,移出的比特既送到标志寄存器的CF位,也送进左边空出的位。68~74行是循环体,每次循环开始后,BX总是指向需要重定位的段的汇编地址,而且都是双字,需要分别传送到寄存器。用户程序头部内,偏移为0x06处的双字,存放的是。原创 2023-03-16 22:16:55 · 570 阅读 · 1 评论 -
第8章 硬盘和显卡的访问与控制(1)
本章把主引导扇区改造成一个程序加载器,功能是加载用户程序,并执行该程序(将处理器的控制权交给该程序)原创 2023-03-14 22:50:27 · 368 阅读 · 0 评论 -
第七章-X86汇编语言从实模式到保护模式
AX清零,1传到寄存器,开始累加。同100比较AX中得到累加和。得到累加和,要把各数位分解出来,并准备在屏幕上显示。保存在栈中,栈段,由段寄存器SS指向。需要栈指针寄存器来指示下一个数据应当压入栈内的什么位置,或者数据从哪里出栈40~42行初始化和的内容44行 除数传送到每次除法结束后,都做一次判断,如果商为0的话,分解过程可以提前结束,必须记住实际有多少个数位。45行寄存器清零,用来累计47到53行也是循环体,每次执行,分解一个数位。每次分解加一,表明多一个数位48,49行,将清零,和一起形成32原创 2023-03-13 18:11:41 · 961 阅读 · 0 评论 -
MOV指令使用
mov用于数据传送。之后分为目的操作数和源操作数,目的操作数必须是通用寄存器或者内存单元:源操作数可以是具有相同数据宽度的通用寄存器或者内存单元,还可以是立即数。传送指令只影响目的操作数内容,不改变源操作数内容。原创 2023-03-03 18:13:50 · 4475 阅读 · 0 评论 -
8086内存分段机制
另一个点是段的大小的划分,这个比较随意,但是为了让段不重叠,最多可以将1MB的内存分成65536个段,段寄存器只有16位段寄存器就不够存了。接着,任务是定义段地址并设置处理器的段寄存器,其中最重要的是段地址的选取。为了解决这个问题,8086处理器在形成物理地址时,先将段寄存器的内容左移4位(相当于乘以十进制的16)形成20位的段地址,然后再同16位的偏移地址相加,得到20位的物理地址。有一个难理解的点,8086的段寄存器和IP寄存器都是16位的,但是为了使它有1MB的内存,提供了20根地址线。原创 2023-03-01 21:09:34 · 731 阅读 · 0 评论 -
UEFI启动的七阶段笔记
研究起点是CPU收到ResetVector信号后,开始执行第一行代码,一直到计算机关机/重启/崩溃,被划分为七个不同阶段。原创 2023-02-27 20:19:03 · 837 阅读 · 0 评论 -
多道程序与分时多任务--rCore[3]
计算机硬件在快速发展,内存容量在逐渐增大,处理器的速度也在增加,外设 I/O 性能方面的进展不大。于是就想到,让应用在执行 I/O 操作或空闲时,可以主动 释放处理器 ,让其他应用继续执行。原创 2022-12-30 01:24:50 · 1351 阅读 · 3 评论 -
在裸机上输出Hello,world! [rCore-lab1]
非常简单的“Hello, world”应用程序,实际上有着多层硬件和软件工具和支撑环境隐藏在它背后,才让我们不必付出那么多努力就能够创造出功能强大的应用程序。生成应用程序二进制执行代码所依赖的是以 编译器 为主的开发环境;运行应用程序执行码所依赖的是以 操作系统 为主的执行环境。这次本文章梳理文档,要在裸机上实现输出Hello,world!./os/src├── bootloader(内核依赖的运行在 M 特权级的 SBI 实现,本项目中我们使用 RustSBI)原创 2022-11-21 22:34:12 · 1159 阅读 · 0 评论 -
Rust 所有权、引用与借用
相比之下,在堆上分配内存则需要更多的工作,这是因为分配器必须首先找到一块足够存放数据的内存空间,并接着做一些记录为下一次分配做准备。可变引用有一个很大的限制:如果你有一个对该变量的可变引用,你就不能再创建对该变量的引用。Rust释放堆的方式为:对于某个值来说,当拥有它的变量走出作用范围时,内存会立即自动的交还给操作系统。x由于是i32类型实现了copy trait,往函数里传的是x的副本,x在第8行以后仍然是有效的。当变量离开作用域时,Rust会自动调用drop函数,并将变量使用的heap内存释放。原创 2022-11-11 19:56:15 · 687 阅读 · 0 评论 -
选择和循环结构的机器级表示
此处机器级代码是先判断了a>17和a原创 2022-10-20 11:11:53 · 520 阅读 · 0 评论 -
函数(过程)调用机器级表示(一)
- 准备阶段:前三行第一条指令总是把就的EBP的值压入栈中此时ESP指向此处第二条mov指令后,EBP也指向此处,栈底就此形成第三条指令减法,ESP-24,栈顶移动,留足空间- 分配局部变量:4、5条125送到ebp-12的地址80送到ebp-8的地址- 准备入口参数:6-9条80送到ESP+4(即对t2参数赋值)125送到esp(即对t1赋值)原创 2022-10-19 20:51:51 · 1089 阅读 · 0 评论 -
从汇编指令解决浮点数疑问
(右边多一条赋值语句)**问题:使用老版本gcc -O2 编译时,程序一输出0,程序二输出1,是什么原因造成的?**原创 2022-10-17 21:46:52 · 1729 阅读 · 0 评论 -
IA-32定点算术指令
ALU运算结束后,标志信息送到标志寄存器中,通过多路选择器,把加法器选择输出送回0号寄存器,0号寄存器为80000001。译码后,得知功能R[eax]原创 2022-10-17 15:53:07 · 870 阅读 · 0 评论 -
IA-32传送指令执行
IA-32常用传送指令–通用数据传送指令MOV:一般传送,包括movb、movw和movl等MOVS:符号扩展传送,如movsbw、movswl等MOVZ:零扩展传送,如movzwl、movzbl等XCHG:数据交换原创 2022-10-16 16:43:33 · 505 阅读 · 0 评论 -
IA-32指令系统概述
IA是Intel Architectture的缩写。原创 2022-10-16 15:27:09 · 620 阅读 · 0 评论 -
程序转换概述
可执行的指令的集合,包括指令格式、操作种类以及每种操作对应的操作数的相应规定;左边为位移量,中间是机器指令,右边为汇编指令(没有带长度后缀,常数十六进制)-操作数所能存放的寄存器组的结构,包括每个寄存器的名称、编号、长度和用途;-指令执行过程的控制方式,包括程序计数器、条件码定义等。-操作数在存储空间存放时按照大端还是小端方式存放;-操作数所能存放的存储空间的大小和编址方式;-指令获取操作数的方式,即寻址方式;地址起始不是0,而是实际的虚拟地址。-指令可以接受的操作数的类型;ISA是必不可少的抽象层。原创 2022-10-15 20:31:56 · 247 阅读 · 0 评论 -
运算电路基础
在整数加/减运算部件基础上,加上寄存器、移位器以及控制逻辑,就可实现ALU、乘/除运算以及浮点运算。原创 2022-10-12 22:23:13 · 738 阅读 · 0 评论