【写一个操作系统】1—hello world重出江湖

2023-11-11 00:59

本文主要是介绍【写一个操作系统】1—hello world重出江湖,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 目的
  • 第一阶段:利用二进制编辑器实现
  • 第二阶段:使用汇编语言编写
  • 第三阶段:改进汇编程序
  • 收获
  • 注释

目的

开发一个,基于底层硬件的helloworld小程序.

第一阶段:利用二进制编辑器实现

先下载了一个二进制编辑器软件Bz.exe1,创建一个helloos.img镜像文件,制作软盘镜像文件(通过这二进制编辑器),实际上C语句被其他程序转化为一系列的低级机器语言指令,这些指令再按照可执行目标程序的格式打包好,并以二进制磁盘文件的形式存放起来,我们是直接写了这个二进制文件,将此文件写入电脑,可以用来显示helloworld小程序。步骤如下:

  • 按照教程在Bz上编写一个helloos.img镜像文件
  • 教程附带toolset文件夹整个复制到另一个的文件夹下面
  • toolset文件夹下建立一个新的文件夹gq_helloos
  • 将编写好的helloos.img添加至gq_helloos
  • toolset文件中z_new_w文件夹下的!cons_nt.bat添加在新文件夹中
  • gq_helloos中创建一个文件命名为run.bat,编辑文件内容为:
copy helloos.img ..\z_tools\qemu\fdimage0.bin
..\z_tools\make.exe	-C ../z_tools/qemu
  • 同样,再在gq_helloos中创建一个文件命名为install.bat,编辑文件内容为:
..\z_tools\imgtol.com w a: helloos.img

.bat后缀为批处理文件格式,批处理文件是无格式的文本文件,它包含的是一些命令的代码,在命令提示下输入批处理文件名字或者双击批处理文件都会,按照文件中命令的顺序来执行命令。相当于一个集合了命令集的文件。)

  • 接下来就是将这个程序装在软盘上了,万一没钱买不起软盘怎么办?那就用模拟器吧,这里使用的模拟器是QEMU,教程已经把QEMU放在在文件..\z_tools\qemu中,使用时只要打开命令窗口,等一下!命令窗口怎么打开(黑人问号???),只要双击666之前添加的!cons_nt.bat就可以打开命令窗口了,然后在命令行窗口中输入"run"指令就可以了。

相当于run.bat中的内容就是"run"指令,在命令窗口中输入"run"就是调用了run.bat中的指令,从而开始运行程序

  • 下面就是调用QEMU模拟器显示的内容,一个hello,world
    在这里插入图片描述

第二阶段:使用汇编语言编写

接下来使用汇编语言来写这个程序,上一步构建的gq_helloos文件夹中进行修改

  • 先删除之前写好的helloos.img镜像文件(但程序最后的运行还是需要镜像文件,下面会利用汇编文件生成镜像文件的)
  • 创建汇编文件helloos.nas,编写内容为:
	DB	0xeb, 0x4e, 0x90, 0x48, 0x45, 0x4c, 0x4c, 0x4fDB	0x49, 0x50, 0x4c, 0x00, 0x02, 0x01, 0x01, 0x00DB	0x02, 0xe0, 0x00, 0x40, 0x0b, 0xf0, 0x09, 0x00DB	0x12, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00DB	0x40, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x29, 0xffDB	0xff, 0xff, 0xff, 0x48, 0x45, 0x4c, 0x4c, 0x4fDB	0x2d, 0x4f, 0x53, 0x20, 0x20, 0x20, 0x46, 0x41DB	0x54, 0x31, 0x32, 0x20, 0x20, 0x20, 0x00, 0x00RESB	16DB	0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7cDB	0x8e, 0xd8, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8aDB	0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09DB	0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xebDB	0xee, 0xf4, 0xeb, 0xfd, 0x0a, 0x0a, 0x68, 0x65DB	0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72DB	0x6c, 0x64, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00RESB	368DB	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xaaDB	0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00RESB	4600DB	0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00RESB	1469432

不要看这个代码只有22行,短小精悍,RESB代表省略的字节,省略的全部都是0x00,比如最后的 RESB 1469432 ,就省略了1469432个0x00

  • 创建批处理文件asm.bat ,编写内容为:
    ..\z_tools\nask.exe helloos.nas helloos.img
    其命令就是按照汇编文件helloos.nas生成对应的镜像文件helloos.img
  • 接下来的步骤和上面一样:利用!cons_nt.bat打开命令行窗口,在命令行中输入"asm’'指令,然后会在文件夹中生成对应的镜像文件helloos.img,最后在命令行中输入"run"指令,程序就会像上面一样执行,显示helloworld窗口

第三阶段:改进汇编程序

主要是对helloos.nas文件的改进,使代码变得更可读(说实话我也看不懂,抄就是了)

; hello-os
; TAB=4; 以下这段是标准FAT12格式软盘专用的代码DB		0xeb, 0x4e, 0x90DB		"HELLOIPL"		; 启动区的名称可以是任意字符串(8字节)DW		512				;规定 每个扇区的大小(必须为512字节)DB		1				; 规定簇的大小,以扇区为单位(必须为1个扇区)DW		1				; 规定FAT的起始位置(一般是从第一个位置开始)DB		2				; FAT的个数(必须为2)DW		224				; 根目录的大小(一般设置224项)DW		2880			; 规定磁盘大小(必须2880个扇区大小)DB		0xf0			; 规定磁盘的种类DW		9				; 规定FAT的长度(必须是9个扇区)DW		18				; 规定一个磁道的扇区个数(必须18个)DW		2				; 规定磁头数(必须2个)DD		0				; 不使用分区,必须为0DD		2880			; 重新确定磁盘大小为2880个扇区DB		0,0,0x29		; 教程也不知道这是什么DD		0xffffffff		; たぶんボリュームシリアル番号DB		"HELLO-OS   "	; 磁盘的名称DB		"FAT12   "		; 磁盘的格式RESB	18				; 空出18个字节;程序主体DB		0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7cDB		0x8e, 0xd8, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8aDB		0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09DB		0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xebDB		0xee, 0xf4, 0xeb, 0xfd; 信息显示部分DB		0x0a, 0x0a		;俩次换行DB		"hello, world"DB		0x0a			; 换行DB		0RESB	0x1fe-$			; 自动填写0x00,直到0x001feDB		0x55, 0xaa; 启动区以外部分输出DB		0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00RESB	4600DB		0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00RESB	1469432

在里面的"hello, world"也可以换为其他字符串,一样可以显示出来,比如俗的不能再俗的 i love you
在这里插入图片描述

对汇编语言的指令说明在注释2

收获

忙了一天,多少有点收获,现在我可是精通代码的抄写、能够熟练使用复制粘贴…emm 多少了解了代码的执行过程,了解了一点点汇编语言,搞明白了镜像文件、批处理文件,对CPU处理数据的原理有了一定认识,会使用二进制编辑器,而且今天搜集了很多火影壁纸…帅气的第七班
在这里插入图片描述

注释


  1. 要知道所有在计算机上的文件、程序实质上都是一堆二进制数,而计算机所执行的所有操作都是这一堆二进制数来控制的,理论上利用二进制编辑器可以编写任意的文件或者软件,所以本文利用二进制编辑器来编写了一个helloos.img镜像文件。 ↩︎

  2. :这是个注释命令,相当于C中的注释符//
    DB:DB指令是define byte的缩写,意为往文件中直接写入一个字节,当然,也可以结合双引号""来写字符串
    RESB:意为省略字节,但省略的字节都是0x00,如RESB 7意为空出7个字节
    DW:是define word的缩写,计算机世界中word=16位,即俩个字节,所以DW意为写俩个字节
    DD:是define double-word的缩写,意为写四个字节
    TAB:TAB=4代表设置缩进4位
    $:美元符号,是个变量,代表当前的字节数,利用其可以控制代码中0x00的个数 ↩︎

这篇关于【写一个操作系统】1—hello world重出江湖的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/386475

相关文章

高效管理你的Linux系统: Debian操作系统常用命令指南

《高效管理你的Linux系统:Debian操作系统常用命令指南》在Debian操作系统中,了解和掌握常用命令对于提高工作效率和系统管理至关重要,本文将详细介绍Debian的常用命令,帮助读者更好地使... Debian是一个流行的linux发行版,它以其稳定性、强大的软件包管理和丰富的社区资源而闻名。在使用

龙蜥操作系统Anolis OS-23.x安装配置图解教程(保姆级)

《龙蜥操作系统AnolisOS-23.x安装配置图解教程(保姆级)》:本文主要介绍了安装和配置AnolisOS23.2系统,包括分区、软件选择、设置root密码、网络配置、主机名设置和禁用SELinux的步骤,详细内容请阅读本文,希望能对你有所帮助... ‌AnolisOS‌是由阿里云推出的开源操作系统,旨

五大特性引领创新! 深度操作系统 deepin 25 Preview预览版发布

《五大特性引领创新!深度操作系统deepin25Preview预览版发布》今日,深度操作系统正式推出deepin25Preview版本,该版本集成了五大核心特性:磐石系统、全新DDE、Tr... 深度操作系统今日发布了 deepin 25 Preview,新版本囊括五大特性:磐石系统、全新 DDE、Tree

Linux操作系统 初识

在认识操作系统之前,我们首先来了解一下计算机的发展: 计算机的发展 世界上第一台计算机名叫埃尼阿克,诞生在1945年2月14日,用于军事用途。 后来因为计算机的优势和潜力巨大,计算机开始飞速发展,并产生了一个当时一直有效的定律:摩尔定律--当价格不变时,集成电路上可容纳的元器件的数目,约每隔18-24个月便会增加一倍,性能也将提升一倍。 那么相应的,计算机就会变得越来越快,越来越小型化。

1、简述linux操作系统启动流程

1、简述linux操作系统启动流程 启动第一步--加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它。这是因为BIOS中包含了CPU的相关信息、设备启动顺序信息、硬盘信息、内存信息、时钟信息、PnP特性等等。开机时将ROM中的指令映射到RAM的低地址空间,CPU读取到这些指令,硬件的健康状况进行检查,按照BIOS中设置的启

操作系统是怎么为不同的程序分配所需的内存空间的

操作系统为不同的程序分配内存空间的过程涉及多个关键步骤,确保每个程序都有其所需的内存资源,同时避免程序之间的冲突。以下是操作系统如何为程序分配内存空间的详细过程: 1. 内存管理的基础概念 虚拟内存:现代操作系统使用虚拟内存机制来为程序提供隔离的内存空间。每个程序运行在其独立的虚拟地址空间中,这使得程序间的内存互不干扰。物理内存:实际的 RAM(随机存取存储器),由操作系统和硬件共同管理。虚拟

操作系统安全保护

操作系统安全概述 概念:满足安全策略要求,具有响应安全机制及安全功符合特定安全标准,在一定约束条件下 能抵御常见网络安全威胁,保障自身安全运行及资源安全 安全等级:根据安全功能和安全保障要求分为 用户自主保护级  系统审计保护级 安全标记保护级 结构化保护级 访问验证保护级 操作系统作用: 负责计算系统的资源管理、支撑和控制各种应用程序运行,为用户提供计算机系统管理接口 是构成网络信息

【Spring boot】编写代码及测试用例入门之 Hello Spring boot _踩坑记

先贴下目录: 这是我从 start.spring.io 里下载的依赖Web的模板 // DemoApplication.javapackage com.abloume.springboot.blog.demo;import org.springframework.boot.SpringApplication;import org.springframework.boot.autocon

【JFinal】IDEA+maven上手JFinal之Hello World!

一、New Project 1、在 IDEA 环境下新建 Project 项目 2、选择创建 Maven 项目,并且不使用模板 3、输入 Maven 的 GroupId 和 ArtifactId 4、输入项目名称 二、将当前 Project 改为 POM 工程 将项目的 jfinal-web-demo 作为项目的 parent 工程,用于定义 maven 依赖包的版本信息、