- 論壇徽章:
- 0
|
本人linux菜鳥(niǎo),最近在用bochs虛擬機(jī)上模擬運(yùn)行l(wèi)inux-1.0的kernel,主要是為了學(xué)習(xí)linux的kernel的一些原理性的東西。
在linux1.0中進(jìn)程切換是靠調(diào)用任務(wù)門(mén)來(lái)做到的,但在使用調(diào)試過(guò)程中,調(diào)用任務(wù)門(mén)來(lái)切換進(jìn)程會(huì)很詭異的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指令的時(shí)候掛掉了,沒(méi)有明確的錯(cuò)誤信息
所以自己想嘗試后續(xù)內(nèi)核中所用到的高級(jí)做法,使用棧切換和內(nèi)存目錄切換的
方式來(lái)達(dá)到進(jìn)程切換,但不爽的是當(dāng)我切換頁(yè)目錄寄存器,采用如下指令:
__asm__ __volatile__("movl %0,%%cr3": :"a" (next->tss.cr3));
但單步調(diào)試bochs執(zhí)行到上述指令時(shí)產(chǎn)生異常打印信息:
"physical address not available"
然后系統(tǒng)crash了。
開(kāi)始我以為是next->tss.cr3所指向的表有問(wèn)題,最后發(fā)現(xiàn)和表的內(nèi)容沒(méi)有多大關(guān)系,只要是改變了cr3寄存器的內(nèi)容就會(huì)產(chǎn)生
相同的異常,對(duì)linux1.0的內(nèi)核沒(méi)有其他修改,就只是加入這個(gè)地方。
虛擬機(jī)配置是單cpu,內(nèi)存64M,bochs版本是2.4.5,不知道有沒(méi)有哪位大俠遇到過(guò)同樣的問(wèn)題,望不奢指教,謝謝了。。。 |
|