OSDev

для всех
Текущее время: 28 апр 2024, 01:28

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 30 ]  На страницу Пред.  1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Re: Перезагрузка
СообщениеДобавлено: 26 апр 2012, 20:12 

Зарегистрирован: 22 май 2007, 15:29
Сообщения: 283
Вероятно, уже не актуально, но для истории напишу.

Перезагрузка описана в таблице 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.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Перезагрузка
СообщениеДобавлено: 26 апр 2012, 21:12 

Зарегистрирован: 31 окт 2011, 18:20
Сообщения: 230
Между прочим, актуально.:)
Спасибо.

Цитата:
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 портов.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Перезагрузка
СообщениеДобавлено: 26 апр 2012, 22:11 

Зарегистрирован: 22 май 2007, 15:29
Сообщения: 283
В разделе 5.2.3.1 структура адреса описана. Обратите только внимание на дополнительные ограничения для RESET_REG.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Перезагрузка
СообщениеДобавлено: 27 апр 2012, 00:19 

Зарегистрирован: 31 окт 2011, 18:20
Сообщения: 230
Спасибо, разобрался. Осталось проверить как-нибудь.:)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Перезагрузка
СообщениеДобавлено: 27 апр 2012, 08:07 

Зарегистрирован: 13 окт 2008, 17:38
Сообщения: 46
Откуда: Владимир
Точно знаю, в Bochs данный способ не прокатит, т.к. там ACPI 1.0


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Перезагрузка
СообщениеДобавлено: 27 апр 2012, 08:50 
Заблокирован

Зарегистрирован: 28 окт 2011, 12:14
Сообщения: 555
Откуда: Новосибирск
Полезный регистр, а регистра для выключения нету?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Перезагрузка
СообщениеДобавлено: 27 апр 2012, 09:28 

Зарегистрирован: 22 май 2007, 15:29
Сообщения: 283
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 перед выключением. Выключится-то система всё равно, но хрен знает, что там разработчики биоса повесили на эти методы.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Перезагрузка
СообщениеДобавлено: 27 апр 2012, 09:41 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Перезагрузка
СообщениеДобавлено: 27 апр 2012, 13:24 

Зарегистрирован: 31 окт 2011, 18:20
Сообщения: 230
По поводу выключения я потрошил колибри. Конечно, там нету 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]


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Перезагрузка
СообщениеДобавлено: 27 апр 2012, 13:55 

Зарегистрирован: 22 май 2007, 15:29
Сообщения: 283
Именно о таких эффектах я и говорю. Чтобы система нормально отключалась (с винтами и без рестарта), надо выполнять те методы перед выключением.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 30 ]  На страницу Пред.  1, 2, 3  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 20


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB