摘要:boot代码中指示从0磁头0驱动区号0磁道第2扇区开始读取head代码到0x1000:0处,但是我怎么把编译出来的head代码放到磁盘的该位置呢?dd if=boot of=boot.img bs=32 skip=1此句以BlockSize=32Byte把boot写入boot.img,跳过一个输入Block(32Bytes),也就是跳过boot文件头.dd if=head of=boot.img bs=512 seek=1此句以BlockSize=512Byte把head写入boot.img,跳过一个输出Block,也就是跳过512Byte的boot,写入boot.img
阅读全文
摘要:再过两天就要回学校了,在家花了差不多半个月时间(边玩边看)终于把《自己动手写操作系统》的前六章看完了,感觉还不错,因为之前一段时间看了linux0.12内核不少时间,基础知识差不多已经打好了。看了《自己动手》有点心得,这本书其实是很简单的,怎么说呢,它实现的是一个很小的系统,只把重要的大致框架搭起来了,内容其实不是很饱满,对于想亲手实践下的比较好,但是本书不适合新手入门,有些地方没有讲清楚就直接用了,建议大家看第二版。看过之后和linux0.12对比起来,这本书简直是简单的不能再简单了,但本书的保护模式讲的不错,只要懂保护模式,其他就都懂了
阅读全文
摘要:程序的运行从boot-->loader-->kernel这整个过程中代码都运行在特权级0(最高特权级),进程工作的特权级1(即低特权级),当然这是出于安全性的考虑,如果不考虑安全性,进程完全可以工作在特权级0.1. 第一个问题,要从高特权级向低特权级转变,怎么转变呢?这里用到一个人工模拟的中断返回(iretd),这里有个小疑问根据我的了解,iret和iretd都可以表示中断返回,书中是用的iretd,不知道为什么,当然这并不影响我们对全局的了解,嗯,继续,首先我们要把将要运行在特权级1上的进程所需的寄存器准备好,这个准备好怎么理解呢,具体来说,cs中保存的是将要从ring0跳转到r
阅读全文
摘要:很短,但是感觉有必要把它记下来今天无意中看到一篇日志,http://www.ruanyifeng.com/blog/2013/02/booting.html,上面有句话让我有点感悟,“计算机启动是一个很矛盾的过程:必须先运行程序,然后计算机才能启动,但是计算机不启动就无法运行程序!……必须想尽各种办法,把一小段程序装进内存……”在<<自己动手写操作系统>>中是有那么一段程序,需要把程序的入口地址处的一段代码直接复制到内存的某一位置,然后让程序从该位置开始执行,但不是这篇文章所说的boot,而是loader,我想这应该是某种习惯吧,也不知道对不对,望大家指正
阅读全文
摘要:转自:http://www.cnblogs.com/wanghj-dz/archive/2011/05/14/2046210.html分析的很好; InitKernel ---------------------------------------------------------------------------------bochs断点:0x000905ba; 将 KERNEL.BIN 的内容经过整理对齐后放到新的位置; 遍历每一个 Program Header,根据 Program Header 中的信息来确定把什么放进内存,放到什么位置,以及放多少。; --------------
阅读全文
摘要:自己动手写操作系统中免不了要写软盘镜像,刚开始就知道一个dd命令,但是不好用啊找了半天资料,终于算是知道怎么回事了首先,可以使用本书自带的工具(汗,一直没有注意)还可以下一个winimage,这是个好使的东西,首先你要新建一个软盘,一般是1.44M,然后写引导扇区,即把自己的boot.bin写进去(有一个引导扇区属性),然后才是添加文件,把loader.bin 和kernel.bin都添加进去,你会发现,当查看软盘镜像文件的时候你找不到boot.bin
阅读全文
摘要:跟上篇日志中间又隔了好几天,懒惰啊 1 寻找LOADER.BIN文件的大体思路为: 2 LOADER.BIN文件存储在A盘中,我们知道A盘的格式是FAT12格式,具体格式见书本P103,其主要是有引导扇区 3 、FAT1区、FAT2区、根目录区(长度不固定,需要计算)和 数据区组成。引导扇区放的就是我们写的引导代码 4 boot.bin文件,我们的LOADER.BIN文件是放在数据区中的,而文件的文件名是放在根目录中,因此,如果我 5 们想查看该盘是否含有我们想要的文件时,我们应该先到根目录中查看是否含有该文件名,如果有,说明该盘存 6 在该文件,那么下面可以从盘中读取该文件了。 7 文件在盘
阅读全文
摘要:操作步骤,虽然很简单,但是以后要经常用,还是写下笔记吧首先用bximage创建一个1.44M软盘。然后把写好的boot.bin文件写入到软盘的引导扇区具体命令:dd if=boot.bin of=a.img bs=512 count=1然后是写一个配置文件,然后运行,在linux下可以写一个脚本脚本代码是:#!/bin/shbochs -q -f bochsrc.bxrc
阅读全文
摘要:稍微写了下注释 1 ; ========================================== 2 ; pmtest8.asm 3 ; 编译方法:nasm pmtest8.asm -o pmtest8.com 4 ; ========================================== 5 6 %include "pm.inc" ; 常量, 宏, 以及一些说明 7 8 PageDirBase0 equ 200000h ; 页目录开始地址: 2M 9 PageTblBase0 equ ...
阅读全文
摘要:先说下我配的环境,msdos622,vpc2007,当我在执行pmtest7的时候,崩溃,无法执行,在此之后,我又通过bochs配置了环境,可以调试.com程序(见上一篇博客),调试了良久(不太会调试,bochs有些调试还是不会)模模糊糊知道是哪错了,我在下面帖出来,还请高手指正 1 ; ========================================== 2 ; pmtest7.asm 3 ; 编译方法:nasm pmtest7.asm -o pmtest7.com 4 ; ========================================== 5 ...
阅读全文
摘要:1.自己下载一个bochs的安装包,我装的是windows版本的,里面自带的有一个bochsdbg.exe的软件,就是用他来调试我们的保护模式程序2.在oldlinux里面有赵老师提供的一个PMode-FreeDOS-041214.zip包,里面包含着有一个已经编译好了的dos系统,系统里面含有debug.exe的调试工具,软件包里面可能还有其他的东东,但是我暂时还没用到,所以也不是很清楚...3.把你编译好的保护模式的汇编源码文件拷贝到软盘映像里面去,然后创建一个run.bat的批处理文件<"C:\Program Files\Bochs-2.2.1\bochsdbg"
阅读全文
摘要:“一致”的意思是这样的,当转移目标是一个特权级更高的一致代码段,当前的特权级会被延续下去,而向特权级更高的非一致代码段转移会引起常规保护错误,除非使用调用门或者任务门。如果系统代码不访问受保护的资源和某些类型的异常处理,它可以放在一致代码段中。为避免低特权级的程序访问而被保护起来的系统代码则应放到非一致代码段中。要注意的是,如果目标代码的特权级低的话,无论它是不是一致代码段,都不能通过call或者jmp转移进去,尝试这样的转移会导致常规保护错误。所有的数据段都是非一致的,这意味着不可能被低特权级的代码访问到。然而,与代码段不同的是,数据段可以被更高特权级的代码访问到,而不需要使用特定的门,记住
阅读全文
摘要:以前看的都是理论,今天拿起《自己动手写操作系统》,把其中的一个小例子改了一个验证自己的理解是否正确原本是这样的 1 ; ========================================== 2 ; pmtest1.asm 3 ; 编译方法:nasm pmtest1.asm -o pmtest1.com 4 ; ========================================== 5 6 %include "pm.inc" ; 常量, 宏, 以及一些说明 7 8 org 0100h 9 jmp LABEL_BEGIN10 11 ...
阅读全文
摘要:原来看得都是赵博的书,讲的很详细,理论性很强,最近想动手实践下,看《自己动手写操作系统》第三章的一个例子,突然发现gdt和gdtr可以这么得来赵博的书上,这两个东西是直接设定好的(一直认为也要这么做)。今天就来说下,《自己动手写操作系统》这本书是怎么实现的我主要说gdt和gdtr其他的都简单 1 ; ========================================== 2 ; pmtest1.asm 3 ; ±àÒë·œ·š£ºnasm pmtest1.asm -o pmtest1.com 4 ;
阅读全文