Холодный reset CPU - как сделать напрямую?

Тема в разделе "WASM.BEGINNERS", создана пользователем 4omin, 23 апр 2008.

  1. 4omin

    4omin New Member

    Публикаций:
    0
    Регистрация:
    23 апр 2008
    Сообщения:
    22
    Добрый день.
    Возможно это уже обсуждалось, но я не нашел.
    Я знаю такой способ (real mode):

    mov al, 0FEh
    out 064h, al

    Вопрос такой: а как можно сделать RESET CPU напрямую, без обращения к
    клаве?
    Ведь если клава может это сделать, то очевидно
    прямой способ существует?
     
  2. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    4omin
    Если в реальном режиме, а ведь ты пытаешься перезагрузить комп через обращение к порту, тогда должно прокатить вот это,
    Код (Text):
    1. .model tiny
    2. .code
    3. org 100h
    4. .startup
    5. jmp dword ptr reboot
    6. reboot dd 0FFFF0000h
    7. end
    а если через защищенный режим - тогда геморой:dntknw:
     
  3. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    4omin
    Есть прямой способ, только надо знать какой проводок замкнуть. Вот клава она знает.
     
  4. 4omin

    4omin New Member

    Публикаций:
    0
    Регистрация:
    23 апр 2008
    Сообщения:
    22
    Если я правильно понял - то просто выход в самый последний сегмент?
    А почему такой эффект?
     
  5. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Это переход по адресу 0FFFF:0000
    А эффект такой потому что по этому адресу находится код BIOS (точнее jmp на код) сброса процессора.
    Это абсолютно не "прямой способ". Ничем не прямее твоего.
    Просто немного универсальнее. Система может быть не совместима с IBM PC на уровне оборудования, но совместима на уровне BIOS.
    Тогда твой код не сработает, а код BIOS сработает.
     
  6. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    смотреть в сторону RST_CNT (Reset Control Register) который доступен через порт 0xCF9
    естественно, наличие этого порта специфично для конкретного чипсета
     
  7. 4omin

    4omin New Member

    Публикаций:
    0
    Регистрация:
    23 апр 2008
    Сообщения:
    22
    Благодарю. Большая универсальность, это уже хорошо :derisive:))
    Но ведь если BIOS умеет делать ресет, то значит все-таки есть такая
    инструкция CPU???
    Или я чего-то не догоняю?
     
  8. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Нету инструкции. Есть порт в который биос пошлет команду. Или набор портов.
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    он даже кривее, потому что код по этому адресу в конце концов все равно выполнит такой сброс..
     
  10. 4omin

    4omin New Member

    Публикаций:
    0
    Регистрация:
    23 апр 2008
    Сообщения:
    22
    А как спросить у чипсета - есть этот порт или нет?
    И вообще, где можно прочитать про обязательные порты чипсета?
     
  11. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    винда и линукс юзают ребут через клаву, думается это оптимальный способ.
     
  12. 4omin

    4omin New Member

    Публикаций:
    0
    Регистрация:
    23 апр 2008
    Сообщения:
    22
    Может подскажете, где про это почитать?
     
  13. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    по идее он должен вызывать код, который будет писать в регистры чипсета. Естественно вендорозависимый код.
    например для p2b:
    Код (Text):
    1. typedef unsigned device_t;
    2.  
    3. #define PCI_DEV(BUS, DEV, FN) ( \
    4.     (((BUS) & 0xFF) << 16) | \
    5.     (((DEV) & 0x1f) << 11) | \
    6.     (((FN)  & 0x7) << 8))
    7.  
    8. static void pci_write_config8(device_t dev, unsigned where, unsigned char value)
    9. {
    10.         unsigned addr;
    11.         addr = dev | where;
    12.         outl(0x80000000 | (addr & ~3), 0xCF8);
    13.         outb(value, 0xCFC + (addr & 3));
    14. }
    15.  
    16. void hard_reset(void)
    17. {
    18.     set_bios_reset();
    19.     pci_write_config8(PCI_DEV(1, 0x04, 0), 0x47, 1);
    20. }
     
  14. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    обязательных портов нет
    хотя ради совместимости большинство фиксированных в адресном пространстве I/O портов обычно поддерживаются всеми чипсетами
     
  15. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    что касается линукса, то он использует два способа
    один через KBC, второй через triple fault
    Код (Text):
    1. void machine_emergency_restart(void)
    2.  {
    3.          int i;
    4.  
    5.          /* Tell the BIOS if we want cold or warm reboot */
    6.          *((unsigned short *)__va(0x472)) = reboot_mode;
    7.        
    8.          for (;;) {
    9.                  /* Could also try the reset bit in the Hammer NB */
    10.                  switch (reboot_type) {
    11.                  case BOOT_KBD:
    12.                  for (i=0; i<10; i++) {
    13.                          kb_wait();
    14.                          udelay(50);
    15.                          outb(0xfe,0x64);         /* pulse reset low */
    16.                          udelay(50);
    17.                  }
    18.  
    19.                  case BOOT_TRIPLE:
    20.                          __asm__ __volatile__("lidt (%0)": :"r" (&no_idt));
    21.                          __asm__ __volatile__("int3");
    22.  
    23.                          reboot_type = BOOT_KBD;
    24.                          break;
    25.                  }      
    26.          }      
    27.  }
     
  16. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    угу видел код, только не допер сначала про triple fault.
     
  17. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    Может поможет чем:
     
  18. 4omin

    4omin New Member

    Публикаций:
    0
    Регистрация:
    23 апр 2008
    Сообщения:
    22
    А где прочитать про "большинство фиксированных в адресном пространстве I/O портов", может подскажете? А то я уже всю доступную литературу и мануалы перечитал, но так и не нашел описания больше чем на одну страничку :-((
     
  19. 4omin

    4omin New Member

    Публикаций:
    0
    Регистрация:
    23 апр 2008
    Сообщения:
    22
    Опять же юзается все тот же порт... Печально :))
     
  20. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    4omin
    Так наоборот радоваться надо что стондарт.

    ДЫк много где написанно. Все устройства ISA такие как COM, LPT, CMOS, DMA,PIT,PIC, FDC,HDC, Контроллер клавиотуры 8042, VGA/EGA видео карта.
    Помимо этого порт системы POST, порты для работы с шиной PCI. И чем дальше тем менее стандартерезированно.

    Расписанно много где. Библеотека системного программиста к примеру. Ральф Браун Interupt. Кулаков программированиие на аппоратном уровне. Файл IO.PTR - "Пpогpаммно-технические сpедства пеpсональных ЭВМ семейства IBM PC" И тд и тому подобное.