30u盘能做系统吗?
(2.0u盘能做系统盘吗?
第一天直接写了一个“操作系统”的二进制文件,详细在:https://www.toutiao.com/a7003704649312141836
因为写二进制文件不方便,太繁琐,因此,我们使用编译器。编译器可以将汇编语言编译成二进制机器代码,然后直接编写汇编,然后用编译器生成二进制文件。这大大提高了人们的编程效率。这大大提高了人们的编程效率。
因此,第二天我们用汇编语言重写了操作系统。
第二天我们用汇编语言写了操作系统https://www.toutiao.com/a7005537960355512839
然而,用汇编语言写操作系统的效率仍然太慢。为了提高写作操作系统的效率,我们在第03天将其汇编为C语言。程序代码地址如下:https://gitee.com/-/ide/project/mingminglaoshi/MakeComputerOperateSystemin30Days/edit/master/-/projects/03_day/harib00j/bootpack.c
由于C语言出现在计算机发展积累了一段时间后,因此,要用C来写操作系统,需要配合汇编语言做一些铺垫工作。具体铺垫工作是什么?具体铺垫工作是什么?外围硬件的初始化,以及CPU芯片内部寄存器的初始化。
更详细地了解前置知识:
在操作系统之前,计算机做了什么?
主要看以上第三条:
BIOS 有一个写死的代码,会帮助我们把启动区的第一个区域 512 字节内容原封不动地复制到内存中 0x7c00 这个位置,跳到这里,这个不需要我们管。
详见:https://blog.csdn.net/sinat_34560749/article/details/104060723
也就是说,BIOS里面已经固化了一段代码,它会把磁盘上的512字节的内容复制到内存的0x7c00的位置。它只复制512字节。它只复制512字节。
如果准备用C写操作系统,512字节是不够的,因为他只有512Bytes,太小了。所以我们会用这个512b内存做一些准备工作,操作系统的真实功能,大部分功能不会在这个512字节。
所以,这512KB我们称之为启动区的空间。在计算机执行操作系统的代码之前,先操作512KB512KB在内部程序中,我们设置了一些寄存器,并在程序结束时跳转到实际操作系统的代码。
启动区和操作系统综上所述,首先要完成启动区的程序,其次要完成操作系统的程序。
那么启动区应该写些什么呢?启动区程序能用C语言吗?
启动区程序的功能:
从软盘/磁盘/U复制操作系统的代码,如磁盘/硬盘到内存位置0x8200处,然后就跳转到0x8200处开始执行
启动区的程序是复制功能和一些设置功能,所以似乎可以用汇编和C来写,但最终我们选择了汇编来写。由于C语言设置寄存器状态不方便汇编。
操作系统代码的功能:
首先:设置硬件状态、显示状态等,键盘状态,cpu寄存器周围的状态等
二:实现鼠标、键盘、显示屏等硬件的组织调用
要设置硬件状态、显示状态等,需要调用BIOS,而BIOS是工作在CPU16位模式的,C语言在工作CPU32位模式决定了操作系统不能全部C写。操作系统有一些基本功能,需要在16位模式中编写。
也就是说,启动区后的操作系统应该用汇编和C来写。
也就是说,启动区后的操作系统应该用汇编和C来写。
然后,操作系统前的启动区程序负责将操作系统代码从存储介质复制到内存,并用汇编语言编写。代码量不大。设置硬件也很容易。因此,启动区的程序是用汇编编写的。
启动区代码解释
计算机启动后,就会出现BIOS将磁盘上的512字节程序复制到内存0x7c然后跳到0x7c00处执行。
512字节程序的作用是将真实操作系统的代码复制到内存的0x8200处,然后跳转到0x8200开始执行。
为什么叫它启动区?因为它将真正的操作系统代码复制到内存中。
那么 BIOS512代码也被复制B为什么内容进入内存?BIOS不叫启动区?
如果512字节能放下一个操作系统,BIOS合适的代码叫启动区。
目前,操作系统的代码远远超过512字节。
因此,启动区这个名字属于512字节。
在启动磁盘/U等待盘/光盘前512字节BIOS调用程序。以软盘为例,代码如下ipl10.nas:
1 ; haribote-ipl 2 ; TAB=4 3 4 CYLS EQU 10 ; 设置软磁盘结束柱面号,软磁盘0-10柱表面的操作系统 5 6 ORG 0x7c00 ; 在内存中放置代码的0x7c00处 7 8 ; 以下是标准FAT描述12格式软盘 9 10 JMP entry 11 DB 0x90 12 DB "HARIBOTE" ; 设置扇区名称 13 DW 512 ; 设置扇区的大小 一个扇区有多少?betys,对于软磁盘,必须是512 14 DB 1 ; 集群大小 15 DW 1 ; FAT从第一扇区开始 16 DB 2 ; FAT的个数 17 DW 224 ; 根目录最多有224个条目 18 DW 2880 ; 2888扇区驱动器 19 DB 0xf0 ; 媒体类型 20 DW 9 ; FAT每个区域有9个扇区 21 DW 18 ; 一个柱面有多少扇区? 22 DW 2 ; 磁头数目 23 DD 0 ; 磁盘分区数0 24 DD 2880 ; 2888有2888扇区 25 DB 0,0,0x29 ; 26 DD 0xffffffff ; 当前FAT序列号的格式 27 DB "HARIBOTEOS " ; 磁盘名称 28 DB "FAT12 " ; 文件格式名称 29 RESB 18 ; 不操作当前18个字节 30 31 32 entry: 33 MOV AX,0 ;用AX对寄存器SS初始化 34 MOV SS,AX 35 MOV SP,0x7c00 36 MOV DS,AX 37 38 ; 读磁盘 39 40 MOV AX,0x0820 41 MOV ES,AX 42 MOV CH,0 ;柱面0 43 MOV DH,0 ;磁头0 44 MOV CL,2 ;扇区2 45 readloop: 46 MOV SI,0 ;记录失败次数 47 retry: 48 MOV AH,0x02 ; AH=0x02 :读磁盘 49 MOV AL,1 ; 1个扇区 50 MOV BX,0 51 MOV DL,0x00 ; A驱动器 52 INT 0x13 ; 调用磁盘BIOS 53 JNC next ; 成功阅读,跳转next,去读区下一个扇区 54 ADD SI,1 ; 读区失败,记录失败次数:SI 1 55 CMP SI,5 ; 若失败次数SI>五、读取失败,跳转到error 56 JAE error ; SI >= 5 57 MOV AH,0x00 ; 重置驱动器 58 MOV DL,0x00 ; A 驱动器 59 INT 0x13 ; 调用AH=0x中断程序:重置驱动器 60 JMP retry 61 next: 62 MOV AX,ES ;获取当前内存地址 63 ADD AX,0x0020 ;内存地址 0x0020 64 MOV ES,AX ; ADD ES,0x020 65 ADD CL,1 ; CL 1,扇区 1 66 CMP CL,18 ; 比较CL 18.检查18扇区是否到达 67 JBE readloop ; CL <= 18 18扇区尚未读取,继续读区数据 68 MOV CL,1 ; 如果已经到了18个扇区,扇区设置为1 69 ADD DH,1 ; 磁头 1 70 CMP DH,2 ; 对比磁头与2 71 JB readloop ; DH < 2.继续复制小磁头和2 72 MOV DH,0 ; 磁头>2,将磁头设置为0 73 ADD CH,1 ; 柱面 1 74 CMP CH,CYLS ; 对比柱面与 CYLS=10 75 JB readloop ; CH