更新:
新的解决方案
这是另一个更好的解决方案,适用于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项目中,您需要在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);
}
并在devices目录下的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
>注意:此解决方案不适用于制作等级,请参阅@ pranav3688下面的评论以获得解决方案.