基于Archlinux vmware和qemu和bochs实现操作系统
vscode用来调试和操作
bochs 用于模拟真实的cpu和硬件结构的软件,便于观察和调试每一行汇编,寄存器做了什么操作。
qemu 用于快速开发测试内核,不需要直接去把Linux部署到真实的开发板就可以实现编译运行,有模拟的io设备。
在实模式中未进入保护模式,使用BIOS中断服务(ROM中写好的服务)常见的服务。在一般的Linux中被驱动程序替代
-
int 0x10
显示字符/图形(视频服务) -
int 0x13
读写硬盘(磁盘服务) -
int 0x16
键盘输入(键盘服务) -
int 0x15
系统配置(内存检测)
操作系统引导程序(bootloader)
[org 0x7c00];告诉汇编器将这个装入0x7c00位置初始化显示和寄存器
-
初始化显示和寄存器
- 初始化显示 使用BIOS中断0x10(视频服务),向ah写入0x0e,向al写[si]。si存的是要显示的字符。用print去显示 -
打印提示信息
通过上述逻辑,向si写入数据,并将si数据写入al; -
从硬盘读取扇区到内存
调用BIOS的int 0x13 -
验证数据正确性
比较0x55aa是否为主引导扇区的首数据
[org 0x 1000] ;同上主引导程序包括内存检测、加载保护模式、保护模式、读取硬盘信息放入内存、初始化内存信息、初始化gdt(全局描述符)
-
判断主引导扇区数据并打印
主要做主引导扇区是否为55aa然后打印 -
物理机器内存检测(detect_memory)
调用BIOS的ards系统调用去获取物理内存分布,以便于进入保护模式和加载内核去 -
加载保护模式(prepare_protected_mode)
修改状态位,加载全局描述符gdt并jmp到保护模式 -
保护模式
初始化各种通用寄存器(ax,ds,es,fs,gs,ss)。 去修改esp(修改栈顶) -
读取硬盘信息
通过寄存器去加载内核,循环读取扇区,从0x1f0读取到EDI所指的位置 -
内存的相关参数
memory_base(基地址),memory_limit(内存中可以存的页面数) -
gdt的相关参数
gdt_base gdt_end通过汇编符号偏移量去以及每次运行时放入的绝对地址确定此时物理地址
各种系统文件的头文件
各种文件的实现
主要用于标准库输入输出
-
基本工具
delay(u32 count); //忙等待延时 hang(); //阻塞系统挂起 bcd_to_bin(u8 value) //bcd码二进制用于输入时间 bin_to_bcd(u8 value) //用于输出时间 div_round_up(u32 num,u32 size)//用于计算页面的数目
char *strcpy(char *dest,const char *src);//从
char *strcat(char *dest,const char *src);
size_t strlen(const char *str);
int strcmp (const char*lhs,const char *rhs);
char *strchr(const char *str,int ch);
char *strrchr(const char *str,int ch);
int memcmp (const void *lhs,const void *rhs,size_t count);
void *memset(void *dest,int ch,size_t count);
void *memcpy(void *dest,const void *src,size_t count);
void *memchr(const void * ptr,int ch,size_t count);