当前位置: 技术问答>linux和unix
AT&T汇编 Linux保护模式编程问题
来源: 互联网 发布时间:2016-08-09
本文导语: 1.在启动保护模式之前,16位代码能否执行32代码? 2.下面是Linux完成保护模式启动后的控制权转移代码: .byte 0x66,0xea code32:.long 0x10000 .word __BOOT_CS 问题是为什么说这个是16位代码调用32为代码...
1.在启动保护模式之前,16位代码能否执行32代码?
2.下面是Linux完成保护模式启动后的控制权转移代码:
.byte 0x66,0xea
code32:.long 0x10000
.word __BOOT_CS
问题是为什么说这个是16位代码调用32为代码,又为什么要用跳转机械码来实现,而不用汇编指令直接实现?
3.在进入到保护模式后,我还是可以使用16位的分段机制,也就是说保护模式是一起动时CPU访问内存就使用的,还是等程序设置好了才使用的,换种说法就是如果程序不设置,即使启动了保护模式,也不会真正进入保护模式?
谢谢高手指点!!!
2.下面是Linux完成保护模式启动后的控制权转移代码:
.byte 0x66,0xea
code32:.long 0x10000
.word __BOOT_CS
问题是为什么说这个是16位代码调用32为代码,又为什么要用跳转机械码来实现,而不用汇编指令直接实现?
3.在进入到保护模式后,我还是可以使用16位的分段机制,也就是说保护模式是一起动时CPU访问内存就使用的,还是等程序设置好了才使用的,换种说法就是如果程序不设置,即使启动了保护模式,也不会真正进入保护模式?
谢谢高手指点!!!
|
保护模式之前,16位代码不能执行32位的代码,因为16位代码ret是默认堆栈中的返回地址是16位的,32位的代码则需要32位的返回地址,二者区别很大。
lz需注意保护模式和实模式的分段的含义区别,进入保护模式前须设置好将要用到的gdt表,再把gdt表的地址放入gdtr寄存器,完成了这些操作后,才进入保护模式,如果没有设置gdt,则其结果是不可预知的。
lz需注意保护模式和实模式的分段的含义区别,进入保护模式前须设置好将要用到的gdt表,再把gdt表的地址放入gdtr寄存器,完成了这些操作后,才进入保护模式,如果没有设置gdt,则其结果是不可预知的。
|
模式不一样应该不能执行;
进入到保护模式后,还是可以使用16位的分段机制——是因为还有虚拟模式;
保护模式是通过控制CR0的PE位来控制的:如果PE位置1,则保护模式启动,如果PE=0,则在实模式下运行。
进入到保护模式后,还是可以使用16位的分段机制——是因为还有虚拟模式;
保护模式是通过控制CR0的PE位来控制的:如果PE位置1,则保护模式启动,如果PE=0,则在实模式下运行。