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格式, 2020-07-19 编写操作系统之路
Orange‘s:disp_str()字符串函数第二次调用乱码原因 书上.c编译参数加上-m32,LD链接参数-m elf_i386 去掉此Bug后正好Makefile也完成了 第2次调用disp_str()时乱码,Google后说是ebx没有进栈被保护的原因,果然没错,但是为什么呢? 断点打到kernel起始执行地址:0x30400 单步调试发现call cstart后 如果第一次ebx被破坏后,第二次调用指向的参数地址错误,并且循环了多次 调试信息 2020-07-14 编写操作系统之路 于渊 操作系统 Orange S
Orange‘s:FAT12认识和Boot引导 前2章实验都是借助DOS提供保护模式环境来实验(因为在引导扇区512byte限制下提供不了保护模式), 为了让OS进入保护模式而引导扇区又不能解决,通过boot把磁盘中的loader加载进内存,然后通过loader进入保护模式并且加载kernel 这样就突破了512byte的限制 boot->loader->kernel 此书将软盘做成FAT12格式 bximage制作1. 2020-07-12 编写操作系统之路 于渊 操作系统 Orange S
Orange‘s:保护模式小总结 Orange’s的中断方式我看了看和linux0.1x是一样的,时钟中断实验: 回到实模式目前我认为没意义但是注意: a. 要求段寄存器高速缓冲器的属性(段长度)提前设置号 b. cs通过在32bit代码段转跳到16bit代码段来设置(描述符) c. 直接修改jmp编译后指令的段地址 d. 修改的8259A和IDTR需要恢复原样 开启分页后人为使物理地址和线性地址对应,好操作 通过宏 2020-07-10 编写操作系统之路
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个 2020-05-30 编写操作系统之路
Linux 0.1x所有环境搭建(bochs运行0.12内核+和0.12传递文件+编译运行简单例程) 环境搭建电脑环境: OS: Deepin 15.11 stable Kernel: x86_64 Linux 4.15.0-30deepin-generic 在bochs运行0.12内核 bochs:apt install bochs(自己编译麻烦) 默认安装目录: 主(工作)目录:/usr/local/bin,作用:配置文件,磁盘和bochs img工具 默认配置(没啥用:/usr/l 2020-05-22 编写操作系统之路
第16章分页机制 386层次化分页结构 页目录\页表\页 页目录 页表 都占用4KB的页,1024个项,每个项4Byte大小 页目录指向1024个页表,一个页表指向1024个页,一个页大小4KB,总的寻址大小是1024*1024*4KB=4GB 在CR0中开启分页机制后,cpu段部件给出的地址不再是物理地址,称线性地址,需要经过页部件的转换为物理地址 线性地址如何转换为物理地址 CR3寄存器存 2020-05-18 X86实模式和保护模式
第15章任务切换 通过调用门尽管进入R0的例程,但是并没有进行任务切换,只是控制转换到了任务的全局区域 任务切换的方法: 中断:未屏蔽情况下,任务切换随时发生,如定时器中断(准确的时间间隔发生),强制任务实施任务切换(就我现在的理解就是进程能够执行的时间片是相同的,超过了在处理器层面上任务要切换), 实模式在是内存最低端1KB的中断向量表,保护模式不再适用,取而代之的是中断描述符表 类似GDT和LDT来 2020-05-13 X86实模式和保护模式
第14章特权级(控制转换)和任务 任务和特权级保护任务的隔离和特权级保护程序:记录在载体上的指令和数据,正在执行的一个副本叫做任务(task) 为了有效在任务间实施隔离,每一个任务具有自己的描述符表,称为局部描述符表LDT(local):存放自己的段 那么: 类似GDTR,处理器中LDTR也是用来追踪LDT的 LDT的数量依据任务的多少/ 段选择子中的TI(table indicator) 0=GDT 1=LDT 2020-05-12 X86实模式和保护模式
第13章程序加载和动态执行 栈的描述符段界限大小的计算123456789mov dword [ebx+0x18],0x7c00fffe ;粒度为4KB mov dword [ebx+0x1c],0x00cf9600高: 0x00cf9600低: 0x7c00fffe线性地址:0x00007c00c:1100 ->4kb,操作数32bit,limit:0xffffe 96:1001_0110_B:数据段读写向下 2020-05-07 X86实模式和保护模式