摘要:大小端的不同主要影响两个方面,而且它们本质上原因是相同的。它们分别是字节序和比特序字节序:字节序是指占用内存多于一个字节类型的数据在内存中的存放顺序,有小端、大端两种字节顺序。小端字节序指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处;大端字节序相反。网络字节序为大端字节序。不同体系结构的CPU有不同的字节序类型:INTEL的X86平台使用小端法,IBM、Motorola、Sun Microsystem等大多数微处理器则使用大端法,还有部分微处理器可以由用户自己设置是使用大端法还是小端法,如ARM、MIPS、PowerPC等。比特序:在说明比特序之前,先说说位域的概念:些信息在存储
阅读全文
摘要:实模式下的中断机制中断向量表(IVT)改变中断向量表地址设置自己的中断服务例程保护模式下的中断机制查找 interrupt handler 入口IDT 表中 descriptor 类型的检查使用 16-bit gate descriptorIDT 表的 limit 检查请求访问 interrupt handler 时的权限检查gate 的权限设置interrupt handler 的 code segment 权限设置使用 interrupt gate使用 trap gate使用 task gate任务切换的情形1. 实模式下的中断机制x86 processor 在加电后被初始化为 real
阅读全文
摘要:/* Timer interrupt handler 通过中断门进入这个处理函数时,中断标志IF=0,不允许再中断进来.*/.align 2timer_interrupt: push %ds pushl %eax movl $0x10, %eax mov %ax, %ds movb $0x20, %al outb %al, $0x20 movl $1, %eax cmpl %eax, current je 1f movl %eax, current ljmp $TSS1_SEL, $0 /*ljmp是编译器的伪指令,反汇编后实际是: jmp 0030:00000000*...
阅读全文
摘要:当使用IRET指令返回到相同保护级别的任务时,IRET会从堆栈弹出代码段选择子及指令指针分别到CS与IP寄存器,并弹出标志寄存器内容到EFLAGS寄存器。当使用IRET指令返回到一个不同的保护级别时,IRET不仅会从堆栈弹出以上内容,还会弹出堆栈段选择子及堆栈指针分别到SS与SP寄存器。IA-32指令手册关于这一点描述的很清楚,原文如下:the IRET instruction pops the return instruction pointer, return code segment selector, and EFLAGS image from the stack to the EIP
阅读全文
摘要:中断这个词恐怕人民群众都不陌生。很多人把中断分为两种:硬件中断和软件中断。其实怎么叫关系都不大,关键是我们要明白他们之间的异同点。 笔者本身比较喜欢把 “中断”,分为三种即陷阱,中断和异常,我似乎记得Intel是这么划分的(这句话我不保证正确啊,有兴趣的读者自己看一下 Intel 的手册)。他们的英文分别是 trap,interrupt 和 exception。 陷阱 (trap): 大家都知道,现代的CPU都是有优先级概念的,用户程序运行在低优先级,操作系统运行在高优先级。高优先级的一些指令低优先级无法执行。有一些操作只能由操作系统来执行,用户想要执行这些操作的时候就要通知操作...
阅读全文
摘要:在orange's 一个操作系统的实现,第3章,pmtest1.asm中,有如下代码 GdtPtr dwGdtLen - 1 ; GDT界限我们知道一个描述符中包含段基址和段界限,那么如果GdtLen是GDT的长度,为什么段界限要-1呢?因为段界限表达的是段内的最大偏移,而不是段的最大长度。一个简单的例子,加入一个段有如下内存:var1db 0x01;偏移0var2 db 0x02;偏移1那么段界限应该是1还是2呢?答案是1,最大偏移是1。访问段中数据使用:段基址 +偏移(所以段界限说明的是这个最大偏移)总之,牢记一点,段界限不是指段的最大长度,而是只段内的最大偏移,所以一定要在段长度
阅读全文