ForrestYu 发表于 2004-8-5 04:43:26

Linux0.01中的简单问题—关于switch_to(n)

我在阅读Linux0.01代码时怎么也弄不懂这一段的用处:

/*
* switch_to(n) should switch tasks to task nr n, first
* checking that n isn't the current task, in which case it does nothing.
* This also clears the TS-flag if the task we switched to has used
* tha math co-processor latest.
*/
#define switch_to(n) {\
struct {long a,b;} __tmp; \
__asm__("cmpl %%ecx,_current\n\t" \
        "je 1f\n\t" \
        "xchgl %%ecx,_current\n\t" \
        "movw %%dx,%1\n\t" \
        "ljmp %0\n\t" \
        "cmpl %%ecx,%2\n\t" \
        "jne 1f\n\t" \
        "clts\n" \
        "1:" \
        ::"m" (*&__tmp.a),"m" (*&__tmp.b), \
        "m" (last_task_used_math),"d" _TSS(n),"c" ((long) task)); \
}


AT&T汇编实在太难懂了,请问各位这一段做了什么啊?
明明输入参数有5个,为什么只能在代码中找到%0、%1、%2这三个东东啊?
这个问题把我郁闷死了,求大家帮忙!不胜感激!!

ForrestYu 发表于 2004-8-5 13:06:48

大虾们帮帮忙啊,我把这段代码编译然后反编译,得到这样一段:

00000308BA40000000         mov edx,0x40
0000030D8B0D30A40408       mov ecx,
00000313390D20A40408       cmp ,ecx
000003197417                     jz 0x332
0000031B870D20A40408      xchg ecx,
00000321668955FC            mov ,dx
00000325FF6DF8                   jmp far
00000328390D24A40408      cmp ,ecx
0000032E7502                      jnz 0x332
000003300F06                      clts
0000033290                        nop


倒是容易理解一点了,可是jmp far 这一句是什么意思呢?根本就没有赋值啊,怎么能用跳转呢?再说跳转过去了怎么再执行下面的代码呀??
我怀疑是不是这段代码是错的呀?各位有没有Linux0.01的代码?帮我看一看Sched.h中switch_to(n)的定义好否?

strugglest 发表于 2004-8-8 17:42:30

发表一下我的意见,不知对这位兄弟能否有所帮助!!!!

首先,参数问题:
                "m"是说内存中的变量与寄存器结合,"d","c"分别与edx,ecx结合,这五个变量就
都名花有主了!!!!

   第二,ljmp指令是要跳转出现在的代码段的,段选择符放在dx中,这就引用了新任务的tss,而80386

的设计中,这种情况会造成任务切换(只要引用,就不必管ljmp后面的参数了,它没有任何用途)!!!!

   第三,什么时候执行下面的代码:要意识到,执行swith_to时,是在当前任务中,当ljmp时,任务切

换,此时的所有寄存器状态被保存到当前任务的tss,当内核下次调度到该任务时,再执行下面的代

码!!!!

   
                  只有交流才能进步,大家要多多交流呀!!!!

unix-linux 发表于 2004-9-1 12:02:38

:twisted::evil:
页: [1]
查看完整版本: Linux0.01中的简单问题—关于switch_to(n)