自己动手写操作系统
lhq9220
这个作者很懒,什么都没留下…
展开
-
使用Dos运行Com文件
Background:由于往软盘里写的时候,引导区最大才刚刚512B,所以当我在往下练习的过程中,不能将所有的代码都写入软盘了,否则就得自己写跳转代码,现在还不够水平,先尽量减少复杂度吧,将写好的代码,把初始运行地址改为:org 0100h。汇编为.com文件,准备在bochs的原创 2011-07-23 15:23:44 · 2781 阅读 · 0 评论 -
汇编和C代码之间的互相调用
在汇编和C代码之间的互相调用的时候,现阶段会有使用对方的函数和变量两种类型的引用,下面对其进行试验并总结。 汇编调用C的函数,首先c语言的函数必须是全局的也就是不能声明为static的。然后在汇编中使用extern关键字将其在代码中声明,最后调用过程中,汇编代码负责将参数原创 2011-08-29 14:22:55 · 2807 阅读 · 0 评论 -
Loader的整体结构
loader 的整体结构。1 loader被bootSector加载到了BaseOfLoader,偏移地址OffsetOfLoader。 纯物理地址BaseOfLoaderPhyAddr。2 loader的功能0----调用中断,将得到的原创 2011-08-30 11:55:21 · 910 阅读 · 0 评论 -
写引导扇区所得
引导扇区的作用:首先引导扇区是位于磁盘的第一个扇区内的,系统启动时如果从此磁盘加载会直接读这第一个扇区,然后由第一个扇区中的代码加载“加载操作系统的Loader”,这样再跳转到Loader内执行。引导扇区的主要思路:读取假设为Loader.bin的文件,我写的时候是按原创 2011-08-21 17:08:22 · 899 阅读 · 0 评论 -
自己动手写汇编总结得到的
1 先说对变量、标签的使用和命名汇编中有几种对地址标签的分法,算是在概念上的分类,方便大家的理解。分别为:LABEL变量名LABEL:意思是我指向的就是一大块的首地址,使用方法:LABEL_NAME:(注意后面要加冒号)命名方式,尽量使用Java中的类原创 2011-08-08 21:32:01 · 3415 阅读 · 0 评论 -
x386保护模式下的特权级互相跳转小结
特权级别互相跳转:从内-->外 -------使用ret命令/或者retf命令实现长返回。(短返回和长返回是不一样的,主要是当时入栈时候cs要不要入栈),其实这里用的是带特权级变化的长返回进行特权级别跳转的。从外-->内--------使用门,但是因为在特别级别之间互相原创 2011-07-28 01:00:25 · 1101 阅读 · 0 评论 -
在Bochs的虚拟机中的FreeDos中调试保护模式的程序
平时在FreeDos里面要调试保护模式的程序还要安装Host。这个比较复杂,不会。比较简单的方式,在代码中添加xchg bx, bx并在bochs.bxrc中添加magic_break: enabled=1,这样的话就可以实现当遇到保护模式无法用Dos中的debug进行调原创 2011-08-11 14:18:10 · 1988 阅读 · 1 评论 -
一个很好的对8086cpu的Assembly的编写和调试教程&&Flags Register
重点推荐:http://www.armory.com/~rstevew/Public/Tutor/Debug/index.html老外写的东西就是好。原创 2011-08-08 10:38:21 · 831 阅读 · 0 评论 -
第五章扩充内核后的代码部署小结
ot| |-- boot.asm| |-- include| | |-- fat12hdr.inc| | |-- load.inc| | `-- pm.inc| `-- loader.asm|-- include--原创 2011-09-02 10:50:03 · 755 阅读 · 0 评论 -
写makefile时候的思路
1 在写之前,首先要知道makefile的一些基本的知识。即最常用到的知识。最好是对照着一些教学案例,简单的和稍微复杂点的稍微练习一下。2 自己真正的动手写的时候,因为makefile就是一个树状依赖生成的,不妨从最终的targets层层分解。写好每层需要执行的代码,然后不断原创 2011-08-31 16:05:15 · 646 阅读 · 0 评论 -
如何写Descriptor的属性
每次写完了gdt的一条entry的时候,总是很痛苦到底该写什么属性,而且偶尔会拉下一些属性。对Descritpor进行仔细研究过之后,发现只有3个字节是用来描述的属性的,并且这3个字节的各个位代表什么已经很清楚了,所以个人感觉每次在写属性的时候,无非是对这些属性的每一位进原创 2011-08-31 22:25:49 · 687 阅读 · 0 评论 -
如何添加LDT到GDT中
LDT=local descriptor table 是多任务的雏形。(写给自己看的,路过的勿骂)首先说明下GDT,gdt=global descriptor table。保护模式下的索引每个段的表。gdt中每一项为一个entry称之为descriptor描述符,使用select原创 2011-07-26 23:58:59 · 1235 阅读 · 0 评论 -
自己对保护模式下的描述符的理解
1 实模式下,段值还是可以看做地址的一部分的,段值XXXXh表示以XXXX0h开始的一段内存。2 而在保护模式下,虽然段值仍然由原来16位的cs,ds等寄存器表示,但此时它仅仅变成了一个索引,这个索引指向一个数据结构的一个表项,表项中详细定义了段的起始地址,界限,属性等内容。而原创 2011-07-23 21:30:00 · 712 阅读 · 0 评论 -
使用Assembly和c联合写kernel的时候,新的理解
对unsigned char gdt_ptr[6]数组的操作汇编中:sgdt [gdt_ptr]--------[]符号使得汇编的时候将其汇编成 sgdt ds:gdt_ptr。这样在保护模式下才能访问到正确的内存地址。C中:想取出gdt_ptr[0-1]两个字节原创 2011-08-30 22:51:57 · 1039 阅读 · 0 评论