开发操作系统流程
2018年12月21日1.开发系统的主要流程
1.在windows(或其他)操作系统上编写代码。
2.用c语言编译代码,生成机器语言文件。
3.对机器语言文件进行加工,生成软盘映像文件。
4.将映像文件写入磁盘,做成包含系统的启动盘。
2.开发完成之后的img
怎么在Oracle VM VirtualBox
上运行?
在看30天自制操作系统中,笔者最后将文件写入软盘,看到这里我不经就傻逼了,但是看代码我们知道,是将文件写入a盘,还好平时看书多知道a盘是软盘,
1 |
..\z_tools\imgtol.com w a: helloos.img |
废话就不多说了,下面告诉你怎么用现代化的方式运行img
文件
1.创建一个虚拟机,(这里就不细说了,下一步下一步就可以,配置给小点就可以)
2.删除光驱驱动(可以不删除,但是我们用不上)
3.添加一个软盘
4.添加img
文件
5.运行
3.cpu的本质
cpu除了与别的电路进行电信号交换以外什么都不会,而且对于电信号,他也只能理解开(ON)和关(OFF),cpu就是一个集成电路板。
人类发明cpu是为了处理电信号,那个时候没有人能想到它后来会成为这么有用的机器。不过后来人们法向,一旦把电信号开(ON)/关(OFF)与数字0和1对应起来,就能将2进制转化为电信号,同时电信号也可以转换会2进制数,所以,算然cpu依然只能处理电信号,但他从此摇身一变,成了神奇的二进制计算机。
4.个人对汇编语言的感觉
汇编其实也是一种编程语言,只不过太低级,都是计算机的指令集,我在想那时候写代码的人还需要背指令集是不是很痛苦,然后通过汇编语言的汇编器
转换成机器码
(也就是二进制文件),变成可执行程序。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
DB 0xeb, 0x4e, 0x90, 0x48, 0x45, 0x4c, 0x4c, 0x4f DB 0x49, 0x50, 0x4c, 0x00, 0x02, 0x01, 0x01, 0x00 DB 0x02, 0xe0, 0x00, 0x40, 0x0b, 0xf0, 0x09, 0x00 DB 0x12, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00 DB 0x40, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x29, 0xff DB 0xff, 0xff, 0xff, 0x48, 0x45, 0x4c, 0x4c, 0x4f DB 0x2d, 0x4f, 0x53, 0x20, 0x20, 0x20, 0x46, 0x41 DB 0x54, 0x31, 0x32, 0x20, 0x20, 0x20, 0x00, 0x00 RESB 16 DB 0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7c DB 0x8e, 0xd8, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8a DB 0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09 DB 0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xeb DB 0xee, 0xf4, 0xeb, 0xfd, 0x0a, 0x0a, 0x68, 0x65 DB 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72 DB 0x6c, 0x64, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00 RESB 368 DB 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xaa DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 RESB 4600 DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 RESB 1469432 |
汇编指令解释
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 |
DB ;指令是data byte 的缩写,也就是往文件里直接写入一个字节(8 bit)的指令 DW ;指令是data word 的缩写,也就是往文件里直接写入二个字节(16 bit)的指令 DD ;指令是data double-word 的缩写,也就是往文件里直接写入四个字节(32 bit)的指令 MOV ;指令是 move 的缩写,英文意思是移动,其实是赋值,执行了MOV SS,AS之后 AS 没有空。 RESB ;指令是reserve byte 的缩写,如果我想要从现在的地址开始空出10个字节就可以写成 "RESB 10" ORG ;指令是origin 的缩写,这个指令会告诉nask,在开始执行的时候,把这些机器语言指令装载到内存中的那个地址,如果没有它,有的指令就不能正确的翻译执行 JMP ;指令时jump 的缩写意思是跳转,"entry"这是标签声明 0x ;代表16进制 $ ;代表变量可以告诉我们这一行现在的字节数 CPU 16 bit 寄存器 AX--accumulator 累加寄存器 CX--counter 计数寄存器 DX--data 数据寄存器 BX--base 基址寄存器 SP--stack pointer 栈指针寄存器 BP--base pointer 基指针寄存器 SI--source index 源变址寄存器 DI--destination index 目的变址寄存器 CPU 8 bit 寄存器 AL--accumulator low 累加寄存器低位 CL--counter low 计数寄存器低位 DL--data low 数据寄存器低位 BL--base low 基址寄存器低位 AH--accumulator high 累加寄存器高位 CH--counter high 计数寄存器高位 DH--data high 数据寄存器高位 BH--base high 基址寄存器高位 CPU 16 bit 附加段寄存器 ES--extra segment 附加段寄存器 CS--code segment 代码段寄存器 SS--stack segment 栈段寄存器 DS--data segment 数据段寄存器 FS--segment part 2 没有名称 GS--segment part 3 没有名称 |