05 2011 档案

模块、实例和任务
摘要:可从 Microsoft 下载中心下载以下文件:Mti.exe (http://download.microsoft.com/download/platformsdk/mti/3.1/w31/en-us/mti.exe) 有关如何下载 Microsoft 支持文件的其他信息请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章: 119591 (http://support.microsoft.com/kb/119591/EN-US/ ) 如何从联机服务获得 Microsoft 支持文件 Microsoft 扫描此文件的病毒。Microsoft 使用该文件已过帐的日期上获得的最新 阅读全文

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

Win32EXE.tpl 代码详解
摘要:WinMain proto :DWORD,:DWORD,:DWORD,:DWORD这是个函数原型声明。类似c语言中的 int WinMain(long a,long b,long c,long d);函数的返回值放在eax中返回。 阅读全文

posted @ 2011-05-30 09:50 wanghj_dz 阅读(298) 评论(1) 推荐(0)

vc窗口创建
摘要:vc窗口创建:进入winmain():设计,注册,产生,显示,更新,消息循环而在MFC中没有。当我们在编译链接的时候,由链接器将winmain()函数链接到我们的程序中。先跳到全局变量或全局对象再跳到全局对象的构造函数,为全局对象分配内存空间。然后才是winmain函数。CTestApp:CWinApp 表示的是一个应用程序类。{ CTestApp继承与CWinApp}进入CTestApp 类的构造文件中设置一个断点。CTestApp::CTestApp(){::是C++里的,是“域操作符”。比如声明了一个类A,类A里声明了一个成员函数void f(),但没有在类的声明里给出f的定义,那么在类 阅读全文

posted @ 2011-05-28 19:55 wanghj_dz 阅读(265) 评论(0) 推荐(0)

客户组件实现带cookies的POST
摘要:如果(客户1.连接("e.1dos.com",80)=真)数据包=子文本替换(编辑框5.内容,“【标题】”,编辑框3.内容,,,真)数据包=子文本替换(数据包,“【内容】”,编辑框4.内容,,,真) //改造cookies的后半段中的标题和内容编辑框1.内容=子文本替换(编辑框1.内容,“【长度】”,到文本(取文本长度(数据包)),,,真) //改造cookies前半段的长度数据包=编辑框1.内容+数据包 //合成完整的cookies客户1.发送数据(数据包) //发送cookies 阅读全文

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

通用对话框
摘要:.版本 2.子程序 _按钮2_被单击.局部变量 所有内容, 文本型.如果真 (通用对话框1.打开 ()) 编辑框4.内容 = 通用对话框1.文件名 .如果真结束所有内容 = 到文本 (读入文件 (删首尾空(编辑框4.内容))) 阅读全文

posted @ 2011-05-28 12:52 wanghj_dz 阅读(197) 评论(0) 推荐(0)

post登录,自动发帖
摘要:.版本 2.程序集 窗口程序集1.子程序 __启动窗口_创建完毕图片框1.图片 = 彗星HTTP读文件 (“http://bbss.shangdu.com/Login/randomcode.jsp?fdfgjk=” + 到文本 (取现行时间 ())).子程序 _图片框1_鼠标左键被放开, 逻辑型.参数 横向位置, 整数型.参数 纵向位置, 整数型.参数 功能键状态, 整数型图片框1.图片 = 彗星HTTP读文件 (“http://bbss.shangdu.com/Login/randomcode.jsp?fdfgjk=” + 到文本 (取现行时间 ())).子程序 _按钮1_被单击.局部变量 阅读全文

posted @ 2011-05-28 12:37 wanghj_dz 阅读(2084) 评论(0) 推荐(0)

创建窗口过程中要调用一次窗口过程函数
摘要:下午一直创建窗口失败,返回的hwnd总为NULL,开始一直纠结设计窗口时的问题,后来发觉,居然是窗口过程函数的返回值杯具。拜了拜google大神,终于知道在CreateWindow执行的时候,要在中间执行一次窗口过程函数,并且要其返回true值,不然就杯具掉。哎!以后再也不敢在不熟悉程序当中各个模块是按如何的顺序执行的情况下乱写了!居然写出了这样的东东,没return,调用来干毛啊!DefWindowProc( hwnd, uMsg, wParam, lParam );记下链接以示留念:http://topic.csdn.net/u/20090509/13/c0e0e8f7-696f-4883 阅读全文

posted @ 2011-05-28 09:18 wanghj_dz 阅读(615) 评论(0) 推荐(0)

正则表达式教程
摘要:正则表达式教程:http://deerchao.net/tutorials/regex/regex.htm 阅读全文

posted @ 2011-05-27 20:10 wanghj_dz 阅读(214) 评论(0) 推荐(0)

易语言 多线程
摘要:精易模块----------------------------------------------------------------------------------子程序名:线程_启动 [首拼] xc_qd [备注] 成功返回线程句柄,失败返回0【调用格式】〖返回值类型〗 整数型 <有返回值> 线程_启动(要启动的子程序,要传去子程序的参数)『参数说明』 参数个数:2参数1:要启动的子程序, 子程序指针参数2:要传去子程序的参数, 整数型, 可空, 往子程序里面传递一个整数型的参数----------------------------------------------- 阅读全文

posted @ 2011-05-27 09:34 wanghj_dz 阅读(2341) 评论(0) 推荐(0)

句柄
摘要:进程创建时,windows系统为进程构造了一个句柄表当该进程希望获得一个内核对象句柄或者创建一个内核对象从而获得该对象句柄时,系统会将在句柄表中增加一个表项表项的内容中存储了指向目标内核对象的指针。同时,系统返回这个表项在句柄表中的索引作为句柄这样,进程就通过句柄查询句柄表得到对象指针,从而可以访问该对象。同时又由于有了句柄表的保护,可以防止对内核对象的非法操作。 阅读全文

posted @ 2011-05-23 20:17 wanghj_dz 阅读(258) 评论(0) 推荐(0)

对钩子的理解
摘要:钩子的功能是对消息进行截获并处理送给其他应用程序。比如鼠标右击消息,钩子会对消息进行截获并发送给一个处理子程序(当然这个处理子程序必须满足该钩子的接口)然后在让系统处理这个消息。 阅读全文

posted @ 2011-05-22 09:46 wanghj_dz 阅读(219) 评论(0) 推荐(0)

汇编学习的环境搭建
摘要:汇编学习的书籍选择王爽、杨季文的书软件使用:Emu8086.exe V3.07视频教程:大灰狼汇编教程 阅读全文

posted @ 2011-05-21 19:10 wanghj_dz 阅读(264) 评论(0) 推荐(0)

多进程的进程表初始化
摘要:PUBLICchartask_stack[STACK_SIZE_TOTAL]//在global.c中task_stack其实是一个有着STACK_SIZE_TOTAL大小的数组。task_stack是这个数组名 用这个数组作为堆栈。----------------------------------------------------------TASK*p_task= task_table;PROCESS*p_proc= proc_table;char*p_task_stack= task_stack + STACK_SIZE_TOTAL; //进程堆栈,是一个数组。数组的起始地址+偏移量, 阅读全文

posted @ 2011-05-20 23:00 wanghj_dz 阅读(465) 评论(0) 推荐(0)

丰富中断程序,以及中断与进程运行的关系
摘要:进程A在运行,时钟中断发生。中断会读取TSS中ring0的esp。该esp指向进程A进程表的regs的最后,并且把进程A运行的cs,eip,ss,sp,eflags等信息压入到esp指向的进程表。执行中断程序执行中断程序最后一个iredt指令,因为现在esp指向进程表的cs,eip等参数,所以会把刚刚保存进进程表的进程A的参数压出到寄存器。返回到进程A继续执行。--------------------------------------------------------------------------其实,即便我们打开了时钟中断,时钟中断也只会发生一次,因为我们没有将中断结束位EOI置为 阅读全文

posted @ 2011-05-20 15:17 wanghj_dz 阅读(618) 评论(0) 推荐(0)

进程的进程表、进程体、GDT、TSS的关系,以及进程表的初始化
摘要:关系见P252,图6-9进程表与GDT的关系:进程表里的LDT Selector对应GDT中的一个描述符,而这个描述符所指向的内存空间就存在与进程表内。进程表与进程体的关系:进程表是进程的描述,进程运行过程中如果被中断,各个寄存器的值都会被保存进进程表中。使用到进程表堆栈。但是,在我们的第一个进程开... 阅读全文

posted @ 2011-05-20 08:29 wanghj_dz 阅读(3409) 评论(0) 推荐(0)

restart函数 详细解释
摘要:sconst.inc proc.hP_STACKBASEequ0typedef struct s_stackframe{ GSREGequP_STACKBASE u32 gsFSREGequGSREG+ 4 u32 fsESREGequFSREG+ 4 u32 esDSREGequESREG+ 4... 阅读全文

posted @ 2011-05-19 15:56 wanghj_dz 阅读(918) 评论(0) 推荐(0)

进程代码结构
摘要:sconst.incP_STACKBASEequ0GSREGequP_STACKBASEFSREGequGSREG+ 4ESREGequFSREG+ 4DSREGequESREG+ 4EDIREGequDSREG+ 4ESIREGequEDIREG+ 4EBPREGequESIREG+ 4KERNELESPREGequEBPREG+ 4EBXREGequKERNELESPREG+ 4EDXREGequEBXREG+ 4ECXREGequEDXREG+ 4EAXREGequECXREG+ 4RETADRequEAXREG+ 4EIPREGequRETADR+ 4CSREGequEIPREG+ 4 阅读全文

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

启动进程所需要的基本条件(转载)
摘要:http://blog.csdn.net/RichardYSteven/archive/2008/12/25/3606398.aspx进程是现代计算机系统运行的最小单位,所以没有进程也不能称之为操作系统。当系统启动后,设置了GDT, IDT进入了保护模式后,需要哪些东西才能让进程跑起来呢?其实简单说来进程产生的目的并不是要让程序跑起来,而是要让一个系统上有多个进程一起跑。因为如果一个系统上只有一个所谓的“进程”在跑,那就没有必要保存再恢复进程的运行环境了。 好,来看看都要加哪些东西才能够让进程跑起来。1.TSS 2. 进程体本身3. 进程表 TSS主要用来保存ring0特权级的ss:esp,且 阅读全文

posted @ 2011-05-18 10:23 wanghj_dz 阅读(525) 评论(0) 推荐(0)

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

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

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

posted @ 2011-05-17 10:55 wanghj_dz 阅读(960) 评论(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 阅读(332) 评论(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 阅读(359) 评论(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 阅读(462) 评论(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 阅读(393) 评论(0) 推荐(0)

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

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

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

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

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

posted @ 2011-05-15 12:50 wanghj_dz 阅读(795) 评论(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 阅读(1142) 评论(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 阅读(473) 评论(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 阅读(746) 评论(0) 推荐(0)

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

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

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

posted @ 2011-05-13 12:39 wanghj_dz 阅读(1074) 评论(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 阅读(707) 评论(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 阅读(408) 评论(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 阅读(680) 评论(0) 推荐(0)

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

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

为什么dos下的com文件都要org 0100h呢?为什么系统启动时要org 07c00h呢
摘要:这是因为.com 载入内存后的起始偏址就是100h. 前面的100h字节是该程序的PSP 部分. 所以,为了程序中对地址引用的正确, 必需加上org 100h语句。-------------------------------------------------------------------------------------------------------------------------------------------------FFFF0h与07C00h,这两个都是机器启动后默认访问的内存地址。曾经让我一度很晕,搞不清他们之间的关系。现在终于搞明白了,写到博客司上与大家分 阅读全文

posted @ 2011-05-12 10:02 wanghj_dz 阅读(2424) 评论(1) 推荐(0)

第四章 boot.asm代码详解
摘要:第四章 boot.asm 代码详解;%define _BOOT_DEBUG %ifdef _BOOT_DEBUG org 0100h %else org 07c00h %endif这段代码的意思是,如果定义了_BOOT_DEBUG 则 org 0100h,如果没有定义则 org 07c00h如果把;%define _BOOT_DEBUG前面的;去掉则该语句执行,_BOOT_DEBUG定义了。如果加上;则被注释掉了,_BOOT_DEBUG没有定义。--------------------------------------------------------------------------- 阅读全文

posted @ 2011-05-11 17:04 wanghj_dz 阅读(2070) 评论(0) 推荐(0)

突破512K字节限制
摘要:512B是软盘第一扇区的大小,称为引导扇区。系统要进入保护模式,512B是不够用的。所以在软盘的其他地方存放一个文件,通过512B的引导扇区,加载到内存,并把控制权交给该它。一个操作系统从开机到开始运行,大致经历“引导---加载内核入内存--跳入保护模式---开始执行内核”这样一个过程。也就是说在内核开始执行之前不但要加载内核,还要准备保护模式等一系列工作,如果全部交给引导扇区来做,512B很可能不够用所以不妨把这个过程交给另外的模块来完成,我们把这个模块叫做Loader。引导扇区负责把Loader加载入内存并且把控制权交给它。其他工作放心地交给Loader来做。整理一下这一章的思路。目的是突 阅读全文

posted @ 2011-05-11 08:41 wanghj_dz 阅读(1121) 评论(0) 推荐(0)

中断门和陷阱门的区别
摘要:对于中断门,在转移过程中把IF置为0,使得在处理程序执行期间屏蔽掉INTR中断(当然,在中断处理程序中可以人为设置IF标志打开中断,以使得在处理程序执行期间允许响应可屏蔽中断);对于陷阱门,在转移过程中保持IF位不变,即如果IF位原来是1,那么通过陷阱门转移到处理程序之后仍允许INTR中断。因此,中断门最适宜于处理中断,而陷阱门适宜于处理异常。 阅读全文

posted @ 2011-05-10 22:14 wanghj_dz 阅读(544) 评论(0) 推荐(0)

中断与异常 代码 总结
摘要:ICW (Initialization Command Word)初始化命令字。主8259A对应的端口地址是20A和21A从8259A对应的端口地址是A0h和A1h。初始化过程:1、往端口20h(主片)或A0h(从片)写入ICW12、往端口21h(主片)或A1h(从片)写入ICW23、往端口21h(主片)或A1h(从片)写入ICW34、往端口21h(主片)或A1h(从片)写入ICW4这4步的顺序是不能颠倒的。ICW1负责启动8259A和进行初始化工作ICW2中断类型号的设置ICW3主从片初始化设置ICW4方式控制设置Init8259A: mov al,011h out 020h,al ;主82 阅读全文

posted @ 2011-05-10 20:18 wanghj_dz 阅读(1092) 评论(0) 推荐(0)

对8259中断控制器
摘要:补充知识:对8259中断控制器的说明23. 8259A的编程因为8259A是可编程的中断控制器,所以它的操作是用软件通过命令进行控制的。8259A的编程命令字有两类:一是初始化命令字(ICW),二是操作命令字(OCW)。相应的8259A的控制部分有一些可编程的位,它们分布在7个8位寄存器中。这些寄存器分成两组,一组用作存ICW,另一组存OCW。当计算机刚开机时,用初始化程序设定ICW,即由CPU按次序发送2~4个不同格式的ICW,用来建立起8259A操作的初始状态,此后的整个工作过程中该状态保持不变。相反操作命令字(OCW)用于动态控制中断处理,是在需要改变或控制8259A操作时发送的。注意: 阅读全文

posted @ 2011-05-10 13:42 wanghj_dz 阅读(1799) 评论(0) 推荐(0)

中断与异常机制
摘要:我们在说到中断通常将它与异常相提并论,实际上它们都是程序执行过程中强制性转移,转移到相应的处理程序。中断通常在程序执行时因为硬件而随机产生,他们通常用来处理处理器外部的事件。异常则通常在处理器执行指令过程中检测到错误时发生,比如遇到零除的情况。处理器检测的错误条件有很多,比如保护违例、页错误等。假设处理器可以处理A、B、C三种中断(异常),分别进行a,b,c三种处理,我们得有一种方法把A、B、C与a、b、c对用起来,实际上解决这个问题的方法就是我们前面提到的中断向量。每一种中断和异常都会对应一个中断向量号,而这个向量号通过IDT就与相应的中断处理程序对应起来。Fault,Trap和Abort是 阅读全文

posted @ 2011-05-10 08:57 wanghj_dz 阅读(649) 评论(0) 推荐(0)

(Pmtest8.asm总结)PagingDemoProc 注意这个这个程序段使用的是LinearAddrDemo线性地址。分页后线性地址要转换
摘要:PagingDemoProc:OffsetPagingDemoProcequPagingDemoProc - $$moveax, LinearAddrDemo ;LinearAddrDemo equ 00401000h ,ProcFoo equ 00401000hcalleax ;跳到foo处执行代码retfLenPagingDemoAllequ$ - PagingDemoProc设计一个Flat段,尽管他的基址为0,这样做的好处是逻辑很清楚,只要用到这个段名,他们涉及到的代码和数据就都在这个段里。这样逻辑就不会混乱。moveax, LinearAddrDemo ;LinearAddrDemo 阅读全文

posted @ 2011-05-09 17:06 wanghj_dz 阅读(454) 评论(0) 推荐(0)

自己动手写操作系统P121 对SelectorFlatRW和SelectorFlatC的描述
摘要:事实上,在pmtest7.asm中我们用两个段分别存放页目录表和页表(LABEL_DESC_PAGE_DIR存放页目录表,LABEL_DESC_PAGE_TBL存放页表)是为了让读者阅读时更加直观和形象。在pmtest8.asm中,我们把它们放到同一个段中,同时把增加的一套页目录和页表也放到这个段中。为了操作方便,我们新增加一个段FLAT,其线性地址空间为0-4GB。由于分页机制启动之前线性地址等同与物理地址,所以通过这个段可以方便地存取特定的物理地址。此段的定义如下:LABEL_DESC_FLAT_C: Descriptor 0,0fffffh,DA_CR|DA_32|DA_LIMIT_4K 阅读全文

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

pmtest8.asm 全
摘要:; ==========================================; pmtest8.asm; 编译方法:nasm pmtest8.asm -o pmtest8.com; ==========================================%include"pm.inc"; 常量, 宏, 以及一些说明PageDirBase0equ200000h; 页目录开始地址:2MPageTblBase0equ201000h; 页表开始地址:2M + 4KPageDirBase1equ210000h; 页目录开始地址:2M + 64KPageTblB 阅读全文

posted @ 2011-05-09 14:25 wanghj_dz 阅读(597) 评论(0) 推荐(0)

pmtest8.asm中的PSwitch代码的理解
摘要:; 切换页表 ------------------------------------------------------------------PSwitch:; 初始化页目录movax, SelectorFlatRWmoves, axmovedi, PageDirBase1; 此段首地址为 PageDirBase1 ,PageDirBase1 equ210000h; xoreax, eaxmoveax, PageTblBase1 | PG_P | PG_USU | PG_RWW movecx, [PageTableNumber].1:stosdaddeax, 4096; 为了简化, 所有页 阅读全文

posted @ 2011-05-09 11:10 wanghj_dz 阅读(1157) 评论(0) 推荐(2)

pmtest8.asm中对PagingDemo程序段的理解
摘要:; 测试分页机制 --------------------------------------------------------------PagingDemo:movax, csmovds, axmovax, SelectorFlatRW ;这应该是selectorFlatRW所对应的段描述符的首地址,参见pmtest7.asmmoves, axpushLenFoo ;0x0000001c sp:0x000001f7pushOffsetFoo ;0x000001a0 sp:0x000001f3pushProcFoo ;ProcFoo equ00401000h sp:0x000001efca 阅读全文

posted @ 2011-05-09 10:06 wanghj_dz 阅读(472) 评论(0) 推荐(0)

pmtest8.asm中lib.inc中MemCpy代码的理解
摘要:PagingDemo:movax, csmovds, axmovax, SelectorFlatRW ;这应该是selectorFlatRW所对应的段描述符的首地址,参见pmtest7.asmmoves, axpushLenFoo;0x0000001c sp:0x000001f7pushOffsetFoo ;0x000001a0 sp:0x000001f3pushProcFoo ;ProcFoo equ00401000h sp:0x000001efcallMemCpy;前面几个push是MemCpy的参数,sp:0x000001eb,call会由系统自动压入参数,所以前面的sp要加4。;这段c 阅读全文

posted @ 2011-05-09 10:04 wanghj_dz 阅读(588) 评论(0) 推荐(0)

pmtest7.asm中 SetupPaging 启动分页代码,根据内存确定页表数。
摘要:SetupPaging:; 根据内存大小计算应初始化多少PDE以及多少页表xoredx, edxmoveax, [dwMemSize]movebx, 400000h; 400000h = 4M = 4096 * 1024, 一个页表对应的内存大小divebxmovecx, eax;此时 ecx 为页表的个数,也即 PDE 应该的个数testedx, edxjz.no_remainderincecx; 如果余数不为 0 就需增加一个页表.no_remainder:pushecx;暂存页表个数; 为简化处理, 所有线性地址对应相等的物理地址. 并且不考虑内存空洞.; 首先初始化页目录movax, 阅读全文

posted @ 2011-05-08 09:04 wanghj_dz 阅读(405) 评论(0) 推荐(0)

LODS,LODSB,LODSW,LODSD 和 STOS,STOSB,STOSW,STOSD 的作用
摘要:LODS,LODSB,LODSW,LODSD 和 STOS,STOSB,STOSW,STOSD 的作用 LODSB LODSW LODSD 将字符串装入累加器(Load Accumulator from string) 将由DS:E(SI)寻址的一个内存字节或字装入累加器(AL, AX 或 EAX)中,如果使用LODS,必须 指定内存操作数.LODSB将一个字节装入AL,LODSW将一个字装入AX.IA-32处理器的LODSD将一 个双字装入EAX.(E)SI根据操作数大小和方向标志值自动增减.如果方向标志(DF)=1,ESI增 加,如果DF=0,ESI减少 摘自INTEL汇编语言程序设计(第 阅读全文

posted @ 2011-05-07 22:19 wanghj_dz 阅读(1371) 评论(0) 推荐(0)

pmtest7.asm中 DispMemSize:代码的解释
摘要:DispMemSize:push esipush edipush ecxmov esi,MemChkBuf//esi=7amov ecx,[dwMCRNumber]; for(inti=0;i<[MCRNumber];i++)//每次得到一个ARDS ecx=6 ,.loop: ; {mov edx,5 ; for(intj=0;j<5;j++)//每次得到一个ARDS中的成员edx=5 mov edi,ARDStruct ;{//依次显示BaseAddrLow,BaseAddrHigh,LengthLow,LengthHigh,Type.1: ;push dword[esi] ; 阅读全文

posted @ 2011-05-05 22:03 wanghj_dz 阅读(428) 评论(0) 推荐(0)

pmtest7.asm中 DispInt (显示一个整数型)的代码解释,DispAL代码的解释
摘要:push dword[esi] ; //push [ds:0x7a],为0x00000000,注意这是指第一次压入堆栈的情况call DispInt //call指令会自动调用堆栈,esp会减4-------------------------------------------------------------------------------------;;显示一个整形数DispInt:mov eax,[esp+4]//注意这里esp+4是因为调入之前的call指令,因为call指令会自动把一些参数入栈,esp要减4,esp+4正好指向了第一次push进去的 0x00000000shr 阅读全文

posted @ 2011-05-05 21:56 wanghj_dz 阅读(627) 评论(0) 推荐(0)

通过一段汇编,加深对寄存器ESP和EBP的理解
摘要:一直对寄存器ESP和EBP的概念总是有些混淆,查看定义ESP是栈顶指针,EBP是存取堆栈指针。还是不能很透彻理解。之后借于一段汇编代码,总算是对两者有个比较清晰的理解。下面是按调用约定__stdcall 调用函数test(int p1,int p2)的汇编代码;假设执行函数前堆栈指针ESP为NNpush p2 ;参数2入栈, ESP -= 4h , ESP = NN - 4hpush p1 ;参数1入栈, ESP -= 4h , ESP = NN - 8hcall test ;压入返回地址 ESP -= 4h, ESP = NN - 0Ch ;//进入函数内{push ebp ;保护先前EBP 阅读全文

posted @ 2011-05-05 09:21 wanghj_dz 阅读(1174) 评论(0) 推荐(0)

pmtest7.asm中DispStr代码的解释,DispReturn代码的解释
摘要:DispStr:push ebp //ebp作为存取堆栈指针(存取堆栈中内容时所用到的指针),esp栈顶指针mov ebp,esp //ebp指向堆栈栈顶push ebx //以后要用到bl,所以要压栈先保护起来push esi //源指针push edi //目标指针 执行到这儿时ebp,esp的值已经不一样了。esp因为又压了三次所以加了12,ebp还是原来的ebp,push ebp后的堆栈指针mov esi,[ebp+8] ;pszInfo //跳进来之前push szPMMessage esp-4,push ebp 后esp又-4,esp赋给ebp 所以ebp加8正好指向szPMMes 阅读全文

posted @ 2011-05-04 22:43 wanghj_dz 阅读(993) 评论(0) 推荐(0)

在linux下制作img文件,windows下使用nasm
摘要:我是先用bximage创建floppy a.img,然后 [root@localhost bochs-2.2.6]# dd if=/root/asm/a/boot.bin of=/usr/local/src/bochs-2.2.6/a.img bs=512 count=1 注意修改boot: floppy [root@localhost bochs-2.2.6]# bochs ... ... 在Bochs屏幕看到Hello World! 自己研究的方法:把书中自带的pm.img用ultralISO软件打开,在linux中用nasm编译成能回到bochs的文件,然后ftp到windows,放到u 阅读全文

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

img文件的制作
摘要:看了一本书,《自己动手写操作系统》(Downloadhttp://www.verycd.com/topics/251695/)。At the beginning,就要写一个很小的“Hello OS world!”小系统,然后用虚拟机跑起来。想要玩玩的可以去下载然后看,根据书中提示,我制作好了boot.asm,然后用nasm编译成boot.bin.但是,书中去没有讲如何制作虚拟软盘镜像IMG,去百度谷歌了一下,也没有教这东东的。奋斗了半天,终于成功搞定,在喜悦的同时不忘告知有同样困扰的Cfan~1、环境系统:Windows 7所用软件:UltraISO,FloppyWritter(下载包中含有此 阅读全文

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

pmtest7的调试,从dos返回到bochs
摘要:转载与看雪学院:http://bbs.pediy.com/showthread.php?t=116110Xiilin:我在看于渊的《Orange'S...》这本书,我调试一个程序时却出现了问题,程序做的事情是首先从实模式切换到保护模式,然后在保护模式下读取0x00500000地址的内存,然后显示出来。我在Bochs虚拟机下的FreeDos系统上用debug32调试的这个程序,可只能调试到这里:mov eax,cr0or eax,1mov cr0,eax ;调试到这一句时,FreeDos会重启麻烦大家给我指点一下,我要怎么样才能继续调试下去?我想跟到保护模式的代码里。---------- 阅读全文

posted @ 2011-05-03 15:48 wanghj_dz 阅读(592) 评论(0) 推荐(0)

利用bochs调试内核(转载)
摘要:利用bochs调试内核(主要是在windows下调试)Bochs具有非常强大的操作系统内核调试功能。这也是本文选择Bochs作为首选实验环境的主要原因之一。有关Bochs调试功能的说明参见前面14.2节,这里基于Linux 0.11内核来说明Windows环境下Bochs系统调试操作的基本方法。14.8.1 运行Bochs调试程序我们假设Bochs系统已被安装在目录“C:\Program Files\Bochs-2.1.1\”中,并且Linux 0.11系统的Bochs配置文件名称是bochsrc-hd.bxrc。现在在包含内核Image文件的目录下建立一个简单的批处理文件run.bat,其内 阅读全文

posted @ 2011-05-03 12:11 wanghj_dz 阅读(1166) 评论(0) 推荐(0)

bochs环境的搭建
摘要:经过两天的努力终于搭建好bochs的环境。先装好vmware,在虚拟机中先后装了YLMF OS,和Ubuntu10.4但是在安装过程中都出现了我无法解决的问题,果断舍弃之。然后果断参照在linuxdeepin10.12下源码安装bochs-2.4.6 这篇文章,搭建linuxdeepin10.12环境,并按照文章中的步骤成功安装好bochs。bochs源文件下载与bochs网站。终于搭建好了,OK!! 阅读全文

posted @ 2011-05-03 11:57 wanghj_dz 阅读(300) 评论(0) 推荐(1)

导航