自制操作系统系列(四):进入64位模式

本文介绍如何在自制操作系统中从32位模式切换到64位模式,探讨内存地址映射问题和模式切换的原因。通过修改构建脚本和ASM代码,实现了64位模式的初始化和loader.bin的加载执行。遇到问题后选择直接引用已有实现以避免浪费时间,为后续开发提供基础。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

在上篇中从初始启动文件中加载了loader文件进行执行,本篇将在loader进行CPU模式切换,进入64位模式

工具添加

迫于无奈,在N次尝试后,需要在《30天自制操作系统》书中的一些工具进行辅助,清单大致如下:

  • edimg.exe : 类似一个修改iso文件的工具,可以将文件添加到已经生成的iso文件中,缺点就是只能添加单个文件(在书中看目前作者意思是将C编译处理后得到的汇编码和loader汇编码进行合并,如果能添加多个文件,那也不用合并吧,哎,目前尝试下来是不能添加多个)
  • fdimg0at.tek: edimg.exe 的辅助文件,具体作用不详

上个两个工具都会同步到仓库中

关于为什么要进行模式切换

在看两本书和查资料总结下来,个人感觉核心是内存地址映射问题:

CPU虽然有寄存器,但也就只有有限的几个,而我们的程序数据很大,不可能都放到寄存器中,所以大部分数据都放到了内存中

而CPU访问内存中的数据需要数据所在的地址,这个数据的内存地址是用CPU的寄存器进行保存的

寄存器的每一位是用0和1表示,那16位寄存器能表示的最大的地址范围是:2的16次方,32位就是2的32次方,64位就是2的64次方

32位大约是4G,64位很大很大了(学到这解了我以前老电脑为啥只能支持4G内存,而新电脑现在都能加到32G的疑惑)

构建脚本修改

如果使用图形化的工具,比如winiso,手动修改iso文件进行添加的话,也能达到目的,但不能写完代码后一键运行,太影响效率了(目前感觉还是一键运行比较好,也尝试了通过python脚本修改,但在window11下有点问题,哎,令人发愁的环境问题)

目前改为如下:编译两个asm文件,然后用edimg将文件制作成iso镜像,最后运行

运行结果如下:

在这里插入图片描述

相关代码修改

每天早上起来一个小时就在折腾,然而并没有什么用,要不就是不运行,要不就是一直闪屏,最后就是一直循环,搞的我都崩溃了

自己参考并抄他们一部分代码跑不动,没有办法,只能直接抄全部了,所以myOS.asm和loader.asm都进行了修改,把《一个64位系统的设计和实现》中的前3章关于CPU模式切换的部分给抄了下来,具体的详情都在下面进行说明

myOS.asm

所有代码如下:

	org	0x7c00	

BaseOfStack	equ	0x7c00

BaseOfLoader	equ	0x1000
OffsetOfLoader	equ	0x00

RootDirSectors	equ	14
SectorNumOfRootDirStart	equ	19
SectorNumOfFAT1Start	equ	1
SectorBalance	equ	17	

	jmp	short Label_Start
	nop
	BS_OEMName	db	'MINEboot'
	BPB_BytesPerSec	dw	512
	BPB_SecPerClus	db	1
	BPB_RsvdSecCnt	dw	1
	BPB_NumFATs	db	2
	BPB_RootEntCnt	dw	224
	BPB_TotSec16	dw	2880
	BPB_Media	db	0xf0
	BPB_FATSz16	dw	9
	BPB_SecPerTrk	dw	18
	BPB_NumHeads	dw	2
	BPB_HiddSec	dd	0
	BPB_TotSec32	dd	0
	BS_DrvNum	db	0
	BS_Reserved1	db	0
	BS_BootSig	db	0x29
	BS_VolID	dd	0
	BS_VolLab	db	'boot loader'
	BS_FileSysType	db	'FAT12   '

Label_Start:

	mov	ax,	cs
	mov	ds,	ax
	mov	es,	ax
	mov	ss,	ax
	mov	sp,	BaseOfStack

;=======	clear screen

	mov	ax,	0600h
	mov	bx,	0700h
	mov	cx,	0
	mov	dx,	0184fh
	int	10h

;=======	set focus

	mov	ax,	0200h
	mov	bx,	0000h
	mov	dx,	0000h
	int	10h

;=======	display on screen : Start Booting......

	mov	ax,	1301h
	mov	bx,	000fh
	mov	dx,	0000h
	mov	cx,	10
	push	ax
	mov	ax,	ds
	mov	es,	ax
	pop	ax
	mov	bp,	StartBootMessage
	int	10h

;=======	reset floppy

	xor	ah,	ah
	xor	dl,	dl
	int	13h

;=======	search loader.bin
	mov	word	[SectorNo],	SectorNumOfRootDirStart

Lable_Search_In_Root_Dir_Begin:

	cmp	word	[RootDirSizeForLoop],	0
	jz	Label_No_LoaderBin
	dec	word	[RootDirSizeForLoop]	
	mov	ax,	00h
	mov	es,	ax
	mov	bx,	8000h
	mov	ax,	[Sector
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值