2011年5月16日

第六章 :进程

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

posted @ 2011-05-16 08:37 wanghj_dz 阅读(370) 评论(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 阅读(1658) 评论(0) 推荐(0) 编辑

2011年5月15日

作为一个操作系统,进程毫无疑问是最基本也是最重要的

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

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

扩充内核 start.c 、kernel.asm详细解释

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

posted @ 2011-05-15 12:50 wanghj_dz 阅读(752) 评论(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 阅读(1090) 评论(0) 推荐(0) 编辑

2011年5月14日

详细解读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 阅读(455) 评论(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 阅读(686) 评论(0) 推荐(0) 编辑

InitKernel代码详解

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

posted @ 2011-05-14 13:54 wanghj_dz 阅读(544) 评论(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 阅读(582) 评论(0) 推荐(0) 编辑

2011年5月13日

汇编中参数的传递和堆栈修正(转载罗云彬)

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

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

导航