
30天自制操作系统
文章平均质量分 65
川合秀实著
刘仕豪
操作系统行业从业者,开源精神,希望可以推动科技进步。
展开
-
30天自制操作系统:第六天:代码架构整理与中断处理
1.拆开bootpack.c文件。 根据设计模式将对应的功能封装成独立的文件。 2.初始化pic: pic(可编程中断控制器): 在设计上,cpu单独只能处理一个中断。 而pic是将8个中断信号集合成一个中断信号的装置。 只要有一个中断信息进来,就将唯一的输出管脚信号变成ON。后期扩充到了15个, 使用了主从PIC。 8259a可编程中断控制器介绍:https://blog.youkuaiyun.com/navysniper/article/details/4380306 初始化pic代码: void init原创 2021-04-07 11:41:55 · 272 阅读 · 2 评论 -
30天自制操作系统:第五天:文字显示与GDT/IDT初始化
第五天:文字显示与GDT/IDT初始化 1.从内存中读出保存的值. 昨天程序中300x200都是直接写入程序,本来应该从asmhead.nas先前保存的值中取,不然当画面模式改变时,系统就挂了. 所以得修改bootpack.c文件代码从asmhead.nas写入的内存中取值. 2.显示字符 原理:将每一个bit当成一个黑点,那么,字符a就可以当成下图所示: 那么字符a要显示赋值给显卡的话,用字符数组表示就变成: static char font_A[16]= {0x00,0x18, 0x18, 0x18原创 2020-10-30 16:36:23 · 458 阅读 · 0 评论 -
30天自制操作系统:第四天:系统界面绘制
第四天:操作系统界面绘制 OUT:让cpu给设备发送电信号. IN:让cpu从设备获取电信号. 为了区别不同的设备,要使用设备号码,用port表示. pushad: 将所有的32位通用寄存器压入堆栈 pusha:将所有的16位通用寄存器压入堆栈 pushfd:然后将32位标志寄存器EFLAGS压入堆栈 pushf::将的16位标志寄存器EFLAGS压入堆栈 popad:将所有的32位通用寄存器取出堆栈 popa:将所有的16位通用寄存器取出堆栈 popfd:将32位标志寄存器EFLAGS取出堆栈 popf:原创 2020-10-23 10:49:50 · 1049 阅读 · 1 评论 -
30天自制操作系统:第三天
对第二天代码进行了修改,只打印hello ,uos没一点意思。 读取磁盘上10个柱面的1-18个扇区,(目前ssd已经没有柱面这个概念了)。读出来的数据放入内存0x8200起始的地方。 启动区放在0x8000内存扇区中。为什么要放在0x8000以后的内存中的呢? 只是因为这块内存没有用而已。 为什么要将启动程序(img的0扇区)放在0x7c00处? 这是ibm规定的。 向一个空软盘保存文件时: 1.文件名会写在0x002600以后的地方。 2.文件内容会写在0x004200以后的地方。 所以若想启动原创 2020-10-20 13:28:35 · 633 阅读 · 0 评论 -
30天自制操作系统:第二天
30天自制操作系统:第二天 1.将扇区加载到指定内存中。 在第一天的基础上进行代码的加工,第二天给程序中加入将引导扇区读入指定内存地址:0x7c00处,并使用软中断显示字符。 出现了一个问题,发现0扇区内出现莫名其妙的数据,经过分析,是编译器自己写入的启动数据。 优化后的代码为: ; hello-os ; TAB=4 ORG 0x7c00 ; このプログラムがどこに読み込まれるのか JMP entry entry: MOV AX,0 ; 初始化寄存器 MOV SS,AX原创 2020-10-13 16:36:41 · 373 阅读 · 1 评论 -
30天自制操作系统:第一天
因为咱们的目的是为了研究操作系统的组成,所以暂时略过bootloader的启动部分。 直接从系统启动的第二阶段的主引导记录开始。 前提是将编译工具放在该文件目录的同级目录下,该工具为日本人川合秀实自制的编译程序,优化过的nasm编译工具。 写入以下汇编代码生成img文件,然后使用qemu虚拟机启动。 ; hello-os ; TAB=4 DB 0xeb, 0x4e, 0x90 DB "HELLOIPL" ;必须是8个字节 DW 512 ;一个扇区的大小 DB 1 DW 1 ;原创 2020-10-12 15:50:49 · 481 阅读 · 2 评论