如何在进程结束后自动关闭`qemu`的执行?

时间:2017-02-13 15:55:38

标签: linux operating-system qemu pintos

我希望在打开并显示输出后qemu窗口在运行pintOS后自动关闭

就像我在pintos -- run alarm-multiple shell中运行命令tcsh一样,qemu显示进程开始,然后是一些alarm-notifications然后进程结束,但之后qemu窗口不会关闭

我想在成功完成系统调用后退出窗口。

2 个答案:

答案 0 :(得分:3)

<强>更新:

新解决方案

这是另一个更适合 pintos run ... make grade

的解决方案

在循环之前将此行添加到 devices / shutdown.c :: shutdown_power_off(void)

outw( 0x604, 0x0 | 0x2000 ); 

旧解决方案

对于较新版本的qemu,您需要使用选项

运行它
-device isa-debug-exit

对IO端口的任何写入都会退出,默认情况下为0x501

src / utils 目录下的 pintos 项目中

,您需要在 pintos 添加一行 strong>运行 run_qemu 子程序

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 文件 在for循环

之后的 shutdown_power_off 函数中添加此行
for (p = s; *p != '\0'; p++)
    outb (0x8900, *p);

outb (0x501, 0x31); // <====== add this line

Qemu的退出代码是值的两倍加一,因此无法完全退出。使用0x31,这将导致qemu退出代码为0x63

最后使用-q选项运行pintos

pintos -q run alarm-multiple
  • 注意:此解决方案不适用于 make grade ,请参阅@ pranav3688下面的评论以获得解决方案。

答案 1 :(得分:0)

[我知道这个问题专门针对 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

出于我的目的,我只真正使用 exitexit 0exit 1