首页 > 其他分享 >《30天自制操作系统》Day01

《30天自制操作系统》Day01

时间:2023-06-22 22:35:22浏览次数:41  
标签:文件 字节 img helloos Day01 30 加载 操作系统

1、二进制编辑器

二进制编辑器是一种用于编辑二进制文件的工具,它允许用户以原始的二进制形式查看和修改文件内容,而不仅仅是文本形式。相对于文本编辑器,二进制编辑器更加底层和直接,可以对文件的每个字节进行操作,无论是文本、图像、音频还是可执行文件等。在https://www.vcraft.jp/soft/bz.html下载二进制编辑器Bz162,解压后双击启动Bz.exe程序。

2、使用作者提供的示例

https://www.cnblogs.com/xiyu714/p/9215474.html下载光盘中的文件。

其中的helloos.img在二进制编辑器中打开的结果为:

3、操作系统的启动

软盘映像文件的制作:将helloos.img文件写入软盘,并用它来启动电脑,按照书中所示会显示hello,world的字样。 下面分析一下书中提到的各个步骤:

在tolset文件夹下建立helloos0文件夹;

 双击!cons_nt.bat文件,会出现一个命令行窗口,输入install并回车,就会执行操作系统的安装程序,使用这张操作系统启动软盘来启动电脑,就可以得到预期的结果。

!cons_nt.bat文件的内容:
cmd.exe
这表示启动命令行窗口。
输入install回车实际上是执行了install.bat中的代码。 install.bat文件的内容: ..\z_tools\imgtol.com w a: helloos.img
..\z_tools\imgtol.com 是一个用于处理镜像文件的命令行程序。而 w a: helloos.img 则是该程序的参数,表示将 helloos.img 写入到 A 盘。这个命令的作用是将 helloos.img 文件写入到 A 盘(软盘驱动器)。这样,你就可以使用虚拟机或实际计算机的软盘驱动器来引导或运行 helloos.img 文件中的操作系统。

由于没有软驱,这里采用作者提供的第二种方法,使用QEMU模拟器,这种PC模拟器的作用类似于VMware、VirtualBox等。在双击!cons_nt.bat打开的命令行窗口中输入run回车,可以看到命令行执行了run.bat文件中的代码。

run.bat文件的内容:
copy helloos.img ..\z_tools\qemu\fdimage0.bin ..\z_tools\make.exe -C ../z_tools/qemu

这两句代码会将helloos.img文件复制到..\z_tools\qemu\fdimage0.bin文件,并在../z_tools/qemu目录下执行make.exe文件。通过使用-C选项指定目标目录,运行make.exem,自动化地执行编译、链接和其他构建操作。

 

 

 

  其中qemu\fdimage0.bin就是QEMU 中的虚拟软盘映像文件。虚拟软盘映像文件可以被用作虚拟机中的软盘驱动器,模拟实际计算机上的软盘。在QEMU中,你可以使用以下命令加载并使用 qemu\fdimage0.bin 虚拟软盘映像:qemu-system-x86_64 -fda qemu\fdimage0.bin 。该命令会启动一个x86架构的虚拟机,并将虚拟软盘映像文件 qemu\fdimage0.bin 装载为驱动器A上的软盘。上述命令是以QEMU系统模拟器在x86-64架构上运行的示例。具体的命令可能因你使用的操作系统、QEMU版本和配置而有所不同。
  在本书的示例中,根据命令行执行结果可以看到实际上make.exe的执行结果是去执行 qemu.exe -L . -m 32 -localtime -std-vga -fda fdimage0.bin 这一命令。qemu.exe:这是运行 QEMU 的可执行文件。
-L .:这个选项指定了镜像文件的路径位置,.表示当前目录。也就是说,QEMU 将在当前目录中查找 fdimage0.bin 文件。
-m 32:这个选项设置了虚拟机的内存大小为 32MB。虚拟机将被分配 32MB 的内存空间。
-localtime:这个选项设置虚拟机的时钟采用主机的本地时间。
-std-vga:这个选项启用了标准 VGA 图形适配器,用于在虚拟机中显示图形界面。
-fda fdimage0.bin:这个选项指定了软盘驱动器 A 中加载的软盘映像文件 fdimage0.bin。虚拟机将读取并使用该软盘映像文件。
通过执行上述命令,QEMU 将启动一个虚拟机实例,并加载软盘映像文件 fdimage0.bin 到虚拟机的软盘驱动器 A 上。同时,虚拟机将使用 32MB 的内存和标准 VGA 图形适配器。请确保在执行命令之前已正确安装 QEMU,并提供正确的文件路径和参数。

4、计算机的0、1

“软盘的原理也有异曲同工之妙,简单说来,就是把二进制的0和1转换为磁极的N极和S极而已,所以我们只用0和1就可以写出映像文件来。不仅是映像文件,计算机所能处理的各种文件最终都是用0和1写成的。因此可以说,不能仅用0和1来表达的内容,都不能以电信号的形式传递给CPU,所以这种内容是计算机所无法处理的。”

5、用汇编程序生成helloos.img

首先简单介绍一下汇编相关的一些知识点。

  汇编语言是一种低级别的计算机语言,用于与计算机硬件直接交互。汇编语言编译器是一类软件工具,用于将汇编语言代码翻译为机器码,以便计算机能够执行。以下是几种常见的汇编语言编译器:
NASM(Netwide Assembler):NASM 是一个功能强大且广泛使用的汇编语言编译器,支持多种处理器架构(如 x86、x86-64、ARM 等)。它具有丰富的特性和灵活的语法,被广泛应用于各种操作系统和嵌入式设备的开发。
GAS(GNU Assembler):GAS 是 GNU 工具链中的一部分,是一款开源的汇编语言编译器。它支持多种处理器架构,并且兼容 AT&T 语法,被广泛用于 GNU/Linux 操作系统上的开发。
MASM(Microsoft Macro Assembler):MASM 是由微软开发的汇编语言编译器,主要用于 Windows 平台上的开发。它支持 x86 架构,并且与 Microsoft Visual Studio 配合使用,提供了丰富的调试和开发工具。
TASM(Turbo Assembler):TASM 是 Borland 公司开发的一款汇编语言编译器,主要用于 DOS 和 Windows 环境下的开发。它支持多种汇编语法,并提供了一系列高级特性和工具,用于提升开发效率。
  这些汇编语言编译器各有特点和适用范围,可以根据具体的需求和项目要求选择合适的编译器进行开发。需要注意的是,使用汇编语言编写程序需要对底层硬件架构和指令集有深入的了解,因此汇编语言编译器通常用于特定领域的开发或对性能要求极高的场景。
  汇编程序文件一般使用特定的文件扩展名来标识,常见的有.asm、.s等。.nas 后缀并非标准的汇编文件扩展名,不同的汇编器可能对文件扩展名有特殊要求。

  这里需要使用汇编语言来生成helloos.img映像文件。书中所使用的nask汇编语言编译器是作者在NASM编译器基础上开发的。在helloos.nas汇编程序文件中输入作者提供的源代码,双击!cons_nt.bat打开命令行窗口,输入 ..\z_tools\nask.exe helloos.nas helloos.img 。这句命令表示使用nask编译器将helloos.nas汇编程序文件编译成helloos.img的二进制映像文件。但是这个汇编文件很长,而且它的内容实际上就是之前的helloos.img中数据的一个格式变换,形式上其实都是一样的,只不过使用了汇编的数据表示方式也就是DB指令。DB指令是在汇编语言中用于定义数据的指令,用于定义一个或多个字节的数据。它可以在内存中分配一个或多个连续的字节,并将指定的值存储在这些字节中。

 

  为了缩短helloos.nas,并且保证输出的内容不变,在汇编程序中加上RESB指令。RESB指令用于在内存中保留指定字节数的空间,而不对其进行初始化。它主要用于在程序执行期间动态分配内存。如RESB 100 表示在内存中保留100个字节的空间。编译以下使用了DB指令和RESB指令的汇编文件helloos.nas,同样可以生成一样的helloos.img映像文件。

“DB指令是“define byte”的缩写,也就是往文件里直接写入1个字节的指令。RESB指令是“reserve byte”的略写,如果想要从现在的地址开始空出10个字节来,就可以写成RESB 10,意思是我们预约了这10个字节(大家可以想象成在对号入座的火车里,预订了10个连号座位的情形)。而且nask不仅仅是把指定的地址空出来,它还会在空出来的地址上自动填入0x00,所以我们这次用这个指令就可以输出很多的0x00,省得我们自己去写18万行程序了,真是帮了个大忙。”

 在双击!cons_nt.bat打开的命令行窗口中执行命令 ..\z_tools\nask.exe helloos.nas helloostest.img,会生成一个和之前helloos.img完全一样的helloostest.img文件。

 继续对源汇编代码进行加工润色:

 这里涉及到了一些新的汇编语法知识点:

;表示注释。
DB指令可以直接写字符串,汇编语言会自动地查找字符串中每一个字符所对应的编码,然后把它们一个字节一个字节地排列起来。
DW指令,define word,表示16位两个字节。
DD指令,define double-word,表示32位4个字节。
RESB 0x1fe-$,美元符号$在这里是一个变量,表示当前位置已经输出的字节数。“在这个程序里,我们已经在前面输出了132字节,所以这里的$就是132。因此nask先用0x1fe减去132,得出378这一结果,然后连续输出378个字节的0x00。那这里我们为什么不直接写378,而非要用$呢?这是因为如果将显示信息从“hello, world”变成“this is a pen.”的话,中间要输出0x00的字节数也会随之变化。换句话说,我们必须保证软盘的第510字节(即第0x1fe字节)开始的地方是55 AA。如果在程序里使用美元符号($)的话,汇编语言会自动计算需要输出多少个00,我们也就可以很轻松地改写输出信息了。”

6、涉及到的一些专业术语

FAT12:FAT12(File Allocation Table 12)是一种早期的文件系统,最初用于MS-DOS操作系统和早期的Windows版本。它是基于簇分配的文件系统,用于在存储介质(如软盘、硬盘等)上组织和管理文件。FAT12使用簇(Cluster)作为最小的存储单位。每个簇的大小固定为512字节。文件被分割成一个个簇进行存储。FAT12通过文件分配表(File Allocation Table)来记录文件在存储介质中的分配情况。FAT表由一系列条目组成,每个条目占用12位。这些条目描述了每个簇的状态,如文件的起始位置、下一个簇的位置等。FAT12的根目录区是一个固定大小的区域,通常位于存储介质的开始处。根目录区用于存储文件和子目录的元数据,包括文件名、扩展名、大小等。通过FAT表,可以按顺序查找文件的所有簇,并将它们组合成完整的文件。这种顺序查找方式使得FAT12对于随机访问效率较低,特别是对大型文件而言。由于FAT12使用12位来表示每个簇的状态,因此最多支持4096个簇(2^12)。这限制了FAT12文件系统的存储容量为约16MB。尽管FAT12已经不常用于现代计算机系统中,但它在早期的个人计算机时代起到了重要的作用,并为后续的文件系统演进打下了基础。现代的操作系统和存储介质往往采用更先进的文件系统,如FAT32、NTFS、exFAT等。

用Windows或MS-DOS格式化出来的软盘就是这种格式。我们的helloos也采用了这种格式,其中容纳了我们开发的操作系统。

 启动区:启动区(Boot Sector),也称为引导扇区(Boot Sector)或引导记录(Boot Record),是存储介质(如硬盘、闪存)上的一个特殊区域。它是计算机系统启动过程中的第一个扇区,通常位于存储介质的最前面,如存储介质的物理扇区0或逻辑扇区0。在硬盘上,启动区一般是主引导记录(Master Boot Record, MBR);在其他存储介质上,启动区可能有不同的名称和结构。启动区包含引导代码,这段代码是由汇编语言编写的低级指令集。引导代码的主要作用是加载操作系统的引导程序或其他关键程序到计算机的内存中。对于硬盘上的MBR启动区,除了引导代码,还包含一个分区表。分区表记录了硬盘上各个分区的信息,如起始扇区、大小等。通过分区表,操作系统可以定位和访问硬盘上的不同分区。当计算机开机时,BIOS(Basic Input/Output System)会将控制权交给启动区中的引导代码。引导代码首先进行硬件初始化和自检,然后根据分区表的信息找到操作系统的位置,并将其加载到内存中,最终将控制权移交给操作系统。

“计算机读写软盘的时候,并不是一个字节一个字节地读写的,而是以512字节为一个单位进行读写。因此,软盘的512字节就称为一个扇区。一张软盘的空间共有1440KB,也就是1474560字节,除以512得2880,这也就是说一张软盘共有2880个扇区。那为什么第一个扇区称为启动区呢?那是因为计算机首先从最初一个扇区开始读软盘,然后去检查这个扇区最后2个字节的内容。如果这最后2个字节不是0x55 AA,计算机会认为这张盘上没有所需的启动程序,就会报一个不能启动的错误。(也许有人会问为什么一定是0x55AA呢?那是当初的设计者随便定的,笔者也没法解释)。如果计算机确认了第一个扇区的最后两个字节正好是0x55 AA,那它就认为这个扇区的开头是启动程序,并开始执行这个程序。”

 IPL:“启动程序加载器。启动区只有区区512字节,实际的操作系统不像hello-os这么小,根本装不进去。所以几乎所有的操作系统,都是把加载操作系统本身的程序放在启动区里的。”

启动:在计算机操作系统启动过程中,有一个特殊的阶段称为引导(Bootstrap)阶段,它是整个启动过程的起点。以下是在操作系统启动时发生的引导过程的基本概述:

  加电自检(Power-On Self-Test, POST):当计算机被开启时,计算机的固件(通常是BIOS或UEFI)会执行自检程序,检查硬件设备的状态和完整性。这是一个检测和初始化计算机硬件的过程,包括内存、处理器、硬盘等。
  引导加载程序(Boot Loader):在自检完成后,固件将会寻找并加载引导加载程序。引导加载程序位于存储介质(如硬盘)的特定位置(例如MBR或EFI System Partition),它负责加载操作系统内核到内存中以便执行。引导加载程序通常是由操作系统提供或第三方开发,它能够根据特定的引导配置加载正确的操作系统。
  内核加载和初始化:引导加载程序执行后,它会加载操作系统内核到内存中,并进行一系列初始化操作。内核是操作系统的核心组件,包含了操作系统的主要功能和驱动程序。内核加载完成后,控制权就交给了操作系统。
  启动过程:操作系统内核接管控制权后,会进行一系列初始化和配置操作,如加载设备驱动程序、建立内存管理、初始化文件系统等。最终,操作系统会启动一个或多个用户空间进程,从而运行用户应用程序。

 

标签:文件,字节,img,helloos,Day01,30,加载,操作系统
From: https://www.cnblogs.com/a-deng/p/17497893.html

相关文章

  • 华为孟晚舟当值首秀:2030年AI算力将增长500倍!
    作者 | 范智林孟晚舟当值首次亮相。4月19日,华为副董事长、轮值董事长、CFO孟晚舟在华为第20届全球分析师大会上进行演讲,这是她当值华为轮值董事长以来的首次公开亮相。按照华为内部规定,轮值董事长在当值期间是华为最高领袖,领导公司董事会和常务董事会,从今年4月1日开始,孟晚舟开启......
  • "Recent" 文件夹是一个特殊文件夹,在 Windows 操作系统中具有以下作用和功能:
    "Recent"文件夹是一个特殊文件夹,在Windows操作系统中具有以下作用和功能:最近使用的文件和文件夹:"Recent"文件夹会记录用户最近打开、编辑或访问过的文件和文件夹的快捷方式。这使得用户可以轻松地找到最近使用过的项目。快速访问文件:通过"Recent"文件夹,用户可以快速访问他......
  • NC23051 华华和月月种树
    题目链接题目题目描述华华看书了解到,一起玩养成类的游戏有助于两人培养感情。所以他决定和月月一起种一棵树。因为华华现在也是信息学高手了,所以他们种的树是信息学意义下的。华华和月月一起维护了一棵动态有根树,每个点有一个权值。刚开存档的时候,树上只有0号节点,权值为0......
  • 20230430 28. 访问者模式 - 男女对比
    介绍访问者模式(Visitor),表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作访问者模式适用于数据结构相对稳定的系统访问者模式把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由地演化。......
  • 20230418 java.util.Scanner
    简介publicfinalclassScannerimplementsIterator<String>,Closeable一个简单的文本扫描器,可以使用正则表达式解析原始类型和字符串。Scanner使用分隔符模式将其输入分解为标记,默认情况下匹配空格。然后可以使用各种next方法将生成的标记转换为不同类型的值。Scanner......
  • 20230427 23. 命令模式 - 烧烤点单
    介绍命令模式(Command),将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作Command类,用来声明执行操作的接口ConcreteCommand类,将一个接收者对象绑定于一个动作,调用接收者相应的操作,以实现executeCommandInvoker......
  • 20230428 24. 职责链模式 - 审批流程
    介绍职责链模式(ChainofResponsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。Handler类,定义一个处理请示的接口ConcreteHandler类,具体处理者类,处理它所负责的请......
  • 20230430 26. 享元模式 - 网站复用
    介绍享元模式(Flyweight),运用共享技术有效地支持大量细粒度的对象。在享元对象内部并且不会随环境改变而改变的共享部分,可以称为是享元对象的内部状态,而随环境改变而改变的、不可以共享的状态就是外部状态了。事实上,享元模式可以避免大量非常相似类的开销。在程序设计中,有时需......
  • 20230430 27. 解释器模式 - 音符
    解释器模式(interpreter),给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。解释器模式需要解决的是,如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器......
  • 【建议私藏】Android进阶开发面试必背300题,都在这里了~
    Android的技术面试的本质与考试无差,许多知识点你可能之前没有涉及,之后也不会用到,但面试官提问时,你一定得会。如果你只是精专于之前业务中的内容,那无疑所掌握的知识点会非常会非常片面,也会极大的限制你的发展性,减少你可选择的选项。Android开发面试必问经典题目Handler相关知识,面试......