关于 80x86保护模式和编程,有看过《linux完全剖析》的么?

Fuz 发布于 2012/06/04 20:42
阅读 425
收藏 0

【Gopher China万字分享】华为云的Go语言云原生实战经验!>>>

最近是在研读赵炯的《linux完全剖析》,学习操作系统原理。这两天已经进行到进程部分,为了更透彻地理解其原理,自己照着书上的linux0.00源 码写了一个单进程的模型。前面还好,当由特权级0转到特权级3执行自定义的函数体时,bochs虚拟机崩溃了并开始不断重启。我写的这个函数体如下

C/C++ code
void task0()
{     while(1){
    }
} 

其实就是一个无限循环,按理说应该没有什么问题。我想应该是权限没有处理好的原因,用调试器进行了单步调试,发 现在调试器下运行时,系统确实进入了这个函数体,并且陷入了一个无限循环。我分析后觉得既然已经进入了无限循环,没有理由会发生权限上的问题啊,况且这个 函数体里面的东西也没有触及到任何高特权级的代码或数据。

接下来我在while 语句里面又加入了一句嵌入汇编,就是执行一个系统调用,如下
asm("mov $'S',%ax\n\t"
    "int $0x80\n\t");

再调试发现,在执行 int 0x80 语句之前一切正常,之后就所有的通用、堆栈、标志寄存器全部被清零,系统再次崩溃。

说明一下,0x80 号中断是一个陷阱门,功能很简单,就是把al寄存器里面的字符打印在屏幕上,定义如下:
system_interrupt:
mov ah,0xd
call disp_ch
ret


disp_ch是我自定义的字符打印例程,根据其他的测试可以保证其没有问题。
设置 0x80 号中断在IDT表中的描述符的语句如下,
Assembly code

mov eax, 0x00080000

mov ax,system_interrupt //中断处理服务入口偏移

 xor edx,edx 

mov dx, 0xef00 //设置描述符特权级为3, 描述符类型为 15 陷阱门 

mov edi,idt_32+ 0x80 * 8 //写入IDT

 mov [edi],eax 

mov [edi+ 4 ],edx



经测试发现,在特权级为 0 的情况下调用 int 0x80,可以得到正确的结果。既然其特权级为 3 ,又是陷阱门,即使是用户态的进程应该也可以调用啊,怎么会出现这样的问题?
加载中
0
中山野鬼
中山野鬼
不太清楚虚拟机内部的实现方式,不好回答你。我不知道他是否真的驱动了硬件。建议你着个ARM7,ARM9,做这方面的研究。不要在X86上做。如果你非要在X86上做。就去找台386做。最好不要用虚拟机做。
Fuz
Fuz
诶,确实比较折腾。不过还确实有意思~也可以学到很多东西。
中山野鬼
中山野鬼
回复 @子逸是也! : 不清楚哦。没这么折腾过。。。
Fuz
Fuz
这个应该不是虚拟机的问题吧,毕竟在此之前的运行结果都是在预期之中的啊。况且赵炯的这本书本来就是基于bochs来展开的。这个应该问题不大
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部