如何在进程结束后自动关闭 `qemu` 的执行?
How to automatically close the execution of the `qemu` after end of process?
我希望 qemu
window 打开并显示输出后自动关闭 运行ning pintOS
就像我 运行 在 tcsh
shell 中的命令 pintos -- run alarm-multiple
一样,qemu 显示 process begins,然后一些alarm-notifications
然后 进程结束 ,但在那之后 qemu window 不会关闭
我想在成功完成系统调用后退出 window。
更新:
新解
这是另一个更好的解决方案,适用于 pintos run ...
和 make grade
将此行添加到 devices/shutdown.c :: shutdown_power_off(void ) 在循环之前。
outw( 0x604, 0x0 | 0x2000 );
旧的解决方案
对于较新版本的 qemu,您需要 运行 它带有选项
-device isa-debug-exit
在任何写入 IO 端口时退出,默认为 0x501
i.e 在你的 pintos 项目中 src/utils 目录下你会需要在 run_qemu 子程序
中的 pintos 文件中添加一行
sub run_qemu {
print "warning: qemu doesn't support --terminal\n"
if $vga eq 'terminal';
print "warning: qemu doesn't support jitter\n"
if defined $jitter;
my (@cmd) = ('qemu-system-i386');
push (@cmd, '-device', 'isa-debug-exit'); # <====== add this line
..
..
push (@cmd, '-monitor', 'null') if $vga eq 'none' && $debug eq 'none';
run_command (@cmd);
}
并且在shutdown.c文件中devices目录下
在for循环
之后的shutdown_power_off函数中添加这一行
for (p = s; *p != '[=13=]'; p++)
outb (0x8900, *p);
outb (0x501, 0x31); // <====== add this line
Qemu的exit code是double值加1,所以没办法干净退出。使用 0x31 应该会导致 0x63
的 qemu 退出代码
最终 运行 带有 -q 选项的品脱
pintos -q run alarm-multiple
- 注意:此解决方案不适用于
make grade
请参阅下面@pranav3688 的评论以获取解决方案。
[我知道这个问题专门针对 pintos,但我发现自己从这里的答案中学习,足以在 Linux 下做到这一点。我想我会把它留在这里,以防其他人出于类似原因来到这个页面...]
我发现自己这样做是为了测试目的。这是我使用的 code(运行 在 QEMU 会话中作为 root):
#include <stdio.h>
#include <stdlib.h>
#include <sys/io.h>
#include <unistd.h>
#define SHUTDOWN_PORT 0x604
#define EXIT_PORT 0x501
static void clean_exit(void) {
ioperm(SHUTDOWN_PORT, 16, 1);
outw(0x2000, SHUTDOWN_PORT);
}
int main(int argc, char **argv) {
int status;
if (argc != 2) {
clean_exit();
}
status = atoi(argv[1]);
printf("exiting with status %d (in three seconds)\n", status);
sleep(3);
if (!status) {
clean_exit();
}
ioperm(EXIT_PORT, 8, 1);
/*
* status returned is 1+(2*orig_status)
*/
outb(status-1, EXIT_PORT);
printf("didn't exit.. did you include '-device isa-debug-exit'"
" in qemu command?\n");
exit(1);
}
我的QEMU环境镜像比较稀疏,所以我静态编译如下:
$ gcc -O2 exit.c -o exit --static
用法:
Just exit with status 0 # ./exit
Same as above # ./exit 0
Exit with status 1 # ./exit 1
Exit with status 1+2*(n-1) # ./exit n
出于我的目的,我只真正使用 exit
、exit 0
和 exit 1
。
我希望 qemu
window 打开并显示输出后自动关闭 运行ning pintOS
就像我 运行 在 tcsh
shell 中的命令 pintos -- run alarm-multiple
一样,qemu 显示 process begins,然后一些alarm-notifications
然后 进程结束 ,但在那之后 qemu window 不会关闭
我想在成功完成系统调用后退出 window。
更新:
新解
这是另一个更好的解决方案,适用于 pintos run ...
和 make grade
将此行添加到 devices/shutdown.c :: shutdown_power_off(void ) 在循环之前。
outw( 0x604, 0x0 | 0x2000 );
旧的解决方案
对于较新版本的 qemu,您需要 运行 它带有选项
-device isa-debug-exit
在任何写入 IO 端口时退出,默认为 0x501
i.e 在你的 pintos 项目中 src/utils 目录下你会需要在 run_qemu 子程序
中的 pintos 文件中添加一行sub run_qemu {
print "warning: qemu doesn't support --terminal\n"
if $vga eq 'terminal';
print "warning: qemu doesn't support jitter\n"
if defined $jitter;
my (@cmd) = ('qemu-system-i386');
push (@cmd, '-device', 'isa-debug-exit'); # <====== add this line
..
..
push (@cmd, '-monitor', 'null') if $vga eq 'none' && $debug eq 'none';
run_command (@cmd);
}
并且在shutdown.c文件中devices目录下 在for循环
之后的shutdown_power_off函数中添加这一行for (p = s; *p != '[=13=]'; p++)
outb (0x8900, *p);
outb (0x501, 0x31); // <====== add this line
Qemu的exit code是double值加1,所以没办法干净退出。使用 0x31 应该会导致 0x63
的 qemu 退出代码最终 运行 带有 -q 选项的品脱
pintos -q run alarm-multiple
- 注意:此解决方案不适用于
make grade
请参阅下面@pranav3688 的评论以获取解决方案。
[我知道这个问题专门针对 pintos,但我发现自己从这里的答案中学习,足以在 Linux 下做到这一点。我想我会把它留在这里,以防其他人出于类似原因来到这个页面...]
我发现自己这样做是为了测试目的。这是我使用的 code(运行 在 QEMU 会话中作为 root):
#include <stdio.h>
#include <stdlib.h>
#include <sys/io.h>
#include <unistd.h>
#define SHUTDOWN_PORT 0x604
#define EXIT_PORT 0x501
static void clean_exit(void) {
ioperm(SHUTDOWN_PORT, 16, 1);
outw(0x2000, SHUTDOWN_PORT);
}
int main(int argc, char **argv) {
int status;
if (argc != 2) {
clean_exit();
}
status = atoi(argv[1]);
printf("exiting with status %d (in three seconds)\n", status);
sleep(3);
if (!status) {
clean_exit();
}
ioperm(EXIT_PORT, 8, 1);
/*
* status returned is 1+(2*orig_status)
*/
outb(status-1, EXIT_PORT);
printf("didn't exit.. did you include '-device isa-debug-exit'"
" in qemu command?\n");
exit(1);
}
我的QEMU环境镜像比较稀疏,所以我静态编译如下:
$ gcc -O2 exit.c -o exit --static
用法:
Just exit with status 0 # ./exit
Same as above # ./exit 0
Exit with status 1 # ./exit 1
Exit with status 1+2*(n-1) # ./exit n
出于我的目的,我只真正使用 exit
、exit 0
和 exit 1
。