随笔分类 -  自己动手写操作系统

操作系统
<自已动手写操作系统>进程实现 (转载)
摘要:<自已动手写操作系统>进程实现 进程也许是计算机科学史上最成功的人造概念之一,以前看其它的操作系统书时,也总是浓墨重彩,但遗憾的是,除了留一下点印象,始终无法形成形象思维,究其原因,通常上来就是抽象概念定义,接着是锁,信号量之类的,基本的都没有理解,后面的基本上也是扯蛋了。本书这一章的亮点是不空谈理论,先引导读者稍微思考一下本质问题,再马上进入实战。 我们的程序以文件的形式存储在磁盘上,本质上就是一堆二进制编码,究竞要怎么样才能在计算机上运行?从计算机的角度来说,必须首先把程序加载到内存,并设置好相应的寄存器值,其中包括代码段,数据段,堆栈段。我们怎样知道这一块二进制编码那些是数据 阅读全文

posted @ 2011-05-18 08:52 wanghj_dz 阅读(479) 评论(0) 推荐(0)

protect.c 详细解释
摘要:/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ protect.c++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Forrest Yu, 2005++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/#include "type.h"#include "const.h"#include 阅读全文

posted @ 2011-05-17 10:55 wanghj_dz 阅读(954) 评论(0) 推荐(0)

进程(转载)
摘要:http://hi.baidu.com/6121017/blog/item/529f3916dae89d54f3de32f8.html【进程】一、 多进程运行 何谓进程。进程就是指某个时刻CPU执行的一个任务。该任务有独立的CPU环境、以及资源内存等数据。 在单任务的DOS系统时,所有任务的资源、内存、CPU环境都是共享的,只要其中某个任务改变了这些共享的数据,那么所有任务的环境就都跟着变了。这样的操作实在不好控制,如果想要每个进程都拥有独立的资源、内存、CPU环境。该如何去实现呢?这里就要对进程进行调度,简称进程调度, 这是多任务操作系统的特性!!!在多大数情况下PC机上只有一个CPU,那么 阅读全文

posted @ 2011-05-16 16:13 wanghj_dz 阅读(325) 评论(0) 推荐(0)

【进程续】(转载)
摘要:http://hi.baidu.com/6121017/blog/item/529f3916dae89d54f3de32f8.html【进程续】一、进程的启动:现在我们已经熟悉了启动一个进程的需求和主要步骤,它的动作也就是:×准备IDT、TSS、LDT(该LDT描述符在GDT中。但是LDT局部的描述符在进程表的ldts[LDT_SIZE]字段中.)初始化IDT,也就是定义好GATE描述符。将其0门描述符对应IRQ0(VECTOR),也就是按386模式规定的中断异常处理机制。接着自己定义0x20向量对应8259A的主片IRQ0,0x28对应8259A的从片IRQ8.这需要自己对8259 阅读全文

posted @ 2011-05-16 16:02 wanghj_dz 阅读(352) 评论(0) 推荐(0)

中断与进程分析(转载)
摘要:http://blog.sina.com.cn/s/blog_48ed03c80100mh4u.html操作系统实践之中断程序分析%macro hwint_master 1 call save in al, INT_M_CTLMASK or al, (1 << %1) out INT_M_CTLMASK, al mov al, 20h out 20h, al sti push %1 call [irq_table+4*%1] ;调用真正的处理函数 add esp, 4 cli in al, INT_M_CTLMASK and al, ~(1 << %1) out INT 阅读全文

posted @ 2011-05-16 15:36 wanghj_dz 阅读(454) 评论(0) 推荐(0)

原来进程是这样切换的(转载)
摘要:http://www.cppblog.com/myjfm/archive/2011/01/09/138216.html/***********************支持原创*************************/下面这个结构就是最简陋不过的一个进程表(又称进程控制块,我更习惯于它)。typedef struct process_struct{ STACKFRAME registers; int16 ldt_selector; DESCRIPTOR ldt[LDT_SIZE]; int32 pid; char pname[32];}PROCESS;这个结构的开始是另外一个结构STA 阅读全文

posted @ 2011-05-16 15:21 wanghj_dz 阅读(386) 评论(0) 推荐(0)

第六章 :进程
摘要:第六章 :进程,妈的终于推进到进程了。我们需要一个数据结构记录进程的状态,在进程要被挂起的时候,进程信息就被写入这个数据结构,等到进程重新启动的时候,这个信息重新被读出来。诱发进程切换的原因不只一种,比较典型的是发生了时钟中断。当时钟中断时,中断处理程序将会把控制权交给进程调度模块。这时如果系统认为应该进行进程切换,进程切换就发生了,当前进程的状态就会被保存起来,队列中的下一个进程将被恢复执行。最简单的进程一个进程正在运行,这时候时钟中断发生了,特权级从ring1跳到ring0,开始执行时钟中断处理程序,中断处理程序这时调用进程调度模块,指定下一个应该运行的进程,当中断处理程序结束时,下一个进 阅读全文

posted @ 2011-05-16 08:37 wanghj_dz 阅读(377) 评论(0) 推荐(0)

一个中断产生和处理的完整流程,以UD2指令产生的#UD中断为例。
摘要:UD2指令,产生一个中断,该中断使处理器把eflags,cs,ip等压入堆栈。ud2指令的bochs调试地址为:0x30430同时产生一个中断向量,根据中断向量在IDT中寻找该向量的选择子,跟据这个选择子找到处理函数。处理之。ud2指令产生中断向量号是0x06,根据0x06,找到inval_opcode()函数,根据函数名跳到inval_opcode跳到inval_opcode:这个地址处,执行:push0xFFFFFFFF; no err code作为exception_handler()的参数使用push6; vector_no= 6作为exception_handler()的参数使用jm 阅读全文

posted @ 2011-05-16 00:03 wanghj_dz 阅读(1877) 评论(0) 推荐(0)

作为一个操作系统,进程毫无疑问是最基本也是最重要的
摘要:我们的下一个重大目标应该是实现一个进程。再进一步,我们应该逐渐拥有多个进程。如果从进程本身的角度来看,它只不过是一段执行的代码。这样看来它跟我们已经实现的代码没有本质的区别可是,如果从操作系统的角度来看,进程必须是可控制的,所以这就涉及到进程和操作系统之间的转换。因为cpu只有一个,同一个时刻要么是客户进程在运行,要么是操作系统在运行,我们应该清楚,如果实现进程需要一种控制权转换机制,这种机制就是中断。------------------------------------------------------------------------------现在该给这些中断和异常的处理程序统统加 阅读全文

posted @ 2011-05-15 16:18 wanghj_dz 阅读(373) 评论(0) 推荐(0)

扩充内核 start.c 、kernel.asm详细解释
摘要:在前面堆栈,esp,GDT等内容还在Loader中,为了方便控制,我们得把它们放进内核才行。/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ start.c++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Forrest Yu, 2005++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/#include "type 阅读全文

posted @ 2011-05-15 12:50 wanghj_dz 阅读(791) 评论(0) 推荐(0)

nl DB 13, 10, '$' ,int 21h详解
摘要:nl DB 13, 10, '$'13是回车10是换行'$'表示已经到了字符串尾,不在打印字符了。int 21 调用参数 返回参数AH=09 显示字符串DS:DX=串地址,'$'结束字符串AH=0A 键盘输入到缓冲区DS:DX=缓冲区首地址 (DS:DX)=缓冲区最大字符数(DS:DX+1)=实际输入的字符数#make_COM# ORG 100H ; set data segment: MOV AX, CS MOV DS, AX MOV ES, AX; input a string: MOV DX, OFFSET s1 MOV AH, 0AH I 阅读全文

posted @ 2011-05-15 09:37 wanghj_dz 阅读(1131) 评论(0) 推荐(0)

详细解读Kernal.bin的elf文件格式
摘要:kernal.bin文件的EFL Head主要是要注意这两个信息:e_entry=30400H 程序入口地址 e_phnum=1h Program header table中只有一个条目 kernel.bin的Program header主要注意这三个信息:p_offset=0h 该段在文件中的偏移 p_vadddr=30000h 该段在内存中的地址 p_files=40Dh 该段的大小 阅读全文

posted @ 2011-05-14 18:35 wanghj_dz 阅读(467) 评论(0) 推荐(0)

以foobar可执行文件为例,详解解释ELF文件格式
摘要:foobar文件的ELF header。7F454C46表示这是一个ELF文件。e_type=02 表明它是一个可执行文件e_machine=03 表明运行该程序需要的体系结构为Intel 80386e_version 这个成员确定文件的版本e_entry程序的入口地址。文件foobar的入口地址为0x80480A0e_phoffProgram Header Table在文件中的偏移量(以字节计数)这里的值为0x34.e_shoff Section Header Table在文件中的偏移量(以字节计数)。这里的值为0x0190e_ehsize ELF Header大小(以字节计数)。这里的值为 阅读全文

posted @ 2011-05-14 15:14 wanghj_dz 阅读(730) 评论(0) 推荐(0)

InitKernel代码详解
摘要:; InitKernel --------------------------------------------------------------------------------- bochs断点:0x000905ba; 将 KERNEL.BIN 的内容经过整理对齐后放到新的位置; 遍历每一个 Program Header,根据 Program Header 中的信息来确定把什么放进内存,放到什么位置,以及放多少。; ------------------------------------------------------------------------------------- 阅读全文

posted @ 2011-05-14 13:54 wanghj_dz 阅读(564) 评论(0) 推荐(0)

第五章 内核雏形大总结(转载)
摘要:http://hi.baidu.com/6121017/blog/item/2a849ef3c34fc755342acc37.html【总结】【操作系统内核工程】2008年04月27日 星期日 00:37【总结内核框架】×麻雀虽小五脏俱全,这个系统框架主要分3大块。下面就一个一个来细说:一、Boot.bin区(引导代码块):从开机到BIOS自检,然后BIOS把主控制权交给Boot.bin!!!Boot.bin的设计是这样的:【×头文件区】1、fat12hdr.inc(FAT12磁盘格式。这是我们文件系统格式头).里面就是一个简单的FAT12文件系统的引导扇区格式结构体.它决 阅读全文

posted @ 2011-05-14 11:40 wanghj_dz 阅读(598) 评论(0) 推荐(0)

汇编中参数的传递和堆栈修正(转载罗云彬)
摘要:在 Win32汇编中,我们经常要和 Api 打交道,另外也会常常使用自己编制的类似于 Api 的带参数的子程序,本文要讲述的是在子程序调用的过程中进行参数传递的概念和分析。一般在程序中,参数的传递是通过堆栈进行的,也就是说,调用者把要传递给子程序(或者被调用者)的参数压入堆栈,子程序在堆栈取出相应的值再使用,比如说,如果你要调用 SubRouting(Var1,Var2,Var3),编译后的最终代码可能是push Var3push Var2push Var1call SubRoutingadd esp,12也就是说,调用者首先把参数压入堆栈,然后调用子程序,在完成后,由于堆栈中先前压入的数不再 阅读全文

posted @ 2011-05-13 12:39 wanghj_dz 阅读(1069) 评论(0) 推荐(0)

第四章调试问题。用bochs调试boot.asm
摘要:第四章的调试开始有点困难,没有摸到门道。后来陡然有了感觉,发现bochs用a.img启动时,停在了bios的开始的f000:fff0这个地方,有一句代码:jmp far f000:e05bs 后发现 xor ax,ax| out 0x0d,al 等等都是对硬件操作的代码,其中会把软驱中引导扇区的代码,拷贝到0000:7c00h所以灵感乍现,何不用bochs在0000:7c00h处下个断点看看呢、赶紧下了一个断点:vb 0x0000:0x7c00c过去,发现代码是mov ax,cs 哈哈终于看到boot.asm的代码了,可以用bochs调试boot.asm代码了。好高兴啊。u /100 查看并找 阅读全文

posted @ 2011-05-12 22:17 wanghj_dz 阅读(702) 评论(0) 推荐(1)

第四章:LABEL_FILENAME_FOUND,LABEL_GOON_LOADING_FILE,GetFATEntry ,ReadSector四段代码一起详细解释
摘要:LABEL_FILENAME_FOUND:; 找到 LOADER.BIN 后便来到这里继续movax, RootDirSectors ;mov ax,14anddi, 0FFE0h; di -> 当前条目的开始adddi, 01Ah; di -> 首 Sectormovcx, word [es:di] ;mov cx,3 通过bochs调试本例中是3pushcx; 保存此 Sector 在 FAT 中的序号addcx, ax ; 3+14addcx, DeltaSectorNo; cx <- LOADER.BIN的起始扇区号3+14+17=34,34是loader.bin的起 阅读全文

posted @ 2011-05-12 21:51 wanghj_dz 阅读(403) 评论(0) 推荐(0)

详细注释GetFATEntry(转载)
摘要:转载与http://daikof622.wordpress.com/2009/12/18/%E6%B3%A8%E9%87%8Agetfatentry/花了将近两天的时间,反复比对书上的概念和网上前辈们的总结,总算把这段代码给搞清楚了。(这里使用的是FAT12软盘结构)函数GetFATEntry。参数存放在ax寄存器中,表示一个簇号。输出结果是该簇号在FAT表中的FATENTRY,它的内容仍然是一个簇号,表示文件下一部分所在簇的簇号。这里要仔细地体会“簇号”和“簇”之间的差别,否则在看代码的时候,很容易就会迷失。“簇”表示一个或多个扇区的集合。FAT12中,一个簇就是一个扇区,512字节。簇号, 阅读全文

posted @ 2011-05-12 14:55 wanghj_dz 阅读(675) 评论(0) 推荐(0)

汇编cld ,std语句
摘要:清除方向标志,在字符串的比较,赋值,读取等一系列和rep连用的操作中,di或si是可以自动增减的而不需要人来加减它的值cld即告诉程序si,di向前移动std指令为设置方向,告诉程序si,di向后移动 阅读全文

posted @ 2011-05-12 13:18 wanghj_dz 阅读(2729) 评论(0) 推荐(0)

导航