Межпроцессорное взаимодействие (общение между процессорами)

Тема в разделе "WASM.OS.DEVEL", создана пользователем rpy3uH, 13 янв 2010.

  1. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Medstrax
    Аналогично можно сказать и про Вас.

    Ещё раз: при приходе SMI в режим SMM переключается только тот логический процессор, кому пришло SMI, а отнюдь не все логические процессоры. Умерьте свою гордыньку да изучите руководство внимательно. А заодно и поэкспериментируйте.
     
  2. Medstrax

    Medstrax Забанен

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    673
    Писец, тот факт что сми может быть доставлена всем процам одновременно это на твою логику никак не повлияет? Блин, люди, ну уймите его кто нибудь. Здесть же есть адекватные челы...
     
  3. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    У меня там куча экспортируемых переменных:
    Код (Text):
    1. ;
    2. ; KiMinimumDpcRate - This is the rate of DPC requests per clock tick that
    3. ;      must be exceeded before DPC batching of medium importance DPCs
    4. ;      will occur.
    5. ;
    6.  
    7.         public  _KiMinimumDpcRate
    8. _KiMinimumDpcRate dd      3
    9.  
    10. ;
    11. ; KiAdjustDpcThreshold - This is the threshold used by the clock interrupt
    12. ;      routine to control the rate at which the processor's DPC queue depth
    13. ;      is dynamically adjusted.
    14. ;
    15.  
    16.         public  _KiAdjustDpcThreshold
    17. _KiAdjustDpcThreshold dd      20
    Однако даже если бы там было что-то связанное со спин-блокировками, то это всё равно не относится к hal'у, которого в wrk нет :)
    Точнее есть, но только в виде бинарника с символами.

    Для целей ТС скорее подойдут сорцы Windows NT.
     
  4. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Medstrax
    Во-первых, не материтесь. Во-вторых, не "твою", а "вашу". Ну а в-третьих, SMI может, но не обязано доставляться всем процессорам, тем более одновременно. Читайте документацию Intel: там не говорится о том, что одно и то же SMI обрабатывается всеми процессорами.
     
  5. Medstrax

    Medstrax Забанен

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    673
    Ну как еще объяснять!? одновременно выполнять сми-хэндлер естесно ни к чему.
    но входят в смм _одновременно_ все ядра. дальнейший диалог видимо не имеет смысла,
    кроме ваших слов не вижу ни одного довода, в отличие от вас я не теоретизировал, я тупо и банально набросал код, у пняД входит в сми оба ядра
     
  6. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Где в документации Intel написано, что в SMM входят одновременно все процессоры?
     
  7. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    SII - забей, человеку потроллить охота.
    Его слова подтверждаются мануалом от производителя процессора.
    А вот твои пока не подтверждены ничем. Набросал код - покажи.
    Я и так знаю что ты сейчас отпишешь - нам твой мега кодес видеть ни к чему.
    Это модно что-ли стало упоминать в разговоре имя известной в определённых кругах личности?
    Кто такой _BC_ многие знают, и его наработки по SMM видели ВСЕ ЖЕЛАЮЩИЕ.
    Твой код не видел никто. Может покажешь?
     
  8. Medstrax

    Medstrax Забанен

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    673
    А где написано что это не так? на моей машине так...
    если есть сомнения в моей квалификации - порой форумы интела, много познавательного черпнешь
     
  9. Medstrax

    Medstrax Забанен

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    673
    не покажу... ;)
    если моих слов недостаточно, пусть разрулит тот же _BC_, в качестве арбитра устроит?
    коллеги - кто имеет связь с блинд хаосом - черкните, пусть заглянет на огонек, а то его давно не слышно
     
  10. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    причем мут smi и "общение между процессорами"

    проще через nmi.
     
  11. dag

    dag New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2004
    Сообщения:
    446
    эээ... народ, а вы обсуждает n процессоров или n ядер 1 процессора ?
     
  12. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    логические процессоры.
     
  13. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    dag
    Многоядерный процессор не имеет _никаких_ принципиальных отличий от горы одноядерных. Или, если угодно, от многопроцессорных вычислительных машин 1960-х: те же принципы, те же проблемы, те же решения, только на совершенно другом технологическом уровне. Так что обсуждаем мы, как правильно заметил n0name, логические процессоры -- т.е. то, что, собственно, выполняет поток команд, реагирует на прерывания и прочее. Ну а реализован такой логический процессор в виде одного физического кристалла, в виде одного ядра в составе многоядерного кристалла или в виде части ядра (HyperTreading никто не отменял), это рояли не играет.
     
  14. rpy3uH

    rpy3uH New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    503
    я тему создал и забыл что-то про неё. а вы тут расфлудились.
    Теорию-то я знаю мануал перелопатил весь, но мне нужен хотя бы примерчик или исходник какой-нибудь. (но не линуксовский, не хочу разбираться в горах кода), во в чём вопрос-то!
     
  15. Vic3Dexe

    Vic3Dexe New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2009
    Сообщения:
    53
    Код написан для х64, предполагает, что BSP уже в long, соотв. готовы GDT, IDT, PML4 и иже с ними.
    Вызывать SMPInit, она поднимает все ранее найденные в загрузчике ядра в long.
    Структуры данных не описываю, вобщем и так понятно, что и где проверяется.
    GetTSCUSec - возвращает в rax значение rdtsc.
    DisableNMI/OpenA20 - макросы на соотв. действия
    Процедура CPUInit выполняется на каждом ядре, и выполняет инит своего LAPIC а также рапортует системе о том, что ядро поднялось (inc [CPUCount]).
    Сюда не включал, ибо тривиально.
    Много лишнего (лень вылизывать, взято из своего типа "ядра"), почти неоптимизировано, но это работает на qemu 0.10.5 (поднимал все 255 ядер), vmware 6 (2 ядра) и реальном E6600 (2 ядра).
    Обработчика IPI именно для "общения" нет, но я думаю, это несложно реализовать.

    Код (Text):
    1. ;------------------------------------------------------------------------------
    2. ;----- код старта AP, копируется из ядра по адресу AP_STARTUP -----------------
    3. ;------------------------------------------------------------------------------
    4.             use16
    5. APStartup:      cli
    6.             DisableNMI
    7.             OpenA20
    8.             wbinvd                             ;в линухе так, зачем - хз
    9.             ;----- выставим стек
    10.             mov        ax,CS
    11.             sub        ax,1000h
    12.             mov        SS,ax
    13.             mov        sp,0FFFEh
    14.  
    15.             mov        eax,cr0
    16.             and        eax,1FFAFFB0h                   ;обнуляем PG,CD,NW,AM,WP,TS,EM,PE
    17.             or         al,22h                      ;выставляем NE,MP
    18.             mov        cr0,eax
    19.             ;------------------------------------------------------
    20.             ;----- CR3 --------------------------------------------
    21.             ;сбросим PCD, PWT
    22.             ;------------------------------------------------------
    23.             xor        eax,eax
    24.             mov        cr3,eax
    25.             mov        eax,cr4
    26.             and        eax,0FFFFC000h                  ;обнуляем VMXE,PGE,MCE,PAE,PSE,DE,TSD,PVI,VME
    27.             or         ah,7                    ;выставляем PCE,OSFXSR,OSXMMEXCPT
    28.             mov        cr4,eax
    29.             ;------------------------------------------------------
    30.             ;----- пофиксим esp,ebp -------------------------------
    31.             ;------------------------------------------------------
    32.             movzx          esp,sp
    33.             movzx          ebp,bp
    34.  
    35.             ;------------------------------------------------------
    36.             ;----- переходим в long -------------------------------
    37.             ;------------------------------------------------------
    38.             push           dword GDT_COPY               ;копия GDT под 1М
    39.             push           dword 0FFFF0000h
    40.             lgdt           pword [esp+2]
    41.             pop        eax
    42.             pop        eax
    43.             ;входим в PM
    44.             mov        eax,cr0
    45.             or         al,1
    46.             mov        cr0,eax
    47.  
    48.             ;перезагрузим CS (сразу идем в настоящее ядро выше 1М)
    49.             jmp        pword HTEXT32_SEG:.1-KERNEL_START+BASE_KERNEL_PHYS
    50.  
    51.             ;----- в conv копируется только до этого места
    52.  
    53.             use32
    54. .1:         mov        ax,HDATA32_SEG
    55.             mov        DS,ax
    56.             mov        ES,ax
    57.             mov        FS,ax
    58.             mov        GS,ax
    59.             mov        SS,ax
    60.             mov        esp,BASE_SYSTEM_STACK
    61.             cld
    62.  
    63.             ;включаем PAE
    64.             mov        eax,cr4
    65.             or         al,20h
    66.             mov        cr4,eax
    67.  
    68.             ;выставляем cr3
    69.             mov        eax,PHYS_PML4
    70.             mov        cr3,eax
    71.  
    72.             ;включаем long
    73.             mov        ecx,0C0000080h
    74.             rdmsr
    75.             or         eax,100h
    76.             wrmsr
    77.  
    78.             ;включаем PG
    79.             mov        eax,cr0
    80.             bts        eax,31
    81.             mov        cr0,eax
    82.  
    83.             ;уходим в 64-битный сегмент
    84.             jmp        HTEXT64_SEG:.2-KERNEL_START+BASE_KERNEL_PHYS
    85.  
    86.             use64
    87.             ;уходим в старшие адреса
    88. .2:         mov        rax,.3                    
    89.             jmp        rax                    ;перезагрузим rip
    90.  
    91.             ;мы в старших адресах, пофиксим rsp
    92. .3:         mov        rax,STACK_TOP-BASE_SYSTEM_STACK
    93.             add        rsp,rax
    94.             ;----- далее делаем себе стек
    95.             ;----- перегрузим gdtr, idtr на настоящие
    96.             call           LoadGDTR
    97.             call           LoadIDTR
    98.             ;----- настроим все регистры, все фенечки, флаги и пр.
    99.             call           CPUInit
    100.             ;ждем, пока BSP включит IO APIC
    101. .4:         cmp        [APICInitDone],0
    102.             je         .4
    103.             ;----- тут назначим себе задачу и включим прерывания
    104.             ;...
    105.  
    106.             hlt ;сюда не должны попасть
    107.  
    108. ;------------------------------------------------------------------------------
    109. ;----- отсылает IPI AP с APIC ID = al, ah = vector, dl = DMODE ----------------
    110. ;----- cf = 1, если не дождались доставки -------------------------------------
    111. ;------------------------------------------------------------------------------
    112. SendIPI:        push           rbx
    113.             push           rcx
    114.             mov        rbx,LAPIC
    115.             mov        cl,al                       ;ID
    116.             shl        ecx,24
    117.             mov        [rbx+laICRHi],ecx
    118.             xor        ecx,ecx
    119.             mov        ch,dl                       ;DMODE
    120.             and        ch,7                    ;DM=0 (physical), TM=0
    121.             or         ch,40h                      ;LV=1
    122.             mov        cl,ah                       ;vector
    123.             mov        [rbx+laICRLo],ecx               ;отправляем
    124.             call           WaitIPIDelivery                 ;ждем, результат = cf
    125.             pop        rcx
    126.             pop        rbx
    127.             retn
    128.  
    129. ;------------------------------------------------------------------------------
    130. ;----- ждет доставки IPI (DS=0), не дождавшись выставляет cf ------------------
    131. ;------------------------------------------------------------------------------
    132. WaitIPIDelivery:    push           rax
    133.             push           rbx
    134.             push           rcx
    135.             mov        rbx,LAPIC
    136.             call           GetTSCUSec
    137.             lea        rcx,[rax+IPI_DELIVERY_TIMEOUT]       ;до скольки ждать
    138. .2:         bt         dword [rbx+laICRLo],laICRLo_DS
    139.             jnc        .1
    140.             call           GetTSCUSec
    141.             cmp        rax,rcx
    142.             jb         .2
    143.             stc
    144. .1:         pop        rcx
    145.             pop        rbx
    146.             pop        rax
    147.             retn
    148.  
    149. ;------------------------------------------------------------------------------
    150. ;----- инициализирует SMP -----------------------------------------------------
    151. ;------------------------------------------------------------------------------
    152. InitSMP:        push           rax
    153.             push           rbx
    154.             push           rcx
    155.             push           rdx
    156.             push           rdi
    157.             push           rsi
    158.             ;------------------------------------------------------
    159.             ;----- здесь нужно замапить LAPIC ---------------------
    160.             ;----- ....
    161.             ;------------------------------------------------------
    162.             call           GetAPICID                   ;ID BSP
    163.             mov        [BSP_APIC_ID],al
    164.             ;----- настроим все регистры, все фенечки, флаги и пр.
    165.             call           CPUInit
    166.             ;проверим, есть ли SMP вообще
    167.             cmp        [SMPInfo.SMP],0
    168.             je         .1                      ;нету SMP, обходим старт AP
    169.             ;------------------------------------------------------
    170.             ;----- запускаем AP -----------------------------------
    171.             ;------------------------------------------------------
    172.             ;подготовим стартовый код
    173.             mov        edi,AP_STARTUP                  ;сюда
    174.             mov        rsi,APStartup                   ;отсюда
    175.             mov        ecx,APStartup.1-APStartup           ;размер
    176. rep         movsb
    177.  
    178.             ;----- включаем APs
    179.             movzx          ecx,[SMPInfo.SMPCPUCount]
    180.             mov        rbx,CPUSMPInfo                  ;rbx=icpu
    181. .3:         ;проверим, не BSP ли это
    182.             test           [icpu.Flags],2                  ;бит BSP
    183.             jnz        .2
    184.             ;это не BSP, запускаем
    185.             mov        dh,[CPUCount]                   ;до старта столько
    186.             mov        al,[icpu.LocalAPICID]               ;APIC ID
    187.             mov        ah,AP_STARTUP shr PAGE_BITS         ;vector >> 12
    188.             mov        dl,DLV_IPI_INIT                 ;шлем INIT
    189.             call           SendIPI
    190.             jc         .2                      ;не дождались
    191.             push           rax
    192.             mov        eax,10000                   ;10 ms перед startup
    193.             call           DelayUSec
    194.             pop        rax
    195.             mov        dl,DLV_IPI_STARTUP              ;шлем STARTUP
    196.             call           SendIPI
    197.             jc         .2
    198.             ;подождем, пока отработает трамплин
    199.             call           GetTSCUSec
    200.             lea        rsi,[rax+AP_START_TIMEOUT]
    201. .5:         cmp        dh,[CPUCount]                   ;все еще столько?
    202.             jne        .6
    203.             call           GetTSCUSec
    204.             cmp        rax,rsi
    205.             jb         .5
    206.             ;не дождались... по этому поводу надо, наверно, что-то сказать
    207. .2:         mov        al,[icpu.LocalAPICID]               ;APIC ID
    208.             mov        dl,DLV_IPI_INIT                 ;шлем INIT (убиваем AP)
    209.             call           SendIPI
    210. .6:         add        rbx,4                       ;следующий!
    211.             loop           .3
    212.  
    213.             ;------------------------------------------------------
    214.             ;----- все, кто хотел - пришли ------------------------
    215.             ;------------------------------------------------------
    216. .1:        
    217.             pop        rsi
    218.             pop        rdi
    219.             pop        rdx
    220.             pop        rcx
    221.             pop        rbx
    222.             pop        rax
    223.             retn
     
  16. rpy3uH

    rpy3uH New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    503
    Vic3Dexe, спасибо! Конечно же не помешал бы полный код, но и так разберусь