
编写操作系统之路
1. Orange's学习:代码:https://github.com/luchao2424631502/os
1emerald
wwwwwww
展开
-
c语言提取tar包内容
tar文件:以一定方式将多个文件合并成tar文件,不对文件进行压缩,tar文件格式 很 简单,每个文件前面+512字节的header,并且将所有文件叠放在一起header1–file1–header2–file2–header3–file3解包就是读取文件头得到文件大小,然后读取出文件就行了提取tar文件并存储#include <stdio.h>// #include <.h>#include <stdlib.h>#include <unistd.h原创 2020-09-18 23:19:07 · 2298 阅读 · 2 评论 -
Orange‘s chapter10缺少的elf.h文件定义
Orange’s操作系统源码chapter 10,缺少的elf.h文件以及get_kernel_map()函数elf.h只用到elf_header和section_header,以及魔数 (写出部分定义就可以,剩下的没用)#ifndef _ORANGES_ELF_H_#define _ORANGES_ELF_H_typedef u32 Elf32_Word,Elf32_Addr,Elf32_Off;typedef u16 Elf32_Half;/* ELF header */typed原创 2020-09-15 20:28:41 · 465 阅读 · 0 评论 -
Orange‘s:loader->kernel->中断(Minix)->进程(多)
从kernel.bin中根据elf文件格式执行内核加载kernel.bin步骤和加载loader.bin步骤一样,将kernel.bin加载到内存后,因为kernel的编译参数-Ttext 0x30400指定了程序入口(可以在/boot/include/load.inc中修改,并且修改kernel编译参数-Ttext就能加载到自己指定的内存地址处).因为**kernel被编译成elf格式,而非纯二进制,那么根据elf格式在把kernel程序段加载到内存中(program header中指定了,本书并未原创 2020-07-19 11:12:39 · 220 阅读 · 1 评论 -
Orange‘s:disp_str()字符串函数第二次调用乱码原因
书上.c编译参数加上-m32,LD链接参数-m elf_i386去掉此Bug后正好Makefile也完成了第2次调用disp_str()时乱码,Google后说是ebx没有进栈被保护的原因,果然没错,但是为什么呢?断点打到kernel起始执行地址:0x30400单步调试发现call cstart后如果第一次ebx被破坏后,第二次调用指向的参数地址错误,并且循环了多次调试信息:disp_str()第一次执行完毕后物理地址 0x304fdmemcpy()执行完毕物理地址: 0x3052.原创 2020-07-14 23:08:09 · 501 阅读 · 0 评论 -
Orange‘s:FAT12认识和Boot引导
前2章实验都是借助DOS提供保护模式环境来实验(因为在引导扇区512byte限制下提供不了保护模式),为了让OS进入保护模式而引导扇区又不能解决,通过boot把磁盘中的loader加载进内存,然后通过loader进入保护模式并且加载kernel这样就突破了512byte的限制boot->loader->kernel此书将软盘做成FAT12格式bximage制作1.44MB大小的fddd写入符合规则(BPB)的引导扇区则软盘被做成FAT12格式,(被dos或者linux识别后自动.原创 2020-07-12 11:02:52 · 355 阅读 · 0 评论 -
Orange‘s:保护模式小总结
Orange’s的中断方式我看了看和linux0.1x是一样的,时钟中断实验:回到实模式目前我认为没意义但是注意:a. 要求段寄存器高速缓冲器的属性(段长度)提前设置号b. cs通过在32bit代码段转跳到16bit代码段来设置(描述符)c. 直接修改jmp编译后指令的段地址d. 修改的8259A和IDTR需要恢复原样开启分页后人为使物理地址和线性地址对应,好操作通过宏填出描述符后,认为修改段基地址是很好的方法,宏定义各种描述符属性选择子起始就是偏移地址,因为 第几个*4原创 2020-07-10 18:21:42 · 387 阅读 · 1 评论 -
linux 0.12引导启动程序
引导启动程序91年16bit实模式的引导代码是Minix上的as86编译器编译的,现在改为as编译,进入32bit保护模式下后就是gas(现as)编译bootsect.S功能:将自己从0x7c00:0移动到0x9000:0处,并且读入setup.s(4*512=2kb)到自己后面将system模块读入到0x1000:0处,然后控制转移给setup.s在第一个扇区的倒数第6个字节开始分别是SWAP设备号和根文件系统设备号setup.S通过BIOS中断得到磁盘和内存的信息,以原创 2020-05-30 17:30:32 · 400 阅读 · 0 评论 -
Linux 0.1x所有环境搭建(bochs运行0.12内核+和0.12传递文件+编译运行简单例程)
环境搭建电脑环境:OS: Deepin 15.11 stableKernel: x86_64 Linux 4.15.0-30deepin-generic在bochs运行0.12内核bochs:apt install bochs(自己编译麻烦)默认安装目录:主(工作)目录:/usr/local/bin,作用:配置文件,磁盘和bochs img工具默认配置(没啥用:/usr/local/share/doc/bochs用到的BIOS ROM和显卡ROM:/usr/local/share/bo原创 2020-05-22 22:52:23 · 1868 阅读 · 0 评论