首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >从零开发操作系统-相关术语解释( 不断更新中 )

从零开发操作系统-相关术语解释( 不断更新中 )

作者头像
shengjk1
发布2025-05-16 14:57:44
发布2025-05-16 14:57:44
1750
举报
文章被收录于专栏:码字搬砖码字搬砖

一、背景

其实也没有啥背景。就像 《30天自制操作系统》一书作者说的那样,写一个操作系统,仅仅想想就是一件特别有趣的事情呢。一两年前曾经入手开始写过,但慢慢的就不了了之了。现在又有这个想法了,准备一直干下去,最终写一个操作系统出来,算是程序员生涯的一份礼物。

整个过程我们就以 《30天自制操作系统》这本书为第一参考书,开始操作系统之旅。

二、术语

2.1 软盘

软盘,也称为 “flexible disk” 或 “floppy disk”,是一种可擦写可重写的磁盘,常用于计算机数据存储。它们是由塑料或纸制成的 flexible 薄薄的磁性介质,通常装入硬质料外壳中。软盘在计算机的发展历史上扮演了重要的角色,但现在已被其他可移动存储设备所取代。

2.2 NASM

nasm is a popular assembly language compiler for the x86 architecture. It’s used to assemble assembly code into machine code that can be executed by a CPU. The name nasm stands for “Netwide Assembler”. It’s widely used in operating system development, reverse engineering, and low-level programming.

2.3 0x7C00

在 x86 架构的计算机系统中,0x7C00 是传统的 BIOS 启动加载程序(Bootloader)被装载的地址。这个地址的选择与 BIOS 和引导过程的设计密切相关。

1. BIOS 启动过程

以下是一个简化的 BIOS 启动过程的步骤:

  • 上电启动:当计算机开机时,CPU 将控制权交给 BIOS(基本输入/输出系统)。
  • 自检 (POST):BIOS 进行自检(Power-On Self Test),确保硬件正常。
  • 设备初始化:初始化硬件设备,比如键盘、显示器等。
  • 查找启动设备:BIOS 按照设定的顺序(硬盘、光驱、USB 等)查找能够引导的设备。
  • 读取引导扇区:当 BIOS 找到一个可引导的设备后,它会读取该设备的引导扇区(通常是 MBR,即主引导记录),并将其内容加载到内存中。
2. 装载地址 0x7C00

在大多数传统的 PC 系统中,BIOS 将引导扇区(512 字节)的内容加载到内存地址 0x7C00。这一地址被选定的原因包括:

  • 历史和标准:0x7C00 是一个历史上被广泛接受的标准地址。这个地址与 BIOS 的设计密切相关,BIOS 被设计为在这个地址无条件地加载和执行代码。
  • 方便取得:0x7C00 是高于 1MB 的地址(640KB 内存区),这一区域被认为是可用内存。早期的 x86 体系结构中,第一 1MB 的地址范围是用来发展操作系统和应用程序的。
  • 避免干扰:避免和操作系统、设备驱动程序或者其他进程的代码和数据发生冲突。将引导代码放在较高的内存地址可以减少这样的冲突机会。
3. 引导扇区的结构

引导扇区的前 446 字节通常是一段引导代码,后 66 字节是分区表(在 MBR 中)。当 CPU 从 0x7C00 开始执行代码时,引导程序通常会首先检查硬件和内存状况,然后寻找操作系统的加载程序(如操作系统的内核),并将控制权移交给它。

4. 真实模式和保护模式

程序在 0x7C00 地址执行时,处于 x86 的真实模式(Real Mode),这一模式简单且直接,允许程序直接访问内存。这种模式为启动进行快速初始化和引导提供了简单的环境。在系统完成引导后,它通常会切换到更复杂的保护模式(Protected Mode),以便支持多任务、内存保护等现代操作系统的功能。

总结来说,0x7C00 是传统 BIOS 启动过程中的标准装载地址,因历史、方便、安全等原因被广泛用于引导程序的执行。

2.4 0x7C50

感谢您的耐心,下面是对 0x7C50 地址用途的详细解释和澄清。

1. 0x7C50 的具体用途

在 BIOS 启动过程中,0x7C50 通常被用作内存中的一个特殊区域,具体用途主要包括:

  1. GRUB 引导程序的加载位置
    • 在某些情况下,尤其是在使用 GRUB 这样的多引导加载程序时,0x7C50 被用作 GRUB 的第二阶段引导程序的加载地址。这意味着在 BIOS 加载和运行主引导记录 (MBR) 后,引导程序除了在 0x7C00 加载第一个引导扇区的代码外,还可能会在 0x7C50 加载第二阶段的代码。
  2. 临时数据存储
    • 一些引导程序也可能将临时数据或状态信息保存在 0x7C50 这个地址。这可能包括当前的堆栈指针、参数或者其他在引导过程中需要访问的数据。
  3. 内存布局安排
    • 在传统的 BIOS 启动序列中,0x7C00 是引导程序的起始地址,而 0x7C50 是紧随其后的地址,适合分配给其他代码或数据。由于 BIOS 和操作系统启动时的内存管理,该地址通常用于扩展代码区域。
2. 示例使用

例如,当计算机启动时,BIOS 加载 MBR(主引导记录)到 0x7C00。这个引导扇区的代码完成基本的初始化后,可能会把 GRUB 的第二阶段引导程序加载到 0x7C50。这样,第一次引导代码跳转到 0x7C50,继续执行 GRUB。

3. 总结

因此,0x7C50 在 BIOS 启动过程中的主要用途是为某些引导加载程序或其数据提供存储空间。这种约定是出于对内存使用的考虑,尤其是在开发引导程序时,合理利用可用的内存地址。

如果这些信息仍然没有完全解决您的疑问,欢迎提供更多的上下文或背景,我会很高兴继续帮助您!

2.5 即便是32位的CPU,把所有普通的寄存器都加在一起,最多也只能存储32个字节的数据

这句话基本上是正确的,但需要一些澄清。在32位CPU中,"普通寄存器"通常指的是通用寄存器,这些寄存器每个都是32位宽。以下是一些常见的32位x86寄存器: EAX EBX ECX EDX ESI EDI EBP ESP 以及其他一些专用的寄存器,如EIP(指令指针)和EFLAGS(标志寄存器)。 每个32位寄存器可以存储一个32位的值,即4个字节。因此,如果我们把上述所有8个通用寄存器加在一起,我们可以存储: 8个寄存器 × 4字节/寄存器 = 32字节 所以,从这个角度来看,确实可以说在32位CPU上,所有普通的通用寄存器加在一起最多可以存储32个字节的数据。

以下是这句话的几个要点:

  1. 寄存器大小:在32位架构中,通用寄存器的大小是32位,这意味着每个寄存器可以存储一个32位的值。
  2. 寄存器数量:这里提到的寄存器数量是指上述通用寄存器的数量,不包括其他寄存器,如段寄存器(CS, DS, ES, FS, GS, SS)或其他专用寄存器。
  3. 存储限制:寄存器是CPU内部非常快速的数据存储位置,但它们的数量是有限的。在32位架构中,通用寄存器的数量和大小决定了可以直接通过寄存器存储的数据量的上限。
  4. 数据类型:寄存器可以存储不同类型的数据,如整数、指针、某些操作的结果等。在32位架构中,一个寄存器可以存储一个32位的整数值,两个16位的整数值,或者四个8位的整数值等。
  5. 内存使用:尽管寄存器的存储空间有限,但CPU可以通过内存寻址来访问和处理远超过寄存器限制的大量数据。内存的大小通常远远超过寄存器能够直接存储的数据量。

因此,尽管32位CPU的通用寄存器总共可以存储32字节的数据,这并不限制程序可以处理的数据量,因为程序可以使用内存来存储和处理大量的数据。

2.6 内存的每个存储单元通常都是 8 bit

通常情况下,内存的每一个存储单元(通常称为一个“字节”)都是8位。这是现代计算机体系结构中的一个标准约定。一个字节由8个二进制位组成,可以表示256(2^8)种不同的值,这通常是从0到255的整数或者从-128到127的带符号整数。

以下是关于内存存储单元的几个要点:

  1. 字节作为基本单位:在大多数计算机系统中,字节是数据存储和传输的基本单位。尽管处理器的位宽可能是32位或64位,但内存仍然以字节为单位进行寻址。
  2. 地址寻址:在内存中,每个字节都有一个唯一的地址。例如,在一个32位系统中,内存地址通常是从0到2^32 - 1,这意味着系统可以寻址4,294,967,296个字节,即4GB的内存。
  3. 数据类型大小:不同的数据类型占据不同数量的字节。例如,一个标准的32位(4字节)整型(int)会占据4个连续的字节,一个64位(8字节)双精度浮点数(double)会占据8个连续的字节。
  4. 内存组织:内存是由一系列的存储单元组成的,每个单元都能存储一个字节。这些单元通常是按照一定的顺序排列的,以便CPU可以通过地址来访问特定的数据。
  5. 非标准字节大小:虽然8位字节是现代计算机体系结构中的标准,但在历史上和一些特殊的系统中,字节的定义可能不同。例如,某些旧的系统可能使用4位或9位作为基本存储单元。然而,这些情况在现代计算机系统中极为罕见。

因此,当人们提到内存时,通常是指由8位字节组成的存储空间,每个字节都可以通过其地址来访问。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-11-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、背景
  • 二、术语
    • 2.1 软盘:
    • 2.2 NASM
    • 2.3 0x7C00
      • 1. BIOS 启动过程
      • 2. 装载地址 0x7C00
      • 3. 引导扇区的结构
      • 4. 真实模式和保护模式
    • 2.4 0x7C50
      • 1. 0x7C50 的具体用途
      • 2. 示例使用
      • 3. 总结
    • 2.5 即便是32位的CPU,把所有普通的寄存器都加在一起,最多也只能存储32个字节的数据
    • 2.6 内存的每个存储单元通常都是 8 bit
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档