Работа с несколькими процессорами

Тема в разделе "WASM.HARDWARE", создана пользователем PROFi, 8 май 2007.

  1. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    и со включенным страничным режимом тоже
    есть иерархия типов кэширования
    они могут задаваться как с помощью PAT, так и с помощью MTRR-ов и PCD/PWT
    в случае перекрытия регионов (например когда страница описывается как MTRR-ом, так и спомощью PCD/PWT) выбирается более сильный критерий кэширования
    иерархия: UC -> WC -> WT -> WB (от более сильного к слабому)
     
  2. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    rei3er
    Хм... буду знать. Заблуждался, что при использовании PCD/PWT PAT берется только из них, а MSR игнорируются.
     
  3. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Начитался Intel'овских мануалов... если верить спецификации (придерживаются ли ее производители BIOS'ов - вот вопрос...) - то при загрузке выполняется инициализация ВСЕХ процессоров - после чего все, кроме BootStrap-процессора загоняются в cli-hlt. Отсюда вопрос - так ли надо им INIT IPI?
    Вопроc пока отложил, ковыряю I/O APIC... во там понаворочено - крыша едет :dntknw:
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Ustus
    угу, я тоже читал MultiProcessor Specification. По крайне мере так заполняется таблица конфигурации APIC BIOS'ом. Которую рекомендуют юзать в ОСях. Так и делают некоторые ОСи. ROS, Win, например.
     
  5. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    если верить спецификации, то надо
    лучше юзать ACPI (в частности MADT (Multiple APIC Description Table))
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    rei3er
    у меня в спецификации написано что можно и просто STARTUP послать.
     
  7. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    n0name
    такое чувство, что у нас разные спецификации :)
     
  8. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    MultiProcessor Specification Version 1.4 May 1997
    24201606.pdf

    Может есть поновее, однако только такую нашёл.
     
  9. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Я так понял, что поновее нет. Но в "Intel® 64 and IA-32 Architectures Software Developer’s Manual" в принципе расписано довольно подробно, я так понял, что они отдельно мультипроцессорную спецификацию уже не выпускают, а приписали все к процам, тем более, что для HT там еще свои заморочки... правда где оно теперь, то HT :). Еще для полноты картины - "BIOS and Kernel Developer's Guide for AMD AthlonTM 64 and AMD OpteronTM Processors" - там некоторые вещи опущены, зато APIC на мой взгляд, лучше описан. Ох... чувствую, под этими двумя глыбами меня и похоронят :dntknw:
     
  10. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    не все так сложно :)
     
  11. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    rei3er
    Не сложно - много... трудно выковыривать информацию, которой мне надо всего-то ничего... а тут еще руки чешутся на x86-64 она же AMD64 она же Intel 64 она же EM64T (существовать под столькими именами - свойство темных личностей :):):) ). А сейчас уперся в I/O APIC - блин, придется наверное Линух ставить, без живого кода буквы из мануалов остаются просто буквами :dntknw:
     
  12. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    не обязательно :)
    тут
     
  13. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Ustus
    скачай ядро линуха. Оно обычно в сорцах. Плюс linux-bios, в нём тоже про apic кое-что есть. В ReactOS'е тоже не мало.
     
  14. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    Подскажите, что я делаю не так:
    Код (Text):
    1.     QWORD apic  = ReadMSR(IA32_APIC_BASE); // _asm { mov ecx, 0x1b; rdmsr }
    2.     size_t addr = size_t(apic&APIC_MSR_BASE_M); // addr = apic & 0xfffff000
    3.     RegisterPage(addr, addr, PAGE_ATTR_KERNEL | PAGE_FLAG_PCD ); // pg_attr = 0x13 (PCD, READABLE, PRESENTED)
    4.     FBase = reinterpret_cast<DWORD *>(addr); // FBase = 0xffe00000
    5.  
    6.     InvalidatePage(0x90000); // _asm { mov eax, 0x90000; invlpg [eax]; }
    7.     RegisterPage(0x90000, 0x90000, PAGE_ATTR_KERNEL | PAGE_FLAG_PCD ); // pg_attr = 0x13
    8.  
    9.     BYTE *ptr = reinterpret_cast<BYTE *>(0x90000); // Copy 16-bit code to linear 0x90000
    10.     memcpy(ptr, RealmodeSeg, 0x10000);
    11.  
    12.     TIntHandler::ClearInterrupts(); // _asm { CLI }
    13.     FBase[APIC_DWREG_ICR0] = 0x000c0500; //0x000c4500 (?);        // INIT IPI
    14.  
    15.     for (int i=0; i<0x1000000; i++)   ;       // delay
    16.    
    17.     FBase[APIC_DWREG_ICR0] = 0x000c0690; //0x000c4690 (?);        // STARTUP IPI 0x000c46xx
    18.  
    19.     for (int i=0; i<0x1000000; i++)   ;       // delay
    20.  
    21.     FBase[APIC_DWREG_ICR0] = 0x000c0690; //0x000c4690 (?);        // STARTUP IPI 0x000c46xx
    22.  
    23.     while (true);
    16-битный код:

    Код (Text):
    1. public _realmode_entry
    2. _realmode_entry:
    3.     cli
    4.     mov     ax, cs
    5.     mov     ds, ax
    6.     mov     fs, ax
    7.     mov     gs, ax
    8.  
    9.     mov     ax, 0b800h
    10.     mov     es, ax
    11.  
    12.     mov     si, offset realmode_message
    13.     xor     di, di
    14.     mov     ah, 0x1e
    15.  
    16. real_out_loop:
    17.     lodsb
    18.     test    al, al
    19.     jz      real_out_end
    20.    
    21.     stosw
    22.    
    23.     jmp real_out_loop
    24.  
    25. real_out_end:
    26.     jmp     $
    27.    
    28. realmode_message:
    29.     db      "Hello from another processor!", 0
    RealmodeSeg == _realmode_entry (совпадают адреса)

    В qemu не стартует, на атлоне x2 тоже. Не вижу текста на экране.
     
  15. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    SadKo

    А что ты хочешь сделать ?
     
  16. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    Стартануть второй проц, чтобы вывел текст в видеобуфер и зациклился.
    После посылки IPI-SIPI-SIPI 0 реакции.
     
  17. k3internal

    k3internal New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2007
    Сообщения:
    607
    PROFi
    лучче тебе копать в сторону ACPI
     
  18. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    SadKo

    Стартануть второй проц, чтобы вывел текст в видеобуфер и зациклился.
    После посылки IPI-SIPI-SIPI 0 реакции.


    Тогда вышеприведенный код - только выдранные, абсолютно несвязанные куски. Лучше об этом почитать мануалы к процу от intel (там все понятно расписано в разделе Multiprocessor Initialization) или посмотри как BIOS делает это.

    http://icbook.com.ua/post/_amimps/index.html

    Приведи весь код (только упакованным, чтобы собирался) тогда что нибудь поглядим.
     
  19. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    Так этот код - часть драйвера в ядре...
    Исходники лежат здесь - http://xskernel.svn.sf.net/
    Конкретно что я делаю с APIC - http://xskernel.svn.sourceforge.net/viewvc/xskernel/xskernel/include/io/apic/file.cpp?revision=170&view=markup

    Код я брал из ia32 manual, но, по ходу, чего-то не доглядел...
    Единственное - этот код у меня сейчас закомментирован, так как всё равно не даёт эффекта (/* */).

    P.S. За ссылку спасибо.
     
  20. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    Разобрался с процессорами. Просто они стартовали, но выполняли всякую фигню (проблема оказалась в оффсетах).