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

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

  1. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    kush
    Фуф... а то я уже устрашился :)

    И еще мне не помещается в мозг:
    Откуда взялось 0xfee00000 + 10000011b? PCD - вроде же 4-й бит? Или это таблица страниц, тогда 7-й - это PAT? А откуда взялось именно 0xFEE00000 - это свойство проца или чипсета? Вобщем, ужас... новые ответы порождают новые вопросы :dntknw:
     
  2. kush

    kush New Member

    Публикаций:
    0
    Регистрация:
    24 май 2007
    Сообщения:
    46
    Ustus
    Да не заморачивайся над этим. У меня используются двухметровые страницы. Для них 7 бит должен быть 1. 1 - й бит - бит присутствия. 2 - й бит - разрешения записи. Это здесь не главное. Страничную память организовывайте, как захотите.

    0xFEE00000: объяснить нельзя надо запомнить :). Думается это зашито в память проца. В доках интела указано это значение. Наверняка есть способы узнать его для данного проца на 100%. В доках AMD наверняка тоже что то есть про APIC.

    При том APIC у каждого ядра свой.
     
  3. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    kush
    Я вот тут читаю вас и не как не пойму, о чем вы говорите.

    А почему бы адресса всех APIC не узнать из ACPI? Хотя BIOS его сам как-то определяет.

    Вообще-то Local APIC находиться по дефолту на адресе 0xFEE00000 последующие ищутся через 4КБ
    А I/O APIC находиться по дефолту на адресе 0xFEC00000 последующие ищутся через 4КБ
    Читаем MP Specification. Адрес может быть другим если поддерживаются таблицы MP.
    (Non-default APIC base addresses can be used if the MP configuration table is provided.)
    Заодно тамже можно определить число процессоров.
    Поправте меня если я не прав, но число процессоров вроде как то с ID APIC связано.
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    гляди тему с протами FDD ;)
    Она лпавно переросла в обсуждение определения количество процессов и APIC_ID там тоже упоминается.
     
  5. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Pavia
    а почему не напрямую через MSR 1Bh? Он, ксати, одинаковый и у Intel и у AMD. И о обоих по умолчанию 0xFEE00000. (это я уже зловещих мануалов начитался, поэтому умничаю :) )
    kush
    Кстати, это через его 11-й бит APIC разрешается, я так понял?
     
  6. PROFi

    PROFi New Member

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

    Спасибо. Немного разобрался. Только вот с режимом адресации ET64... В старых 32 бит (или хотя бы 36 бит) это работает ?
     
  7. kush

    kush New Member

    Публикаций:
    0
    Регистрация:
    24 май 2007
    Сообщения:
    46
    Ustus
    Все верно. Кстати, из этого MSR можно узнать еще кое - что.
    8 - бит - признак BSP (загрузочного процессора).
    12 - 35 - старшие 24 бита адреса APIC регистров (т.е. они обязательно выравнены по 4-кб границе). Тот самый 0xFEE00000.
    Напрямую писать: mov [0xFEE00000], data невозможно.
    Написано, что, модифицируя 12-35 биты, можно изменить default значение. Но нужно-ли это, особенно для простого примера. И вообще непонятно: если мы изменим это значение на 128mb, то что, они автоматически промеппируются на эту область RAM ?
    Лично я вообще никак этот MSR не модифицирую. Т.к. при загрузке компьютера его 11 бит = 1.
    Именно для доступа к APIC регистрам и нужна страничная адрессация. Притом неважен размер страницы и режим. Если вы больше знакомы с 32 режимом, то все это можно делать и в нем. К тому - же для инициализации не используются специфичные для 64бит инструкции.
    Адрес APIC одинаков для всех ядер, т.к. он находится не в RAM, а в памяти ядра.

    Pavia
    I/O APIC не нужен для простого примера. Какие последующие ? Т.е. у отдельного процессора несколько Local APIC ?

    ID процессора нужен для отправки IPI. В самом простом случае можно обойтись и без них. Для этого в ICR есть два бита под названием Delivery mode.
     
  8. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    зачем??
    страничная адресация - это лишь дополнительный уровень косвенности при трансляции адресов на уровне процессора, каким боком она относится к доступу к регистрам APIC?
     
  9. kush

    kush New Member

    Публикаций:
    0
    Регистрация:
    24 май 2007
    Сообщения:
    46
    rei3er.
    1) Просто мне невдомек, как иначе обратиться к памяти по физическому адресу 0xfee00000. Расскажите, как в 32 битном режиме без страничной адрессации обратиться к памяти по этому адресу.
    2) У меня 64бит режим. Где страничная адрессация неизбежна.
     
  10. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    kush
    Без страничной адрессации физический адресс будет линейным.

    Я просто из спецификации перевел. А так вроде у кажого процессора должен быть свой. (У меня одно процессорная система проверить не могу)
     
  11. kush

    kush New Member

    Публикаций:
    0
    Регистрация:
    24 май 2007
    Сообщения:
    46
    rai3er
    Только не рассказывайте про различия в трансляции адреса. Приведите конкретный небольшой участок кода, работающий с регистрами APIC, типа "mov [mem], data". И укажите значение полей дескриптора сегмента для ds. Очень интересно, обязательно попробую на практике.
     
  12. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    kush
    Насколько я понял, rei3er имеет ввиду, что без использования страничной трансляции физический адрес равен линейному. А если используется flat-режим, то они еще и равны логическому. Это к вопросу
    - для классического flat - base = 0, limit = 4Gb. И, по идее, можно писать прямо mov [0xFEE00000], data. Другой вопрос, как ты уже заметил, как при этом контролировать кеширование. Наверное только через MTRR.
     
  13. kush

    kush New Member

    Публикаций:
    0
    Регистрация:
    24 май 2007
    Сообщения:
    46
    APIC регистры лежат не в RAM. Инструкции типа mov [0xFEE00000], data недопустимы. Единственный способ добраться до них - использовать виртуальную память. Кто не согласен - конкретные примеры кода.
     
  14. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    да пожалуйста
    Код (Text):
    1. format binary
    2.  
    3. org 7C00h
    4. use16
    5.     cli
    6.     lgdt [gdtr]
    7.     in  al, 0x70
    8.     or  al, 0x80
    9.     out 0x70, al
    10.     in  al, 0x92
    11.     or  al, 2    
    12.     out 0x92, al
    13.     mov eax, cr0
    14.     or eax, 1
    15.     mov cr0, eax
    16.     db 0x66, 0xEA
    17.     dd startup_32
    18.     dw 1 SHL 3
    19. use32
    20. startup_32:
    21.     mov eax, dword [0xFEE00020] ; APIC ID
    22.     mov ebx, 0xB8000
    23.     mov ecx, 32
    24. @@:
    25.     mov edx, 0x0F00
    26.     shl eax, 1
    27.     adc edx, 0x30
    28.     mov dword [ebx], edx
    29.     add ebx, 2
    30.     dec ecx
    31.     jnz @B
    32.     hlt
    33. gdtr:
    34.     dw GDT_SIZE - 1
    35.     dd gdt
    36. gdt:
    37.     dq 0x0000000000000000
    38.     dq 0x00CF98000000FFFF
    39. GDT_SIZE = $ - gdt
     
  15. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    да причем здесь виртуальная память??
    в итоге PTE будет все равно содержать значение типа 0xFEE00xxx
    то, что регистры просто отображены на адресное пространство памяти CPU, с этим никто не спорит, но и виртуальная память тут совсем не причем
     
  16. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    kush
    Это почему? Все вполне корректно. Например, когда я ковырял VESA под досом, так использовал LFB, на тогдашней видяхе он начинался с E0000000. И я в него так и писал - mov [E0000000+off], data - и все чудесно жужжало. В конце концов наше дело маленькое - кинуть на адресную шину адрес, а там железяка пусть сама разбирается.

    P.S. До меня только дошло :dntknw:
    - и вот до этой несчастной фигни я не мог додуматься несколько месяцев??? Мне стыдно :):):)
     
  17. kush

    kush New Member

    Публикаций:
    0
    Регистрация:
    24 май 2007
    Сообщения:
    46
    Значит такие лаги у меня одного. Сколько не пытался, не получалось работать с APIC ч/з инструкции типа mov eax, [0xfee0000 + ofs]. Тоже самое не получалось и с видеопамятью (0xd8000000). Поэтому и решил, что добраться можно только с пом. вирт. памяти.
    Напоследок тупой вопрос:
    Значит можно писать и так:
    Код (Text):
    1. mov     dword [0xfee00000 + 0x300], 00001100b*256*256 + 00000101b*256 + 0
    ?
     
  18. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    kush
    да, если
    1. База в DS = 0
    2. Лимит DS >= 0xFEE00 (в страницах)
    3. Страничный режим выключен
    4. адреса выше 0xFFFFF допустимы
     
  19. rei3er

    rei3er maxim

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

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    kush
    Возможно, потому, что без страничной адресации режим работы памяти определяется MSR-ами MTRR и PAT, а что там - хз.