- 论坛徽章:
- 0
|
本人linux菜鸟,最近在用bochs虚拟机上模拟运行linux-1.0的kernel,主要是为了学习linux的kernel的一些原理性的东西。
在linux1.0中进程切换是靠调用任务门来做到的,但在使用调试过程中,调用任务门来切换进程会很诡异的crash了,就是在
switch_to操作里面:
#define switch_to(tsk) \
__asm__("cmpl %%ecx,_current\n\t" \
"je 1f\n\t" \
"cli\n\t" \
"xchgl %%ecx,_current\n\t" \
"ljmp %0\n\t" \
"sti\n\t" \
"cmpl %%ecx,_last_task_used_math\n\t" \
"jne 1f\n\t" \
"clts\n" \
"1:" \
: /* no output */ \
:"m" (*(((char *)&tsk->tss.tr)-4)), \
"c" (tsk) \
:"cx"
ljmp %0指令的时候挂掉了,没有明确的错误信息
所以自己想尝试后续内核中所用到的高级做法,使用栈切换和内存目录切换的
方式来达到进程切换,但不爽的是当我切换页目录寄存器,采用如下指令:
__asm__ __volatile__("movl %0,%%cr3": :"a" (next->tss.cr3));
但单步调试bochs执行到上述指令时产生异常打印信息:
"physical address not available"
然后系统crash了。
开始我以为是next->tss.cr3所指向的表有问题,最后发现和表的内容没有多大关系,只要是改变了cr3寄存器的内容就会产生
相同的异常,对linux1.0的内核没有其他修改,就只是加入这个地方。
虚拟机配置是单cpu,内存64M,bochs版本是2.4.5,不知道有没有哪位大侠遇到过同样的问题,望不奢指教,谢谢了!!!! |
|