Разделение програмы в многоядерных процесорах

Тема в разделе "WASM.OS.DEVEL", создана пользователем DimaNS, 3 фев 2012.

  1. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    Pavia
    для сброса вроде INIT шлют?

    ты тоже IMCR без проверки используешь. или судя по схемам из MP спецификации, на него можно забить заблокировав всего пару линий apic
     
  2. DimaNS

    DimaNS New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2012
    Сообщения:
    42
    что записывается в Vector регистра ICR???
     
  3. rpy3uH

    rpy3uH New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    503
    вектор прерывания который будет вызван на целевом процессоре

    процессор запускается и нормально работает и после одного SIPI. лично проверял на виртуалках и на двух машинах. но лучше не нарушать протокол
     
  4. DimaNS

    DimaNS New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2012
    Сообщения:
    42
    приведите пожалуйста пример содержимого регистра ICR при генерации Startup IPI для Application Processor...
     
  5. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    DimaNS
    тебе Pavia дал ссылку на исходники кода. где под досом запускают второе ядро(проц)
    разбери и все поймешь. на сайте Хакер есть и описание действий.
     
  6. DimaNS

    DimaNS New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2012
    Сообщения:
    42
    abcd008
    с удовольствием разобрал бы... только я не могу скачать оттуда исходники... если они в тебя есть то залей их на какойто файлообменик и дай ссылку.... буду благодарен!!
     
  7. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    помог бы да удалил все исходники сегодня утром(
     
  8. rpy3uH

    rpy3uH New Member

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

    DimaNS New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2012
    Сообщения:
    42
    abcd008
    как ты их умудрился скачать??
     
  10. DimaNS

    DimaNS New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2012
    Сообщения:
    42
    rpy3uH
    Спасибо!!! сейчас буду смотреть...
     
  11. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    DimaNS
    это не те исходники. это его наработки
     
  12. DimaNS

    DimaNS New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2012
    Сообщения:
    42
    почему по адресу word 0xFEE00020h (Local APIC ID Register) хранятся нули??
     
  13. rpy3uH

    rpy3uH New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    503
    у первого процессора Local APIC ID = 0, у второго процессора Local APIC ID = 1, у третьего процессора Local APIC ID = 2. По сути своей (хотя и не обязательно(! это важно)) Local APIC ID равен порядковому номеру процессора
     
  14. DimaNS

    DimaNS New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2012
    Сообщения:
    42
    не подскажите в чем проблема..? почему не запускается второе ядро..?
    код пероводит одно ядро в защищенный режим и выводит 00000000.. а должен (на сколько я понял) перевисти в защищенный режим два ядра и вывести 01000000..
    буду благодарен за помощь...
    Код (Text):
    1. org 7C00h
    2. use16
    3. start:
    4. ;очистка экрана
    5. mov  ax,3
    6. int  10h
    7. ;иинициализация RM-сегментов и стека
    8. mov  ax,cs
    9. mov  ds,ax
    10. mov  es,ax
    11. mov  ss,ax
    12. mov  sp,start
    13. mov  bp,sp
    14. ;чтение остальных секторов
    15. mov  ah,2
    16. mov  al,40
    17. xor  ch,ch
    18. mov  cl,2
    19. xor dh,dh
    20. mov dl,80h
    21. mov  bx,start + 512
    22. int  13h
    23.  
    24.         mov si, continue_loading
    25.         xor ax, ax
    26.         mov es, ax
    27.         mov di, 8000h
    28.         mov cx, end_pr-continue_loading
    29.         rep movsb
    30.    
    31. jmp 8000h
    32.  
    33.  
    34.  
    35. ends: rb 510-(ends-start)
    36. db 055h, 0aah
    37.  
    38. db 10000 dup(00h)
    39.  
    40. continue_loading:
    41. ; Открыть линию A20
    42. ssd:
    43. in   al,92h
    44. or   al,2
    45. out 92h,al
    46. ;Загрузить адрес и размер GDT в GDTR
    47. lgdt  [gdtr]
    48. ;Запретить прерывания
    49. cli
    50. in  al,70h
    51. or  al,80h
    52. out 70h,al
    53.  
    54.  
    55. ;Переходим в защищенный режим
    56. mov eax,cr0
    57. or  al,1
    58. mov cr0,eax
    59. jmp  8h:pm_entry
    60. ;32-битная адресация
    61. use32
    62. ;Точка входа в защищенный режим
    63. pm_entry:
    64. mov ax,cs
    65. mov es,ax
    66. mov ax,16
    67. mov ds,ax
    68. mov ss,ax
    69.  
    70.  
    71.  
    72.  
    73.  
    74. ;запуск APIC
    75. mov ecx,1Bh
    76. rdmsr
    77. bts eax,11
    78. wrmsr
    79.  
    80. mov edx, eax
    81.  
    82. mov eax,[0FEE00020h]
    83.  
    84. mov edi,0
    85. call hex
    86.  
    87. ;boorstrap code
    88.     mov  eax, 000C4500h
    89.     mov [0FEE00300h], eax
    90.   @@:
    91.     bt  dword [0FEE00300h],12
    92.     jc  @b
    93.  
    94.     mov eax, 10000
    95.     call delay
    96.  
    97.     mov  eax, 000C4600h or (8000h shr 12)
    98.     mov [0FEE00300h], eax
    99.   @@:
    100.     bt  dword [0FEE00300h],12
    101.     jc  @b
    102.  
    103.     mov eax, 200
    104.     call delay
    105.  
    106.  
    107.     mov  eax, 000C4600h or (8000h shr 12)
    108.     mov [0FEE00300h], eax
    109.   @@:
    110.     bt  dword [0FEE00300h],12
    111.     jc  @b
    112.  
    113.     mov eax, 50000
    114.     call delay
    115.  
    116. jmp    $
    117.  
    118.  
    119. SEMAPHORE  dd 1
    120. CPU_Count  dd 0
    121. ;GDT.
    122. gdt:
    123.    db  8 dup (0);0
    124.    db  0FFh,0FFh,00h,00h,00h,10011010b,11001111b,00h;8
    125.    db    0FFh,0FFh,00h,00h,00h,10010010b,11001111b,00h;16
    126.    db    0FFh,0FFh,00h,80h,0Bh,10010010b,01000000b,00h;24
    127. gdt_size  equ $ - gdt
    128. gdtr:
    129.    dw  gdt_size - 1
    130.    dd  gdt
    131.    
    132. hex:
    133. pushad
    134. mov bx,24
    135. mov es,bx
    136. mov   cl,32-4        
    137. xchg  edx,eax        
    138. Repea:
    139.                 mov     eax,edx    
    140.                 shr     eax,cl          
    141.                 and     al,0Fh        
    142.                 add     al,'0'        
    143.                 cmp     al,'9'        
    144.                 jbe     Digit09        
    145.                 add     al,'A'-('9'+1)
    146. Digit09:        ;int     29h
    147.                 stosb
    148.                 mov al,7
    149.                 stosb
    150.                 sub     cl,4          
    151.                 jnc     Repea  
    152. mov bx,8
    153. mov es,bx
    154. popad
    155. ret
    156.  
    157.  
    158. delay:
    159. ; input
    160. ;       EAX - microseconds
    161.  
    162.     pushad
    163.  
    164.     mov ecx, eax
    165.     mov eax, 1000000
    166.     xor edx, edx
    167.     div ecx
    168.    
    169.     mov ecx, eax
    170.     mov eax, 1193182
    171.     xor edx, edx
    172.     div ecx
    173.  
    174.     out 42h, al
    175.     xchg    al, ah
    176.     out 42h, al
    177.  
    178. .rep:
    179.     in  al,0x61
    180.     test    al, 20h
    181.     jz  .rep
    182.    
    183.     popad
    184.     ret
    185.  
    186. end_pr:
    проблема решена:)))
    этот код рабочий! просто я забыл в эмуляторе включить поддержку второго ядра....
     
  15. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    проконсультируйте по apic таймер. чему равна частота?
     
  16. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    Сколько запилите, стока и будет. Для особо одарённых могу дать динк на маны.
     
  17. DimaNS

    DimaNS New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2012
    Сообщения:
    42
    существует ли поддержка эмуляции многоядерных процессоров в bochs?
     
  18. rpy3uH

    rpy3uH New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    503
    это есть в QEMU
     
  19. DimaNS

    DimaNS New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2012
    Сообщения:
    42
    Подскажите в чем проблема.. я только начал изучать х64
    Код (Text):
    1. ORG 0x7c00
    2.  
    3.     USE16
    4.  
    5.     cli             ; disable the interrupts, just in
    6.     in   al, 70h
    7.     or   al, 80h
    8.     out 70h, al                    ; case they are not disabled yet
    9.  
    10.     lgdt    [cs:GDTR]       ; load GDT register
    11.  
    12.     mov eax,cr0         ; switch to protected mode
    13.     or  al,1
    14.     mov cr0,eax
    15.  
    16.     jmp 16:pm_start
    17.  
    18.  
    19.  
    20. GDTR:                   ; Global Descriptors Table Register
    21.   dw 31             ; limit of GDT (size minus one)
    22.   dq GDT                ; linear address of GDT
    23.  
    24. GDT:
    25.     db 0,0,0,0,0,0,0,0
    26.     db 0xFF, 0xFF,0,0, 0, 10010010b,10001111b, 0
    27.     db 0xFF, 0xFF,0,0,0, 10011010b,11001111b, 0
    28.     db 0, 0, 0,0, 0,10011010b,10100000b, 0
    29.  
    30.    
    31.     USE32
    32.  
    33. pm_start:
    34.  
    35.     mov ax,8
    36.     mov ds,ax
    37.  
    38.     mov eax,cr4
    39.     or  eax,0x20
    40.     mov cr4,eax         ; enable physical-address extensions
    41.  
    42.  
    43.    
    44.    
    45.     mov dword [0x70000],0x71000 + 3  ; PDPTE
    46.     mov dword [0x71000],0x72000 + 3 ; PDE
    47.     mov dword [0x72000],0x73000 + 3 ; PTE
    48.  
    49.  
    50.  
    51.    
    52.     mov eax,4096*7
    53.     or eax,3
    54.     mov dword [0x73000+7*8],eax
    55.    
    56.  
    57.     mov eax,4096*0xB8
    58.         or eax,3
    59.     mov dword [0x73000+0xB8*8],eax
    60.    
    61.    
    62.  
    63.  
    64.  
    65.     mov eax,0x70000
    66.     mov cr3,eax         ; load page-map level-4 base
    67.  
    68.     mov ecx,0xC0000080 ; EFER MSR
    69.     rdmsr
    70.     or  eax,0x100       ; enable long mode
    71.     wrmsr
    72.  
    73.     mov eax,cr0
    74.     or  eax,0x80000000
    75.     mov cr0,eax         ; enable paging
    76.  
    77.     jmp 24:long_start
    78.  
    79. USE64
    80. long_start:
    81.        
    82.         mov ecx,1Bh
    83.         rdmsr
    84.         bts eax,11
    85.         wrmsr
    86.  
    87.  
    88.  
    89.         mov eax,[0x0FEE00020]
    90.  
    91.  
    92.     cli
    93.     hlt
    94.  
    95. db 510 - ($ - $$) dup 0, 0x55, 0xAA
    1. почему компилятор выводит ошибку
    Код (Text):
    1. mov eax,[0x0FEE00020]
    2. error: value out of range.
    при
    Код (Text):
    1. USE64
    2. long_start:
    3. mov eax,[0x0FEE00020]
    2. почему комп ребутится при
    Код (Text):
    1. USE64
    2. long_start:
    3. mov al,[0xC8000]
     
  20. rpy3uH

    rpy3uH New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    503
    адрес долден быть 64 битным