OSDev

для всех
Текущее время: 09 май 2024, 11:18

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




Начать новую тему Ответить на тему  [ Сообщений: 17 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re^6: Реализация перезагрузки
СообщениеДобавлено: 05 окт 2009, 21:43 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Перезагрузка ни от чего не зависит. С твоей ОС одна новость хорошая, и одна плохая. Хорошая: перезагрузка работает. Запускал 'FastReboot.bin' и также 'Reboot.bin'. Это на процессоре Athlon X2 4000, чипсет nForce 570. Плохая: на другом компьютере система не загружается. Процессор Intel 8200, чипсет P35. Зависание на строке Checking 'Loader.bin'.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re^7: Реализация перезагрузки
СообщениеДобавлено: 05 окт 2009, 23:07 

Зарегистрирован: 30 сен 2009, 20:26
Сообщения: 12
всё загадочней и загадочней
проверил еще и на ноуте. бутанулось норм, но перезагрузка точно так же висит :)
тоесть, от чего-то код ребута таки зависит. только эта связь на некоторых компах почему-то не проявляется
однако в любом случае информация о том что на реальном железе перезагрузка в моей ОС может заработать - это хорошая новость. за это спасибо
---
загрузка у меня разбита на 2 этапа
ядро и первая порция драйверов грузится бутлоадером с помощью биоса
затем управление передается ядру, ядро проверяет CRC того что нагрузил бутлоадер и запускает диспетчеризацию
после этого вся дальнейшая работа ОСьки зависит от того как сработают загруженные бутлоадером драйверы
так что скорее всего в описанном тобой случае у драйвера ATA не получилось отдетектить CD
буду еще его улучшать )


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re^8: Реализация перезагрузки
СообщениеДобавлено: 06 окт 2009, 11:15 

Зарегистрирован: 30 сен 2009, 20:26
Сообщения: 12
провел простой эксперимент:
закинул в список загружаемых драйверов файл 'Reboot.bin'
загрузка... ребут! всё работает
значит БИОСу мешает ребутнуться какой-то мой драйвер
из всех драйверов у меня больше всего подозрений вызывает драйвера VGA
я ж меняю видеорежим вручную. может биосу это не нравится...
думал поможет занулить первую страницу памяти... не помогло...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re^9: Реализация перезагрузки
СообщениеДобавлено: 08 окт 2009, 20:12 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
VGA не влияет на CMOS и контроллер клавиатуры. Лучше смотри что делает ОС с CMOS и контроллером клавиатуры. Возможно, где-то нарушена последовательность записи в порты индекса и данных.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re^10: Реализация перезагрузки
СообщениеДобавлено: 08 окт 2009, 23:18 

Зарегистрирован: 30 сен 2009, 20:26
Сообщения: 12
ппц мне повезло!
сегодня я решил переписать с нуля драйвер клавиатуры
прошлый был просто ужасен. на некоторых ВМках вобще переполнение стека вылазило
так вот... на реальном компе у меня КОМовская мыша (да, есть еще такие)
тестировать этот драйвер я решил так: убираю его из автозапуска и КОМовской мышей кликаю запуск драйвера. при этом палю лог =) че там кто куда шлёт
---
так вот к чему это привело...
щас увидел твоё сообщение и решил в очередной раз проверить ребут
тыкаю - ребутается. офигеваю O_o
потом только дошло что перед ребутом не был прогружен драйвер клавы
чтобы удостовериться... гружусь еще раз. тыркаю мышкой по драйверу клавы, тыркаю ребут - виснет
и это с новым, переписанным драйвером клавы
там и кода то почти нету... разве что мышку разрешаю
---
короч вот он. думаю вызовы будут понятны. (вычислил гада. хехе)
Код:
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// i8042.cpp#include "API.h"

// ----------------------------------------------------------------------------
class Ci8042
{
public:
  Ci8042()
   {
          m_IsScrollActive = false;
              m_IsNumActive = false;
         m_IsCapsActive = false;

           KeUnmaskIRQ(1);
                KeUnmaskIRQ(12);
               KeEnableNotification(NfKe_IRQ0);
               KeEnableNotification(NfKe_IRQ1);
               KeEnableNotification(NfKe_IRQ12);
              KeEnableNotification(NfKe_TerminateProcess);
           KeEnableNotification(NfKeyboard_SwitchLEDStatus);

         InitDevices();

            CNotification<16> N;
               for (;;)
               {
                  KeWaitFor(1);
                  dword NfCount = KeGetNotificationCount();

                     for (dword z = 0; z < NfCount; z++)
                    {
                          N.Recv();
                              if (N.GetID() == NfKe_IRQ0)
                            {
                                  m_TimeoutTimer++;
                                      if (m_TimeoutTimer >= 20)
                                  {
                                          KeDisableNotification(NfKe_IRQ0);
                                              //DebugOut("[MouseInitTimeout]", 18);
                                              KeInPortByte(0x60);
                                            m_IsInitFinished = true;
                                       }
                          }
                          else if (N.GetID() == NfKe_IRQ1)
                           {
                                  byte D = KeInPortByte(0x60);

                                  //DebugOut("[fK:", 4);
                                     //DebugOut(D);
                                 //DebugOut("]", 1);

                                       OnKeybByte(D);
                         }
                          else if (N.GetID() == NfKe_IRQ12)
                          {
                                  bool M = false;
                                    if (KeInPortByte(0x64) & 0x20)
                                         M = true;
                                      byte D = KeInPortByte(0x60);

                                  //if (M)
                                       //      DebugOut("[fM:", 4);
                                       //else
                                     //      DebugOut("[fm:", 4);
                                       //DebugOut(D);
                                 //DebugOut("]", 1);

                                       if (M)
                                         OnMouseByte(D);
                                }
                          else if (N.GetID() == NfKeyboard_SwitchLEDStatus)
                          {
                                  SwitchLEDStatus(N.GetByte(0));
                         }
                          else if (N.GetID() == NfKe_TerminateProcess)
                                       return;
                        }

                     if (KeGetNotificationCount() == 0)
                     {
                          if (m_LEDSwitchState == 1)
                             {
                                  SendKeyboardData(0xED);
                                        m_LEDSwitchState = 2;
                          }
                          else if (m_LEDSwitchState == 3)
                            {
                                  SendKeyboardData(m_LEDStatus);
                                 m_LEDSwitchState = 4;
                          }
                  }
          }
  }

     void InitDevices()
     {
          m_TimeoutTimer = 0;
            m_LEDSwitchState = 0;
          m_IsInitFinished = false;

         // Write Command Byte
          SendControllerCommand(0x60);
           // For Mouse And Keyboard
          // Enable Interface, Enable Interrupts, Enable XLAT
                SendKeyboardData(0x43);

           // Enable Mouse Data Reporting
             SendMouseCommand(0xF4);
        }

     void OnKeybByte(byte B)
    {
          if (B == 0xFA)
         {
                  if (m_LEDSwitchState == 2)
                     {
                          m_LEDSwitchState = 3;
                          return;
                        }
                  else if (m_LEDSwitchState == 4)
                    {
                          m_LEDSwitchState = 0;
                          return;
                        }
          }
          KeNotify(Nfi8043_KeyboardData, &B, 1);
 }

     void OnMouseByte(byte B)
   {
          if (!m_IsInitFinished)
         {
                  KeDisableNotification(NfKe_IRQ0);
                      m_IsInitFinished = true;
                       return;
                }

             KeNotify(Nfi8043_MouseData, &B, 1);
    }

     void SwitchLEDStatus(byte LEDIndex)
        {
          if (LEDIndex == 0)
                     m_IsScrollActive = !m_IsScrollActive;
          else if (LEDIndex == 1)
                    m_IsNumActive = !m_IsNumActive;
                else if (LEDIndex == 2)
                    m_IsCapsActive = !m_IsCapsActive;
              else
                       return;

           m_LEDStatus =
                     (m_IsScrollActive << 0) |
                      (m_IsNumActive << 1) |
                 (m_IsCapsActive << 2);
         if (m_LEDSwitchState == 0)
                     m_LEDSwitchState = 1;
  }

     void SendMouseCommand(byte Cmd)
    {
          SendControllerCommand(0xD4);
           SendKeyboardData(Cmd);
 }

     void SendControllerCommand(byte Cmd)
       {
          //DebugOut("[tC:", 4);
             //DebugOut(Cmd);
               WaitForDataWrite();
            KeOutPortByte(0x64, Cmd);
          //DebugOut("]", 1);
    }

     void SendKeyboardData(byte Cmd)
    {
          //DebugOut("[tK:", 4);
             //DebugOut(Cmd);
               WaitForDataWrite();
            KeOutPortByte(0x60, Cmd);
          //DebugOut("]", 1);
    }

     void WaitForDataWrite()
        {
          while (KeInPortByte(0x64) & 2);
    }

private:
    dword m_LEDSwitchState;

       bool m_IsInitFinished;
     dword m_TimeoutTimer;

 bool m_IsScrollActive;
     bool m_IsNumActive;
        bool m_IsCapsActive;

  byte m_LEDStatus;
};

// ----------------------------------------------------------------------------
void Entry()
{
       if (!KeSetSymbol(Sm_Lock_i8042))
               return;

   Ci8042 i8042;
}
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re^11: Реализация перезагрузки
СообщениеДобавлено: 10 окт 2009, 09:39 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Попробуй перед Reset-ом выполнить деинициализацию. Сделай всё наоборот, что делается в процедуре инициализации по всем пунктам.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re^12: Реализация перезагрузки
СообщениеДобавлено: 10 окт 2009, 18:20 

Зарегистрирован: 30 сен 2009, 20:26
Сообщения: 12
виновником оказался один мелкий, мерзкий, гадкий бит!
находящийся в командном байте контроллера клавы по смещению 2
когда я инициализировал клаву, то я туда записывал ноль
так как он мне как бы и нафиг был не нужен
но как назло оказалось что без него ребут получался какой-то неправильный...
---
вобщем, всё заработало, всем большое спасибо!!!
вот рабочий код:
Код:
void Reboot()
{
      // Set CMOS
        _outp(0x70, 0x8F); // 0xF "Reset Code", 0x80 "NMI Disabled"
    _outp(0x71, 0x00); // "Software reset or unexpected reset"

    // Write Command Byte
  while (_inp(0x64) & 2);
    _outp(0x64, 0x60);

    // Enable Scan Code Translation
    // Disable Mouse Interface
     // Enable Keyboard Interface
   // Set System Flag (!)
     // Enable Interrupts
       while (_inp(0x64) & 2);
    _outp(0x60, 0x67);

    // Keyb Reboot
     while (_inp(0x64) & 2);
    _outp(0x64, 0xFE);

    for (;;);
}


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

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


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

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


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

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