【操作系统】半小时写一个微型操作系统-写一个启动扇区并且导入到软盘镜像中

这篇具有很好参考价值的文章主要介绍了【操作系统】半小时写一个微型操作系统-写一个启动扇区并且导入到软盘镜像中。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.什么是启动扇区

        我们使用软盘来启动操作系统时,系统首先就是从软盘的第一个扇区中开始读取数据,也就是第0面,0磁道的第0个扇区,软盘的每个扇区为512个字节的大小,如果最后两个字节为0xaa55(当BIOS看到这两个字节时,就认为是引导扇区的结束标志),则代表该两个字节前的机器指令都是启动扇区的指令,以0x00开头一直到0xaa55这512个字节的扇区就称之为启动扇区

【操作系统】半小时写一个微型操作系统-写一个启动扇区并且导入到软盘镜像中

二.引导扇区的程序编写

        代码(程序名称为boot.S)以及注释如下:

.code16
.text
        mov     %cs,%ax
        mov     %ax,%ds  
        mov     %ax,%es  #将寄存器ds和es同时指向与cs相同的段,使得后续在进行数据操作时能定位到正确的位置
        call    DispStr  #调用DispStr函数
        jmp     .  #进入死循环
DispStr:  
        mov     $BootMessage,%ax
        mov     %ax,%bp
        mov     $16,%cx
        mov     $0x1301,%ax
        mov     $0x00c,%bx
        mov     $0,%dl
        int     $0x10
        ret
BootMessage:.ascii  "Hello, OS world!"
.org    510
.word   0xaa55

        DispStr函数的注释如下:

DispStr:  
        mov     $BootMessage,%ax #将字符串变量“BootMessage”的首地址传给寄存器ax
        mov     %ax,%bp #使用寄存器ES:BP保存字符串的地址
        mov     $16,%cx  #保存字符串的长度
        mov     $0x1301,%ax #寄存器ax高位为 0x13h,低位为0x01h
        mov     $0x00c,%bx #设置页号为0(高位0X0h),字符串颜色为红色高亮(低位0x0ch)
        mov     $0,%dl
        int     $0x10 #10h号中断
        ret

         剩下的代码注释如下:

BootMessage:.ascii  "Hello, OS world!"  #字符串函数
.org    510  #用0x00填满剩下的字节,一直到第510个字节
.word   0xaa55  #剩下的两个字节填0xaa55

三.连接脚本的编写

        要想将一个程序编译成可执行文件,我们需要经过类似中间代码生成、连接等步骤(可以参考之前写过的一篇文章:【c语言】从高级语言到可以执行的EXE程序的编译过程),所以,在编译之前,我们还需要编写一个连接脚本(名称为solrex_X86.ld),代码如下:

SECTIONS
{
. = 0x7c00;
.text :
{
  _ftext = .;
} = 0
}

        当BIOS发现了引导分区(以0xaa55结尾的前512个字节的扇区)之后,就会把这512个字节的内容转载到内存的0000:7c00处(可以参考之前写过的一篇文章:【操作系统】操作系统的启动都干了些什么),然后跳转到0000:7c00处将控制权彻底交给这段引导代码中,所以该连接脚本的功能就是在进行连接时,将程序入口设置到内存0000:7c00的位置,而如果我们希望将代码放置到其他地址空间时,就可以直接修改连接脚本的地址即可。

四.Makefile脚本编写

        下一步我们编写Makefile脚本,用于将高级语言(.S)编译成中间文件(.o),再将连接脚本(.ld)和中间文件(.o)连接编译成可执行文件(.elf),最后将可执行文件写入到软盘镜像中(.img),代码如下:

CC=gcc
LD=ld
LDFILE=solrex_X86.ld  #连接脚本
OBJCOPY=objcopy

all: boot.img

boot.o: boot.S  #生成中间文件
        $(CC) -c boot.S

boot.elf: boot.o  #连接脚本+中间文件=可执行文件
        $(LD) boot.o -o boot.elf -e c -T$(LDFILE)

boot.bin: boot.elf  #移除可执行文件中没有用到的块
        @$(OBJCOPY) -R .pdr -R .comment -R.note -S -O binary boot.elf boot.bin

boot.img: boot.bin   #生成软盘镜像
        @dd if=boot.bin of=boot.img bs=512 count=1
        @dd if=/dev/zero of=boot.img skip=1 seek=1 bs=512 count=2879

clean:
        @rm -rf boot.o boot.elf boot.bin boot.img

        使用指令:

make

        进行编译,输出如下:

【操作系统】半小时写一个微型操作系统-写一个启动扇区并且导入到软盘镜像中

         最后即生成一个软盘镜像(boot.img)和一些中间文件:

【操作系统】半小时写一个微型操作系统-写一个启动扇区并且导入到软盘镜像中

 五.虚拟机VXBox开启镜像

        我们在虚拟机上新建一个虚拟电脑,然后按照推荐一直点下一步:

【操作系统】半小时写一个微型操作系统-写一个启动扇区并且导入到软盘镜像中

       创建完成后,我们选择虚拟电脑的“设置”项,添加一个虚拟软盘:

【操作系统】半小时写一个微型操作系统-写一个启动扇区并且导入到软盘镜像中

         点击”添加虚拟软驱“,然后点击”注册“,将你先前编译的boot.img进行注册操作:

【操作系统】半小时写一个微型操作系统-写一个启动扇区并且导入到软盘镜像中

         注册完成后选择对应的软盘镜像,即可保存退出:

【操作系统】半小时写一个微型操作系统-写一个启动扇区并且导入到软盘镜像中

        为了让系统优先导入我们的软盘镜像,我们可以将控制器:IDE整个删除,使得我们的镜像处于最高优先级:

【操作系统】半小时写一个微型操作系统-写一个启动扇区并且导入到软盘镜像中

        最后我们直接点击“启动”,即可看见先前编写的字符串黑底红字!!

【操作系统】半小时写一个微型操作系统-写一个启动扇区并且导入到软盘镜像中

        恭喜!你已经踏入了编写操作系统的第一步!文章来源地址https://www.toymoban.com/news/detail-414337.html

到了这里,关于【操作系统】半小时写一个微型操作系统-写一个启动扇区并且导入到软盘镜像中的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 操作系统权限维持(三)之Windows系统-启动项维持后门

    系列文章 操作系统权限维持(一)之Windows系统-粘贴键后门 操作系统权限维持(二)之Windows系统-克隆账号维持后门 启动项,操作系统在启动的时候,自动加载了很多程序。会在前台或者后台运行,进程表中出现了很多的进程。也许有病毒或木马在自启动行列。 添加启动项

    2023年04月09日
    浏览(45)
  • 【Linux】使用 UEFI 的操作系统启动过程

    参考书籍《Beyond BIOS: Developing with the Unified Extensible Firmware Interface Third Edition》 BIOS(Basic Input/Output System,基本输入输出系统)是一段 存储在主板上(ROM)的固件 (firmware), 它是计算机加电后执行的第一个程序,负责进行硬件自检(POST,Power-On Self Test),检查CPU、内存、硬

    2024年02月09日
    浏览(32)
  • 银河麒麟服务器操作系统设置网卡自启动

    操作环境:虚拟机 系统版本:Kylin-Server-10-SP2-x86-Release-Build09-20210524 问题现象 新安装的银河麒麟服务器操作系统,开机网卡不自启动,需要手动点击一下,才能启动网卡 现象图如下所示 解决方案 注:网卡名需要提前确认好,可以点击网络图标查看自己使用的是哪块网卡,以

    2024年02月06日
    浏览(158)
  • 如何在 Ubuntu 操作系统上重新启动 Nginx?

    Nginx 是一个常用的开源的高性能 Web 服务器和反向代理服务器。在使用 Nginx 时,有时需要重新启动该服务,以应用配置更改或解决某些问题。本文将详细介绍在 Ubuntu 操作系统上重新启动 Nginx 的不同方法和技巧。 systemctl 命令是在 Ubuntu 上管理系统服务的标准工具。要重新启动

    2024年02月07日
    浏览(41)
  • 操作系统启动相关概念(BIOS、MBR、GPT、BRUB)

            不管是 Windows 还是 Linux 操作系统,底层设备一般均为物理硬件,操作系统启动之前会对硬件进行检测,然后硬盘引导启动操作系统,如下为操作系统启动相关的各个概念。         基本输入输出系统(Basic Input Output System,BIOS)是一组固化到计算机主板上的只

    2024年02月16日
    浏览(38)
  • 操作系统实验-添加一个内核模块

    参考用书: 《操作系统实践:基于Linux的应用与内核编程》 一.添加一个内核模块 1.1需求分析 对于一个应用程序而言,源代码经编译后与标准运行库链接,通过系统调用执行操作系统内核中的特权指令,指令返回的结果通过系统调用返回给用户,完成程序。 由于Linux是单内

    2024年02月05日
    浏览(44)
  • 银河麒麟V10服务器操作系统网卡自启动配置

    背景:公司因为项目变更,使用国产服务器。因为第一次使用,在其中遇到的问题,与诸君分享。 问题现象:         服务器重启开机网卡不自动启动问题。需要手动点击一下,才能启动网卡。 现象图:   解决方案:  修改网卡配置文件,设置为开机自启动就可以解决

    2024年03月16日
    浏览(116)
  • excel启动时显示“操作系统当前的配置不能运行此应用程序”

    excel启动时显示“操作系统当前的配置不能运行此应用程序” 程序:Office2016版中的excel程序 我在安装office2016版本的时候,由于c盘空间实在不太够,所以我选择通过更改注册表的方式改到D盘下安装office的主体程序,安装完成并成功注册后,我挨个打开office内的word、ppt与exce

    2024年02月06日
    浏览(71)
  • 解决 office安全模式启动失败,操作系统当前配置不能运行此程序(已解决)

    解决Excel问题 以安全模式启动失败,操作系统当前配置不能运行此程序。卸载不全,重装仍然存在问题的。 一、官方卸载重装方式(我没成功) 进入页面 微软office卸载官方工具 查看内容 官方 卸载工具:「SetupProd_OffScrub官方office卸载.exe」https://www.aliyundrive.com/s/qamRzngvHs7 点击

    2024年02月05日
    浏览(51)
  • 银河麒麟桌面操作系统V10-常见运维问题类别:启动登录 01

    目录 1.1 系统桌面启动时加载插件失败 【问题现象】 【解决方案】 1.2 启动配置文件损坏导致系统启动失败 【问题现象】 【解决方案】  1.3 系统启动卡死在 Logo 界面 【问题现象】 【解决方案】 1.4 系统登录界面多次输错密码导致账户锁定 【问题现象】 【解决方案】 1.5 系

    2024年02月15日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包