OSDev http://osdev.su/ |
|
Перезагрузка http://osdev.su/viewtopic.php?f=6&t=472 |
Страница 2 из 3 |
Автор: | grindars [ 26 апр 2012, 20:12 ] |
Заголовок сообщения: | Re: Перезагрузка |
Вероятно, уже не актуально, но для истории напишу. Перезагрузка описана в таблице Fixed ACPI Description Table (FADT, сигнатура 'FACP', раздел 5.2.9 спецификации 4.0a). Там есть два поля - RESET_REG (универсальный адрес, см. таблицу) и RESET_VALUE (1 байт). Чтобы перезагрузить систему, надо записать RESET_VALUE в RESET_REG. Подробнее сброс описан в разделе 4.7.3.6, в частности, там написано, что ОС может рассчитывать на то, что сброс будет немедленным и следующую инструкцию процессор уже не выполнит. Вот пример с моей машины: Код: [074h 0116 12] Reset Register : <Generic Address Structure> [074h 0116 1] Space ID : 01 (SystemIO) [075h 0117 1] Bit Width : 08 [076h 0118 1] Bit Offset : 00 [077h 0119 1] Access Width : 00 [078h 0120 8] Address : 0000000000000CF9 [080h 0128 1] Value to cause reset : 06 То есть для сброса надо записать байт 0x06 в порт 0xCF9. |
Автор: | Bargest [ 26 апр 2012, 21:12 ] |
Заголовок сообщения: | Re: Перезагрузка |
Между прочим, актуально. Спасибо. Цитата: Therefore, the Address_Space_ID value in RESET_REG must be set to I/O space, Memory space, or PCI Configuration space (with a bus number of 0). То есть Space_ID = 1 для IO, 2 для Memory Space и 3 для PCI CFG? И для PCI CFG Space что означает Address? Делать приходится вслепую, т.к. у меня на компах не юзается ничего, кроме IO портов. |
Автор: | grindars [ 26 апр 2012, 22:11 ] |
Заголовок сообщения: | Re: Перезагрузка |
В разделе 5.2.3.1 структура адреса описана. Обратите только внимание на дополнительные ограничения для RESET_REG. |
Автор: | Bargest [ 27 апр 2012, 00:19 ] |
Заголовок сообщения: | Re: Перезагрузка |
Спасибо, разобрался. Осталось проверить как-нибудь. |
Автор: | valeri [ 27 апр 2012, 08:07 ] |
Заголовок сообщения: | Re: Перезагрузка |
Точно знаю, в Bochs данный способ не прокатит, т.к. там ACPI 1.0 |
Автор: | Станислав [ 27 апр 2012, 08:50 ] |
Заголовок сообщения: | Re: Перезагрузка |
Полезный регистр, а регистра для выключения нету? |
Автор: | grindars [ 27 апр 2012, 09:28 ] |
Заголовок сообщения: | Re: Перезагрузка |
valeri писал(а): Точно знаю, в Bochs данный способ не прокатит, т.к. там ACPI 1.0 Для столь старых систем держать откат на 8042 контроллер (тот самый FE, 64) - уж там-то он точно есть. Станислав писал(а): Полезный регистр, а регистра для выключения нету? Чтобы выключить систему (перевести ее в состояние S5), необходимо записать слово SLP_EN | SLP_TYPa в регистр PM1a_CNT, где SLP_EN - 13-ый бит, SLP_TYPa - тип сна, PM1a_CNT - регистр, указанный во всё той же FADT. Проблемы тут только с SLP_TYPa: его значение хранится в package пространства имен ACPI под именем \_S5 (раздел 7.3.4). По-хорошему, для его чтения нужен интерпретатор AML, а это штука непростая, но есть хак, с помощью которого можно прочитать это поле без интерпретатора, см. эту тему. Еще учтите, что по спецификации ОС должна выполнить несколько методов AML перед выключением. Выключится-то система всё равно, но хрен знает, что там разработчики биоса повесили на эти методы. |
Автор: | phantom-84 [ 27 апр 2012, 09:41 ] |
Заголовок сообщения: | Re: Перезагрузка |
grindars писал(а): Чтобы выключить систему (перевести ее в состояние S5), необходимо записать слово SLP_EN | SLP_TYPa в регистр PM1a_CNT, где SLP_EN - 13-ый бит, SLP_TYPa - тип сна, PM1a_CNT - регистр, указанный во всё той же FADT. Проблемы тут только с SLP_TYPa: его значение хранится в package пространства имен ACPI под именем \_S5 (раздел 7.3.4). По-хорошему, для его чтения нужен интерпретатор AML, а это штука непростая, но есть хак, с помощью которого можно прочитать это поле без интерпретатора, см. эту тему. Кое что есть здесь.Цитата: Еще учтите, что по спецификации ОС должна выполнить несколько методов AML перед выключением. Выключится-то система всё равно, но хрен знает, что там разработчики биоса повесили на эти методы. +1
|
Автор: | Bargest [ 27 апр 2012, 13:24 ] |
Заголовок сообщения: | Re: Перезагрузка |
По поводу выключения я потрошил колибри. Конечно, там нету AML интерпретатора. Они тупо ищут в таблице сигнатуру пакета. Код: xor rax, rax mov rsi, [DSDTAddr] ; Load DSDT addr lodsd ; Signature lodsd ; Length mov rcx, rax add rsi, 24 ; go to first def blocks .ScanDSDT: cmp dword [rsi], '_S5_' jnz .ScanDSDTCont cmp byte [rsi+4], 12h ; DefPackage opcode jnz .ScanDSDTCont mov dl, [rsi+6] cmp dl, 4 ; _S5_ package must contain 4 bytes ; ...in theory; in practice, VirtualBox has 2 bytes ja .ScanDSDTCont cmp dl, 1 jb .ScanDSDTCont lea rsi, [rsi+7] ; scan package: xor rbx, rbx cmp byte [rsi], 0 ; 0 means zero byte, 0Ah xx means byte xx jz @f cmp byte [rsi], 0xA jnz .NoACPIOff inc rsi mov bl, [rsi] ; low byte @@: inc rsi cmp dl, 2 jb @f cmp byte [rsi], 0 jz @f cmp byte [rsi], 0xA jnz .NoACPIOff inc rsi mov bh, [rsi] ; high byte (if exists) @@: jmp .ACPIPowerOff .ScanDSDTCont: inc rsi loop .ScanDSDT ; Found a command .ACPIPowerOff: mov rdi, [FADTAddr] mov edx, [rdi+48] and bx, 0x0707 shl bx, 2 or bx, 0x2020 mov edx, [rdi+64] in ax, dx and ax, 203h or ah, bl out dx, ax mov edx, [rdi+68] test edx, edx jz @f in ax, dx and ax, 203h or ah, bh out dx, ax @@: jmp $ .NoACPIOff: ret Хотя часть этого шаманства (в конце, уже при выключении) я не особо понимаю. Сие есть временная заглушка, пока не возьмусь за хоть как-нибудь работающий интерпретатор. Такой метод выключения срабатывает. С громким "Пииууу...." от резко отключенного питания на вращающихся хардах и другом оборудовании. Вообщем как будто выдернули шнур питания. [offtop] Надо будет потестировать на моем новом компе. Там при выключении через зажатие кнопки питания комп вырубается, но через 5 секунд врубается по новой. Вполне возможно, тут не прокатит этот "ломовой" перевод в S5. [/offtop] |
Автор: | grindars [ 27 апр 2012, 13:55 ] |
Заголовок сообщения: | Re: Перезагрузка |
Именно о таких эффектах я и говорю. Чтобы система нормально отключалась (с винтами и без рестарта), надо выполнять те методы перед выключением. |
Страница 2 из 3 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |