随笔分类 -  oranges‘

一路下来的学习笔记
揭开硬件中断请求IRQ所有秘密(图解)
摘要:实用:揭开硬件中断请求IRQ所有秘密(图解)http://www.sina.com.cn 2004年05月17日09:31 赛迪网--中国电脑教育报 文/蔡远翔 IRQ(Interrupt Request)的作用就是在我们所用的电脑中,执行硬件中断请求的动作,用来停止其相关硬件的工作状态。比如我们要打印一份文件,在打印结束时就需要由系统对打印机提出相应的中断请求,来以此结束这个打印的操作。 产生中断请求的设备或者事件被称为中断源,中断源可分为两类:一类是CPU内部中断,即执行软件中断指令INT或遇到软件陷阱而产生的中断,它们的中断类型号已由CPU规定好;另一类中断是由CPU以外的I/O设... 阅读全文

posted @ 2012-09-27 15:16 weiweishuo 阅读(2659) 评论(0) 推荐(0)

8259A编程
摘要:一个外部中断请求信号通过中断请求线IRQ,传输到IMR(中断屏蔽寄存器),IMR根据所设定的中断屏蔽字(OCW1),决定是将其丢弃还是接受。如果可以接受,则8259A将IRR(中断请求暂存寄存器)中代表此IRQ的位置位,以表示此IRQ有中断请求信号,并同时向CPU的INTR(中断请求)管脚发送一个信号,但CPU这时可能正在执行一条指令,因此CPU不会立即响应,而当这CPU正忙着执行某条指令时,还有可能有其余的IRQ线送来中断请求,这些请求都会接受IMR的挑选,如果没有被屏蔽,那么这些请求也会被放到IRR中,也即IRR中代表它们的IRQ的相应位会被置1。当CPU执行完一条指令时后,会检查一下IN 阅读全文

posted @ 2012-09-27 15:05 weiweishuo 阅读(448) 评论(0) 推荐(0)

orange's习题——分段机制【第3章】
摘要:一,简答题1,全局描述符表中每个表项需要按照8字节对齐吗?答案:不需要二,填空题1,描述符的TYPE字段占_____个bit。其中的位_____指示描述符是否被访问过,用符号_____标记。位_____指示所描述的段是代码段还是数据段,用符号E标记,指示所描述的段是否可执行。当E=_____,TYPE中的位_____指示所描述的数据段是否可写,用W标记。TYPE中的位2就是_____位,指示所描述的数据段是否向低扩展。当E=_____,TYPE中的位_____指示所描述的代码段是否可读。TYPE中的位2指示所描述代码段是否是_____,用_____标识。答案:4,0,A,3,0,1,ED,1, 阅读全文

posted @ 2012-09-24 15:10 weiweishuo 阅读(134) 评论(0) 推荐(0)

orange's习题——分页机制【第3章】
摘要:一,简答题1,什么是虚拟存储器?答案:虚拟存储器是一种软硬件结合的技术,用于提供比在计算机中实际可用的物理存储器大得多的存储器空间。这样,程序员在编写程序时,不用考虑物理存储器的实际容量。2,为什么说80386支持的虚拟地址空间达64TB?答案:虚拟地址空间由GDT 映射的全局地址空间和由LDT映射的局部地址空间组成。选择符的索引部分由13 个比特位表示,加上区分GDT 和LDT 的1 个比特位;因此Intel 80X86 CPU 共可以索引16384 个选择符。若每个段的长度都取最大值4G,则最大虚拟地址空间范围是16384 * 4G = 64T3,二级映射表表项的P位,A位,D位都参与对虚 阅读全文

posted @ 2012-09-08 19:43 weiweishuo 阅读(343) 评论(0) 推荐(0)

虚拟地址空间达64TB是怎么算来的
摘要:搜了好多帖子,还是这篇说的有道理:http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=1959427&page=5虚拟地址空间由GDT 映射的全局地址空间和由LDT映射的局部地址空间组成。选择符的索引部分由13 个比特位表示,加上区分GDT 和LDT 的1 个比特位;因此Intel 80X86 CPU 共可以索引16384 个选择符。若每个段的长度都取最大值4G,则最大虚拟地址空间范围是16384 * 4G = 64T只是还不清楚这个64TB能用来干什么。 阅读全文

posted @ 2012-09-08 14:51 weiweishuo 阅读(582) 评论(0) 推荐(0)

ret向外层返回
摘要:1,ret指令先从堆栈弹出返回地址指针(48位的selector:offset) 若selector的RPL等于当前的CPL,则直接开始向目标代码段转移的步骤,即执行jmp selector:offset 若selector的RPL大于当前的CPL,则引起向外层返回。CPL的变化也必然对应着堆栈切换。 2,内层堆栈弹掉先前堆栈切换时复制进来的参数,再弹出指向外层堆栈的指针并载入ss:esp,至此,堆栈切换到外层堆栈。 3,外层堆栈弹掉先前压入的参数。 4,检查数据段寄存器ds,es,fs,gs,以保证各自对应的段在外层cpl等级下仍是可访问,若不可访问,则装入空选择子避免保护空洞。 阅读全文

posted @ 2012-09-01 21:41 weiweishuo 阅读(217) 评论(0) 推荐(0)

进入内层时的堆栈切换
摘要:1,根据TSS,建立同切换后CPL相对应的内层堆栈。 2,将外层堆栈指针ss,esp依次压入内层堆栈。 3,从外层堆栈复制dcount个参数到内层堆栈。 4,将当前的cs,eip压入内层堆栈。 (实际上到这里已经完成了堆栈切换的相关工作) 5,加载调用门中指定的selector:offset到cs:eip,目标代码段开始执行。 阅读全文

posted @ 2012-09-01 21:32 weiweishuo 阅读(175) 评论(0) 推荐(0)

我对jmp selector:offset模型的理解
摘要:jmp selector:offset,其中的selector可能指示段描述符或门描述符,cpu执行该指令的流程应该是这样: 以上就是我对jmp selector:offset执行过程的理解,其实call selector:offset类似,仅仅是首尾多了cs,eip的堆栈,出栈。 (图示的箭头画的有些扎眼,希望没影响到你心情,我也没办法,flash cs里做的图,它又不带箭头工具,我只能自己画...) 阅读全文

posted @ 2012-09-01 15:57 weiweishuo 阅读(235) 评论(0) 推荐(0)

我对call gate的理解
摘要:call gate(调用门)提供一种机制,允许通过call指令实现向更高级非一致代码段的跳转,同时cpl发生相应跃迁。 所以说call gate是call指令的专用门。猜测call gate之名定取the gate for call是也。 对上面两点作下解释: “允许通过call指令实现向更高级非一致代码段的跳转”,为什么是非一致代码段?我们知道,若目标段是一致代码段,那么无论是普通跳转还是使用调用门跳转,无论跳转方式是call还是jmp,cpl都保留跳转前等级。这是一致代码段的特点。 “call gate是call指令的专用门”,可明明jmp指令后面也可以跟上调用门的描述符呀!确实,但jm. 阅读全文

posted @ 2012-08-31 17:20 weiweishuo 阅读(500) 评论(0) 推荐(0)

[置顶] orange's 推荐博客
摘要:把遇到的好博客贴出来,希望能帮到正在学习orange's的朋友 1,http://blog.chinaunix.net/uid/587665/frmd/115190.html 这个链接并未指向博客首页,而指向文章分类中的x86 & x64 体系。作者是“chinaunix->cpu与编译器 ”的版主。 如果你对80x86体系下实模式保护模式各种概念和细节不慎理解,建议去看看。文章的水平很高,文字浅显准确,不时让人觉得切中痛处。并且作者很喜欢用c代码解释一些机制的原理,跟王爽老师很像。2,http://www.cnblogs.com/Aoysme/ 是一步步学习orange 阅读全文

posted @ 2012-08-31 16:38 weiweishuo 阅读(177) 评论(0) 推荐(0)

nasm报错:operator may only be applied to scalar values
摘要:搜到了一篇不错的帖子: (回答的那个人实在是太敬业了)Hey all.I'm a complete beginner in assembly and have chosen NASM to work my way up with. But I have a problem with the pseudo-instruction set. More precisely, I don't understand how the expressions "$ and $$" are used in correlation with times.It's no 阅读全文

posted @ 2012-08-25 23:16 weiweishuo 阅读(497) 评论(0) 推荐(0)

保护模式下寻址
摘要:保护模式下寻址,使用“段选择子+段偏移” 在pmtest1.asm中有句:jmp secletorCode32:0 这就是直接使用“段选择子+段偏移”寻址 还有一种: mov ax,selectorCode32 mov gs,ax mov edi,(80*11+79)*2 ... mov [gs:edi],ax 是把段选择子放在段寄存器中,使用“段寄存器:段偏移”寻址 阅读全文

posted @ 2012-08-25 19:53 weiweishuo 阅读(163) 评论(0) 推荐(0)

先熟悉nasm 【4】 ——SECTION和标签
摘要:1,nasm下,自定义段默认按4byte对齐。 手册上说,“ 通过在段定义行的后面加上'ALIGN'限定符实现的。比如:section .data align=16 它切换到段'.data',并指定它必须对齐到 16 字节边界。” 我也在自定义段里加上align 16,发现编译生成的代码仍按照4byte对齐。很诡异。 2,再说标签。 看下面一段代码(可正常运行),它们被写到mbr,会被加载到0x7c00处----------------------------org 0hs:mov ax,sinc ax.....------------------------- 阅读全文

posted @ 2012-08-25 17:35 weiweishuo 阅读(1014) 评论(0) 推荐(0)

终于把int 8h调通了
摘要:摘要:---------------------------------------------------------------------------------------最近一直在折腾int8h,明明已经把中断处理程序的入口地址注册到0000:0020处,显式调用int8h可以正常转移到中断处理程序,但就是不可以自动中断。后来还是在于渊前辈的书里找到答案,“说起EOI,如果你有过在实模式下的编程经验,那么对它因该不会陌生。当每一次中断处理结束,需要发送一个EOI给8259A,以便继续接受中断”。 于是我在程序中加了两行代码: mov al,20h out 20h,al 编译测试,果然 阅读全文

posted @ 2012-08-19 12:18 weiweishuo 阅读(1331) 评论(0) 推荐(0)

org是做什么的
摘要:于渊前辈有这么一句注释:------------------------------------------------------org07c00h;告诉编译器加载到7c00h处------------------------------------------------------到了第三章,编译com文件时,要把07c00h改成0100h。如果按照之前的逻辑,就应该这样注释:-----------------------------------------------------org0100h;告诉编译器,这个com文件将来肯定被加载到0100h处------------------ 阅读全文

posted @ 2012-08-19 12:16 weiweishuo 阅读(691) 评论(0) 推荐(0)

com文件与bin文件是很相似的
摘要:我觉得com文件只比bin文件多了个标签:org 0100h,告诉你此文件dos专用。 两者都是可执行程序的内存映象文件:所谓映像,就是说把硬盘上的bin文件或com文件加载回内存中,再设置cs:ip指向文件的第一条指令,cpu就可以顺利的跑起来。 它们仅具备程序基本的要素:指令和数据。 dos执行com文件时,会先创建一个256byte的psp内存空间(用于和com程序通信),4个段寄存器都指向psp,接着将com文件加载到cs:100h处。dos将cs:100h作为程序的入口。 bin文件我只在系统的启动引导时用到,它似乎更为底层。有篇相关的文章,文字很准确:http://blog.si. 阅读全文

posted @ 2012-08-19 12:08 weiweishuo 阅读(327) 评论(0) 推荐(0)

DOS下COM文件和EXE文件的比较
摘要:【来源】http://www.cnsharenet.com/DOS/f/dft/dexecom.htmCOM文件是一种可执行程序的内存映象文件,它与只有16位地址线的8位机上的CP/M操作系统下的可执行程序结构相似。在COM程序执行过程中,除了调用DOS功能和 ROM BIOS功能,以及用户特意安排外,段寄存器一般不发生变化。四个段寄存器具有同样的内容,都指向PSP,因此程序的大小仍限于64k以内。COM文件的入口必须是100H,而EXE文件可以有多个段。其中CS和SS以及IP和SP在程序装入时由DOS根据文件头中的信息初始化,ES和DS则指向PSP。EXE文件除了程序本身外,还要包括文件头( 阅读全文

posted @ 2012-08-19 12:01 weiweishuo 阅读(548) 评论(0) 推荐(0)

先熟悉nasm 【3】
摘要:nasm下,向内存写数据可以这样: mov byte [0200h],64h 上面代码是可以通过编译的,反汇编得到:mov byte ptr ds:0x200, 0x64 我记得在masm下,偏移寻址是必须要用寄存器。 我试着写“mov byte [0x0000:0x0200],64h”,nasm就报错了,看来段寄存器还是少不了的。不过可以用立即数寻址,已经很满足了! 2012,8,19 吉首 阅读全文

posted @ 2012-08-19 01:35 weiweishuo 阅读(215) 评论(0) 推荐(0)

先熟悉nasm 【1】
摘要:注:应该是新浪博客的一个bug:“define”前面加%是显示乱码的,只能把%用100代替,因此下文看到100define时不要被吓到。-----------------------------------------------------------------------------------------------------------------------------------------已经看到第3章“保护模式”,反复读那段“吸引眼球”的pmtest1.asm,总还是雾蒙蒙的感觉。对其中的SECTION,BITS等关键字不甚了解,于是知道要专门熟悉一下nasm汇编了。“可能 阅读全文

posted @ 2012-08-16 16:00 weiweishuo 阅读(520) 评论(0) 推荐(0)

先熟悉nasm 【2】
摘要:在网上溜达时看到一个不错的问答,问题难度不大,但回答的很精准:-----------懂nasm的进,请问nasm程序的入口是什么 我怎么输入程序呢???------解决方案--------------------------------------------------------NASM和MASM有很大的不同。在MASM中,要先定义段和程序入口点。过程调用还要显式的定义过程。NASM支持两种编译方式,一种是传统的方法,这种方法显然是为了和其它公司的链接器配套工作。在这种方式下,可以使用SEGMENT或者SECTION来定义段。另一种编译方式是纯二进制文件格式。原则上程序不分段。但也可分段, 阅读全文

posted @ 2012-08-16 16:00 weiweishuo 阅读(216) 评论(0) 推荐(0)

导航