Как автоматически закрыть выполнение qemu после завершения процесса?

Я хочу, чтобы окно qemu после открытия и отображения вывода автоматически закрывалось после запуска pintOS

Например, когда я запускаю команду pintos -- run alarm-multiple в оболочке tcsh, qemu отображает, что процесс начинается, затем немного alarm-notifications, а затем процесс завершается, но после этого окно qemu не закрывается

Я хочу выйти из окна после успешного завершения моего системного вызова.


person Alfran    schedule 13.02.2017    source источник
comment
Это указывает на то, что ваш pintOS не выходит должным образом. Убедитесь, что он выходит правильно, т.е. возвращается к своему родителю.   -  person rakib_    schedule 13.02.2017
comment
Я думаю, вы не прочитали мою проблему должным образом. Я хочу, чтобы окно qemu закрывалось автоматически, в pintOS проблем нет.   -  person Alfran    schedule 13.02.2017


Ответы (2)


ОБНОВЛЕНО:


Новое решение

Вот еще одно лучшее решение, которое будет работать как для pintos run ..., так и для make grade.

добавьте эту строку в devices/shutdown.c :: shutdown_power_off(void) перед циклом.

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

Старое решение

Для более новых версий qemu вам нужно запустить его с опцией

-device isa-debug-exit

Который завершается при любой записи в порт ввода-вывода, по умолчанию это 0x501.

то есть в проекте pintos в каталоге src/utils вам нужно будет добавить одну строку в файл pintos в подпрограмме 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 в каталоге devices добавьте эту строку в функцию shutdown_power_off после цикла for

for (p = s; *p != '\0'; p++)
    outb (0x8900, *p);

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

Код выхода Qemu равен удвоенному значению плюс один, поэтому чистый выход невозможен. Используйте 0x31, что должно привести к коду выхода qemu 0x63.

наконец запустите pintos с опцией -q

pintos -q run alarm-multiple
  • Примечание: это решение не будет работать для make grade. См. комментарий ниже от @pranav3688 для решения.
person yakout    schedule 17.11.2017
comment
это работает в общем случае, но терпит неудачу, когда make grade выполняется с qemu, потому что ему нужен чистый выход (код возврата = 0, а не 0x63).... чтобы исправить это, измените строку 896 сценария sub xsystem pintos на return 0 с return $? ( которые возвращают 0x63 ) - person pranav3688; 07.01.2018
comment
Да, ты прав. На самом деле, я также нашел другое решение, отличное от того, что я написал, вы можете просто добавить эту строку =› outw( 0x604, 0x0 | 0x2000 ); в /shutdown.c : shutdown_power_off(void) перед петля. Скажите, если это тоже сработает, я обновлю пост для обоих решений. - person yakout; 07.01.2018

[Я понимаю, что вопрос относится конкретно к пинто, но я обнаружил, что извлек уроки из ответов здесь, и этого достаточно, чтобы сделать это под Linux. Я решил оставить это здесь на случай, если другие зайдут на эту страницу по тем же причинам...]

Я обнаружил, что делаю это в целях тестирования. Вот код Я использовал (запуск от имени пользователя root из сеанса QEMU):

#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.

person Andrew G Morgan    schedule 13.03.2021