交流
商城
MCN
登入
注册
首页
提问
分享
讨论
建议
公告
动态
发表新帖
发表新帖
1 在bios中打印Hello, World!
分享
未结
0
1018
李延
LV6
2022-06-10
悬赏:20积分
# 1 准备环境 我们本章目标为,在一个没有操作系统的虚拟机上输出Hello, World!字符 我们整个环境分为编译环境与 运行环境 ## 1.1 编译环境 编译环境就是将我们写的汇编与c语言编译为可运行的二进制文件。具体环境为: 操作系统: centos7 (64位) 编译器:gnu gcc 4.8.5 ## 1.2 运行环境 运行环境为我们二进制文件具体运行的地方,这里我们使用虚拟机运行我们的系统。需要安装 - windows 系统 - Bochs (虚拟机,运行我们的文件) - WinHex (二进制编辑器,查看我们的二进制文件) [Bochs-win64-2.7](https://www.lioyan.cn/data/Bochs-win64-2.7.exe) [WinHex](https://www.lioyan.cn/data/WinHex_20.4_SR-5_Single.exe) 将上述几个软件安装完成后我们开始 在没有系统的虚拟机上输出一下“Hello, World!” # 2 编译代码 ## 2.1 准备汇编代码 准备如下代码汇编代码,文件名为: bootsect.s ```asm .code16 .global _start .equ BOOTSEG, 0x07c0 # original address of boot-sector _start: mov $BOOTSEG,%ax mov %ax,%es mov $0x03, %ah # read cursor pos xor %bh, %bh int $0x10 mov $13, %cx mov $0x0007, %bx # page 0, attribute 7 (normal) mov $msg1, %bp mov $0x1301, %ax # write string, move cursor int $0x10 msg1: .string "Hello, World!" .org 510 boot_flag: .word 0xAA55 ``` ## 2.2 编译 代码 将我们的汇编代码在编译环境中进行编译 ```shell as --32 -o bootsect.o bootsect.s ld -m elf_i386 -Ttext 0 -o bootsect bootsect.o OBJCOPY -R .pdr -R .comment -R.note -S -O binary bootsect ``` 这样我们就得到一个名为bootsect 的二进制文件 # 3 准备虚拟硬盘 在“我的电脑” 右键选择 “管理”,打开 磁盘管理 ![image-20220610135844890](https://www.lioyan.cn/img/image-20220610135844890.png) 创建一个vhd 格式虚拟硬盘 ![image-20220610135917336](https://www.lioyan.cn/img/image-20220610135917336.png) 点击确定后,就可以在我们选择的位置看到一个vhd 文件,这个就是我们创建的虚拟硬盘, 点击分离,使windos与我们新创建的虚拟硬盘脱离,因为后面我们要自己编辑它,不分离的化将不能编辑 ![image-20220610140829341](https://www.lioyan.cn/img/image-20220610140829341.png) # 4 将我们的代码写入到虚拟硬盘 使用 WinHex 打开我们创建的虚拟硬盘 ![image-20220610140237819](https://www.lioyan.cn/img/image-20220610140237819.png) ![image-20220610140253359](https://www.lioyan.cn/img/image-20220610140253359.png) 这个时候我们看到刚创建的硬盘内容全为00,下一步就需要将我们的代码写入到这里 我们同样用winHe打开 我们的bootsect 文件,入下图 ![image-20220610140517383](https://www.lioyan.cn/img/image-20220610140517383.png) 将整个文件内容复制到虚拟硬盘中,并保存 ![image-20220610141258777](https://www.lioyan.cn/img/image-20220610141258777.png) # 5 创建虚拟机 打开Bochs 选择:DIsk&Boot ,点击Edit,编辑配置 ![image-20220610141404601](https://www.lioyan.cn/img/image-20220610141404601.png) 切换到如图位置 ![image-20220610142807796](https://www.lioyan.cn/img/image-20220610142807796.png) 选择disk,并在下面选项指定刚刚的虚拟磁盘文件 ![image-20220610142823639](https://www.lioyan.cn/img/image-20220610142823639.png) ![image-20220610142916043](https://www.lioyan.cn/img/image-20220610142916043.png) 设置磁盘的柱面、磁头、扇区 。这里先按照如图填写,后面我们再详细说明 ![image-20220610142959523](https://www.lioyan.cn/img/image-20220610142959523.png) 设置boot为dist方式加载 ![image-20220610143110883](https://www.lioyan.cn/img/image-20220610143110883.png) 完成后点击确定,关闭配置页面 之后我们可以通过save保存我们的配置,方便下次打开 ![image-20220610143150695](https://www.lioyan.cn/img/image-20220610143150695.png) # 6 启动虚拟机 点击start 运行虚拟机 ![image-20220610143237512](https://www.lioyan.cn/img/image-20220610143237512.png) 之后就可以看到我们打印的字符串了 ![image-20220610143310409](https://www.lioyan.cn/img/image-20220610143310409.png) # 7 fixvhdw 软件介绍 前面我们是通过粘贴复制将我们的代码复制到虚拟硬盘上的,太过于麻烦。我们可以使用fixvhdw,来写入 [fixvhdw](https://www.lioyan.cn/data/FixVhdw.zip) 点击选择,选择我们的vhd文件 ![image-20220610143721481](https://www.lioyan.cn/img/image-20220610143721481.png) 这里出现了这个文件的柱面信息,就是我们之前启动虚拟机时,需要的内容 在数据文件1 选择我们编译的文件 ![image-20220610143909966](https://www.lioyan.cn/img/image-20220610143909966.png) 之后我们就可以直接将我们的代码写入到硬盘了。 ![image-20220610143933684](https://www.lioyan.cn/img/image-20220610143933684.png) # 8 在VMware中运行 在日常中,我们常用的虚拟机是VMware,所以这里演示一下在VMware运行情况 选择新建虚拟机: ![image-20220610144508853](https://www.lioyan.cn/img/image-20220610144508853.png) 选择 “自定义” ![image-20220610144623291](https://www.lioyan.cn/img/image-20220610144623291.png) 之后选择稍后按照系统 ![image-20220610144654841](https://www.lioyan.cn/img/image-20220610144654841.png) 之后一直下一步,到选择虚拟磁盘处,选择 现有虚拟磁盘 ![image-20220610144804005](https://www.lioyan.cn/img/image-20220610144804005.png) 选择我们刚刚的文件,之后 不转换格式 ![image-20220610144832212](https://www.lioyan.cn/img/image-20220610144832212.png) 完成虚拟机的创建,启动虚拟机 ![image-20220610144942009](https://www.lioyan.cn/img/image-20220610144942009.png) 可以看到我们输出的字符
回帖
消灭零回复
提交回复
热议榜
java 相关知识分享
8
好的程序员与不好的程序员
6
写给工程师的十条精进原则
5
spring boot以jar包运行配置的logback日志文件没生成
5
一步一步分析SpringBoot启动源码(一)
5
MockMvc测试
5
【吐槽向】是不是有个吐槽的板块比较好玩
4
logstash jdbc同步mysql多表数据到elasticsearch
3
IntelliJ IDEA 优质License Server
3
.gitignore忽略规则
3
SpringBoot启动源码分析
3
一步一步分析SpringBoot启动源码(三)
3
2
一步一步分析SpringBoot启动源码(二)
2
积分不够将无法发表新帖
2
官方产品
Meta-Boot - 基于MCN
MCN - 快速构建SpringBoot应用
微信扫码关注公众号