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


    简介

    在上篇中从初始启动文件中加载了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,	[SectorNo]
    	mov	
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
  • 相关阅读:
    Android—Surface,BufferQueue
    排序:快速排序(C/C++)
    【HMS core】【FAQ】典型问题合集7
    ReportLab创建合同PDF
    揭秘:为什么那么多公司都要招聘测试开发?
    Vue3 - reactive 复杂类型(通俗易懂,详细教程)
    Springboot集成JUnit5优雅进行单元测试
    PDF格式分析(七十五)——线型注释(Line)
    Quantexa CDI(场景决策智能)Syneo平台介绍
    洛谷P4799 [CEOI2015 Day2] 世界冰球锦标赛
  • 原文地址:https://blog.csdn.net/github_35735591/article/details/127818843