我正在尝试执行 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,以便执行代码的相关部分。但是,不知何故, FILESYS 没有得到定义,从以下pintos -f
命令输出中可以看出
Kernel command line: -f
Kernel PANIC at ../../threads/init.c:261 in parse_options(): unknown option `-f' (use -h for help)
其他几项测试确认 FILESYS 未定义是问题所在。我检查了 gcc 语法,甚至编写了以下 Dummy 程序来检查 gcc 的 -DNAME 选项。
DummyProg.c
#include "stdio.h"
int main()
{
#ifdef CHECK
printf("WORKING\n");
#endif
return 0;
}
使用gcc -DCHECK DummyProg.c
and ./a.out
, WORKING 显示在屏幕上,符合语法的有效性等。我使用的 gcc 版本是gcc (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3
有人可以指出如何解决这个问题。