2

次のif、xv6-rev6コードの3279〜3285行が使用されている理由は誰でも理解できます。

int num;
num = proc−>tf−>eax;
if (num >= 0 && num < SYS_open && syscalls[num]) {
    proc−&gt;tf−&gt;eax = syscalls[num]();
} else if (num >= SYS_open && num < NELEM(syscalls) && syscalls[num]) {
    proc−&gt;tf−&gt;eax = syscalls[num]();
} else {...}

だけでなく:

int num;
num = proc−&gt;tf−&gt;eax;
if (num >= 0 && num < NELEM(syscalls) && syscalls[num]) {
   proc−&gt;tf−&gt;eax = syscalls[num]();
} else {...}
4

1 に答える 1

1

私の最初の答えは以下のとおりですが、これは部分的に正しいです。

私はMITで著者に連絡する自由を取り、次の応答を受け取りました。

ifラップされたシステムコールの後半のコードはbegin_trans/commit_trans。後でトランザクションの開始/終了を個々のシステムコールに深く移動しましたが、修正するのを忘れていましたsyscall()

したがって、2つの部分異なり、同じになるように変更された場合、変更によって2つのビットがマージされませんでした。


いいえ、これらの2ビットのコードは同等です。

ある時点で、への呼び出しがパラメータまたは戻り位置のいずれかで何らかの形で異なっていた可能性がありますが、現在はそうではありませんsyscalls[?]()

また、そこに何らかのギャップがあった可能性があります。これは、3115行目に空白行があるという事実によってサポートされている可能性があります。

// System call numbers
#define SYS_fork         1
#define SYS_exit         2
#define SYS_wait         3
#define SYS_pipe         4
#define SYS_read         5
#define SYS_kill         6
#define SYS_exec         7
#define SYS_fstat        8
#define SYS_chdir        9
#define SYS_dup         10
#define SYS_getpid      11
#define SYS_sbrk        12
#define SYS_sleep       13
#define SYS_uptime      14

#define SYS_open        15
#define SYS_write       16
#define SYS_mknod       17
#define SYS_unlink      18
#define SYS_link        19
#define SYS_mkdir       20
#define SYS_close       21

これはの内容全体でsyscalls.hあり、空白行はやや疑わしいものです。

明らかな機能のグループ化はありませんが、15以上のものはすべてファイルシステムの操作に関連しているようSYS_readSYS_fstat、最初のグループに含まれています。

たぶん、あなたは彼らに尋ねるために作者に連絡するべきです(6.828-staff at pdos.csail.mit.edu)。

私は(私が本を持っているので)それがリストにそのようなギャップがないのでライオンズ時代のコードから引き継がれていないことを知っています-それらもまた異なる順序であり、読み取りと書き込みが隣り合っています例。

于 2012-01-20T09:21:18.443 に答える