#pintos
#pintos
Вопрос:
Я только начинаю работать с проектами pintos, работая со своего домашнего компьютера под управлением ubuntu 14.04 x64.
Я могу скомпилировать проект из src/threads/
каталога, и первоначальный тест pintos run alarm-multiple
, похоже, работает нормально (обратите внимание, что он запускает qemu по умолчанию):
zay@ubuntu:~/Documents/pintos/src/threads/build$ pintos run alarm-multiple
Prototype mismatch: sub main::SIGVTALRM () vs none at /home/zay/Documents/pintos/src/utils/pintos line 935.
Constant subroutine SIGVTALRM redefined at /home/zay/Documents/pintos/src/utils/pintos line 927.
qemu-system-x86_64 -drive cache=writeback,file=/tmp/YS3E7FICwo.dsk -m 4 -net none -serial stdio
PiLo hda1
Loading..........
Kernel command line: run alarm-multiple
Pintos booting with 4,088 kB RAM...
382 pages available in kernel pool.
382 pages available in user pool.
Calibrating timer... 286,310,400 loops/s.
Boot complete.
Executing 'alarm-multiple':
(alarm-multiple) begin
(alarm-multiple) Creating 5 threads to sleep 7 times each.
(alarm-multiple) Thread 0 sleeps 10 ticks each time,
(alarm-multiple) thread 1 sleeps 20 ticks each time, and so on.
(alarm-multiple) If successful, product of iteration count and
(alarm-multiple) sleep duration will appear in nondescending order.
(alarm-multiple) thread 0: duration=10, iteration=1, product=10
(alarm-multiple) thread 0: duration=10, iteration=2, product=20
Однако, когда я make check
запускаюсь src/threads/build
, все тесты получают ошибку тайм-аута:
zay@ubuntu:~/Documents/pintos/src/threads/build$ make check
pintos -v -k -T 60 --qemu -- -q run alarm-multiple < /dev/null 2> tests/threads/alarm-multiple.errors > tests/threads/alarm-multiple.output
perl -I../.. ../../tests/threads/alarm-multiple.ck tests/threads/alarm-multiple tests/threads/alarm-multiple.result
FAIL tests/threads/alarm-multiple
run: TIMEOUT after 61 seconds of wall-clock time - load average: 0.20, 0.45, 0.26
pintos -v -k -T 60 --qemu -- -q run alarm-simultaneous < /dev/null 2> tests/threads/alarm-simultaneous.errors > tests/threads/alarm-simultaneous.output
perl -I../.. ../../tests/threads/alarm-simultaneous.ck tests/threads/alarm-simultaneous tests/threads/alarm-simultaneous.result
FAIL tests/threads/alarm-simultaneous
run: TIMEOUT after 61 seconds of wall-clock time - load average: 0.18, 0.40, 0.25
pintos -v -k -T 60 --qemu -- -q run alarm-priority < /dev/null 2> tests/threads/alarm-priority.errors > tests/threads/alarm-priority.output
perl -I../.. ../../tests/threads/alarm-priority.ck tests/threads/alarm-priority tests/threads/alarm-priority.result
FAIL tests/threads/alarm-priority
run: TIMEOUT after 61 seconds of wall-clock time - load average: 0.10, 0.34, 0.2
Какие изменения я должен внести, чтобы решить эту проблему?
Ответ №1:
По-видимому, QEMU больше не поддерживает последовательность отключения питания на порту 0x8900
. Вот исправление, которое заставило его работать на меня (найдено в chaOs): в devices/shutdown.c
исправлении файла shutdown_power_off
следующим образом:
void
shutdown_power_off (void)
{
// ...
printf ("Powering off...n");
serial_flush ();
outw (0xB004, 0x2000); // <-- Add this line
// ...
}
Комментарии:
1. Эта строка была включена в более новые версии из того, что я вижу; но я все еще получаю ту же ошибку, время от времени
Ответ №2:
Если вы используете qemu для pintos. Вам нужно добавить одну строку кода devices/shutdown.c
.
Вставьте строку outw( 0x604, 0x0 | 0x2000 );
после printf (“Powering off…n”); serial_flush ();
, как показано ниже:
/* This is a special power-off sequence supported by Bochs and
QEMU, but not by physical hardware. */
for (p = s; *p != ' printf ("Powering off...n");
serial_flush ();
//add the following line
outw( 0x604, 0x0 | 0x2000 );
Следуйте этому руководству, чтобы узнать больше