Обсуждение SMP

Тема в разделе "WASM.HARDWARE", создана пользователем quester, 18 авг 2009.

  1. quester

    quester New Member

    Публикаций:
    0
    Регистрация:
    26 янв 2009
    Сообщения:
    7
    Нужна помощь с программированием многопроцессорной системы
     
  2. quester

    quester New Member

    Публикаций:
    0
    Регистрация:
    26 янв 2009
    Сообщения:
    7
    Всем привет!
    Я тут заинтересовался многопроцессорными системами и решил написать свой пример. Почитал Intel Manual 3A, обсуждение http://www.wasm.ru/forum/viewtopic.php?id=20454&p=1 и решил, что готов к бою. Однако АР процессора не откликаются. Помогите пожалуйста.
    Код (Text):
    1.         ;код для АР переношу на 90000h
    2.     mov esi,AP
    3.     mov edi,90000h
    4.     mov ecx,END_AP
    5.     sub ecx,esi
    6.     shr ecx,3
    7.     inc ecx
    8.     rep movsq
    9.  
    10.     ;определяю идентификатор ядра
    11.     ;в регистре с относительным адресом 20h
    12.     ;лежит apic id
    13.     mov esi,boot_id_msg
    14.     int 30h
    15.  
    16.     mov esi,apic_base
    17.     add esi,20h
    18.     mov eax,[esi]
    19.     and eax,0ff000000h
    20.     mov [boot_id],eax
    21.  
    22.     call I2H64
    23.     mov esi,convstr
    24.     int 30h
    25.     add [cursor],10
    26.     ;разрешаю использование apic
    27.     mov esi,apic_base
    28.     add esi,0f0h
    29.     mov eax,[esi]
    30.     or eax,100h
    31.     mov [esi],eax
    32.     ;установлю пустой обработчик ошибок
    33.     mov esi,apic_base
    34.     add esi,370h
    35.     mov eax,[esi]
    36.     and eax,0ffffff00h
    37.     or eax,0a0h
    38.     mov [esi],eax
    39.     ;устанавливаю делитель равным 1
    40.     ;(для генератора синхроимпульсов в cpu?)
    41.     mov esi,apic_base
    42.     add esi,3e0h
    43.     mov eax,1011b
    44.     mov [esi],eax
    45.     ;здесь устанавливается время для таймера
    46.     ;(в миллисекундах?)
    47.     mov esi,apic_base
    48.     add esi,380h
    49.     mov dword [esi],4000000
    50.     ;настраиваю регистр времени
    51.     ;отрабатывает один раз
    52.     ;обработчик №161
    53.     ;===============================================
    54.     ;чтобы замаскировать прерывания приходящие от
    55.     ;таймера необходимо установить бит 16
    56.     ;почему-то прерывание проходит только один раз
    57.     ;поэтому в случае с периодически работающим
    58.     ;таймером получать прерывания на каждом периоде
    59.     ;не удаетс
    60.     ;===============================================
    61.     mov esi,apic_base
    62.     add esi,320h
    63.     mov eax,[esi]
    64.     and eax,0fffcff00h;0fffdff00h
    65.     or eax, 100a1h
    66.     mov [esi],eax
    67.  
    68.     cli
    69.  
    70.     ;разошлем сигнал init
    71.     mov esi,apic_base
    72.     add esi,300h
    73.     mov eax,0c0500h
    74.     mov [esi],eax
    75.  
    76.     ;пошлем сигнал sipi
    77.     mov eax,0c0690h
    78.     mov [esi],eax
    79.  
    80.     sti
    81.  
    82. main_loop:
    83.     jmp    $
    84. AP:
    85.     jmp display_ap_msg
    86. ap_msg db 'I',7, ' ',7, 'a',7, 'm',7, ' ',7, 'A',7, 'P',7
    87. ap_msg_l dw $-ap_msg
    88. display_ap_msg:
    89.     mov  ax, 0B800h
    90.     add  ax,100
    91.     mov  es, ax
    92.     xor  di, di
    93.     mov  si, ap_msg
    94.     mov  cx, word [ap_msg_l]
    95.     rep  movsb
    96.     jmp  $
    97.  
    98. END_AP:
     
  3. SadKo

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

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    Вот полезная статья, которую я в своё время зазеркалил:
    http://download.xskernel.org/docs/processors/multiprocessing/smp.html
    Конечно, она не без ошибок, но всяко лучше, чем ничего.

    APIC инициализируешь из защищённого режима? Из реального режима до регистров APIC не добраться.

    Вот ветка, посвящённая APIC, в моём проекте:
    http://svn.xskernel.org/viewvc/xskernel-current/xskernel/include/arch/i386/io/apic/

    Оттуда можно и пример подглядеть.
     
  4. quester

    quester New Member

    Публикаций:
    0
    Регистрация:
    26 янв 2009
    Сообщения:
    7
    Большое спасибо, SadKo.
    Сейчас буду изучать исходники. А так я инициализирую APIC из режима 64б (long mode). Причем работаю в Bochs, т.к. тестовой системой не обзовелся. Проблема в том, что я вижу по сообщениям, что второй проц откликается, даже выполняет обращение к MSR, но не выполняет других операций, например, работы с памятью.
     
  5. SadKo

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

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    Думаю, надо просто собрать bochs с дебаггером и запустить в режиме трассировки.
    Запускать надо последовательностью INIT-SIPI-SIPI, при этом учитывать, что AP стартует всегда в реальном режиме, то есть для его старта необходимо использовать 16-разрядный код, начало которого должно быть выровнено (если не изменяет память) на границу страницы. Если используется не 16-разрядный код, то AP может просто повиснуть. Адрес стартовой точки передаётся в SIPI (а для старых процов хранится по физическому адресу 0x467).
     
  6. quester

    quester New Member

    Публикаций:
    0
    Регистрация:
    26 янв 2009
    Сообщения:
    7
    Отлично. Теперь понял в чем дело: ведь я действительно передавал код перед которым использовал директиву use32. Наверное он действительно ставил соответствующие префиксы в опкодах. Обязательно попробую как доберусь до машинки.
    Спасибо.