PintOS コマンドを実行しようとしてpintos -f
います (PintOS に慣れていなくても心配しないでください)。内部的に、init.c
プログラムが呼び出され、そのparse_options()
関数は渡されたコマンド ライン引数を処理します。以下は、init.c の関連スニペットです。
static char **
parse_options (char **argv)
{
for (; *argv != NULL && **argv == '-'; argv++)
{
char *save_ptr;
char *name = strtok_r (*argv, "=", &save_ptr); //fn to tokenise the string
char *value = strtok_r (NULL, "", &save_ptr);
if (!strcmp (name, "-h"))
usage ();
else if (!strcmp (name, "-q"))
power_off_when_done = true;
else if (!strcmp (name, "-r"))
reboot_when_done = true;
/*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$*/
#ifdef FILESYS
else if (!strcmp (name, "-f"))
format_filesys = true;
#endif
/*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$*/
else if (!strcmp (name, "-rs"))
random_init (atoi (value));
else if (!strcmp (name, "-mlfqs"))
thread_mlfqs = true;
#ifdef USERPROG
else if (!strcmp (name, "-ul"))
user_page_limit = atoi (value);
#endif
else
PANIC ("unknown option `%s' (use -h for help)", name);
}
return argv;
}
$$$$
セクション内のコードに従って、-f
渡されたオプションは、FILESYS が定義されている場合にのみ処理されます。
を実行するmake
と、次のコマンドが実行されます
gcc -m32 -c ../../threads/init.c -o threads/init.o -g -msoft-float -O -fno-stack- protector -nostdinc -I../.. -I../../lib -I../../lib/kernel -Wall -W -Wstrict-prototypes -Wmissing-prototypes -Wsystem-headers -DUSERPROG -DFILESYS -MMD -MF threads/init.d
ここでは、-DUSERPROG および -DFILESYS オプションを使用して FILESYS および USERPROG を定義し、コードの関連セクションを実行できるようにします。pintos -f
ただし、次のコマンド出力から明らかなように、何らかの形で FILESYS が定義されていません。
Kernel command line: -f
Kernel PANIC at ../../threads/init.c:261 in parse_options(): unknown option `-f' (use -h for help)
他のいくつかのテストでは、FILESYS が定義されていないことが問題であることを確認しています。私は gcc 構文をチェックし、gcc で -DNAME オプションをチェックするために次のダミー プログラムを作成しました。
DummyProg.c
#include "stdio.h"
int main()
{
#ifdef CHECK
printf("WORKING\n");
#endif
return 0;
}
とgcc -DCHECK DummyProg.c
で./a.out
、WORKING が画面に表示され、構文の妥当性などを確認しました。 使用している gcc のバージョンはgcc (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3 です。
誰かがこの問題を解決する方法を教えてください。