kush Фуф... а то я уже устрашился И еще мне не помещается в мозг: Откуда взялось 0xfee00000 + 10000011b? PCD - вроде же 4-й бит? Или это таблица страниц, тогда 7-й - это PAT? А откуда взялось именно 0xFEE00000 - это свойство проца или чипсета? Вобщем, ужас... новые ответы порождают новые вопросы
Ustus Да не заморачивайся над этим. У меня используются двухметровые страницы. Для них 7 бит должен быть 1. 1 - й бит - бит присутствия. 2 - й бит - разрешения записи. Это здесь не главное. Страничную память организовывайте, как захотите. 0xFEE00000: объяснить нельзя надо запомнить . Думается это зашито в память проца. В доках интела указано это значение. Наверняка есть способы узнать его для данного проца на 100%. В доках AMD наверняка тоже что то есть про APIC. При том APIC у каждого ядра свой.
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 связано.
гляди тему с протами FDD Она лпавно переросла в обсуждение определения количество процессов и APIC_ID там тоже упоминается.
Pavia а почему не напрямую через MSR 1Bh? Он, ксати, одинаковый и у Intel и у AMD. И о обоих по умолчанию 0xFEE00000. (это я уже зловещих мануалов начитался, поэтому умничаю ) kush Кстати, это через его 11-й бит APIC разрешается, я так понял?
kush Спасибо. Немного разобрался. Только вот с режимом адресации ET64... В старых 32 бит (или хотя бы 36 бит) это работает ?
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.
зачем?? страничная адресация - это лишь дополнительный уровень косвенности при трансляции адресов на уровне процессора, каким боком она относится к доступу к регистрам APIC?
rei3er. 1) Просто мне невдомек, как иначе обратиться к памяти по физическому адресу 0xfee00000. Расскажите, как в 32 битном режиме без страничной адрессации обратиться к памяти по этому адресу. 2) У меня 64бит режим. Где страничная адрессация неизбежна.
kush Без страничной адрессации физический адресс будет линейным. Я просто из спецификации перевел. А так вроде у кажого процессора должен быть свой. (У меня одно процессорная система проверить не могу)
rai3er Только не рассказывайте про различия в трансляции адреса. Приведите конкретный небольшой участок кода, работающий с регистрами APIC, типа "mov [mem], data". И укажите значение полей дескриптора сегмента для ds. Очень интересно, обязательно попробую на практике.
kush Насколько я понял, rei3er имеет ввиду, что без использования страничной трансляции физический адрес равен линейному. А если используется flat-режим, то они еще и равны логическому. Это к вопросу - для классического flat - base = 0, limit = 4Gb. И, по идее, можно писать прямо mov [0xFEE00000], data. Другой вопрос, как ты уже заметил, как при этом контролировать кеширование. Наверное только через MTRR.
APIC регистры лежат не в RAM. Инструкции типа mov [0xFEE00000], data недопустимы. Единственный способ добраться до них - использовать виртуальную память. Кто не согласен - конкретные примеры кода.
да пожалуйста Код (Text): format binary org 7C00h use16 cli lgdt [gdtr] in al, 0x70 or al, 0x80 out 0x70, al in al, 0x92 or al, 2 out 0x92, al mov eax, cr0 or eax, 1 mov cr0, eax db 0x66, 0xEA dd startup_32 dw 1 SHL 3 use32 startup_32: mov eax, dword [0xFEE00020] ; APIC ID mov ebx, 0xB8000 mov ecx, 32 @@: mov edx, 0x0F00 shl eax, 1 adc edx, 0x30 mov dword [ebx], edx add ebx, 2 dec ecx jnz @B hlt gdtr: dw GDT_SIZE - 1 dd gdt gdt: dq 0x0000000000000000 dq 0x00CF98000000FFFF GDT_SIZE = $ - gdt
да причем здесь виртуальная память?? в итоге PTE будет все равно содержать значение типа 0xFEE00xxx то, что регистры просто отображены на адресное пространство памяти CPU, с этим никто не спорит, но и виртуальная память тут совсем не причем
kush Это почему? Все вполне корректно. Например, когда я ковырял VESA под досом, так использовал LFB, на тогдашней видяхе он начинался с E0000000. И я в него так и писал - mov [E0000000+off], data - и все чудесно жужжало. В конце концов наше дело маленькое - кинуть на адресную шину адрес, а там железяка пусть сама разбирается. P.S. До меня только дошло - и вот до этой несчастной фигни я не мог додуматься несколько месяцев??? Мне стыдно
Значит такие лаги у меня одного. Сколько не пытался, не получалось работать с APIC ч/з инструкции типа mov eax, [0xfee0000 + ofs]. Тоже самое не получалось и с видеопамятью (0xd8000000). Поэтому и решил, что добраться можно только с пом. вирт. памяти. Напоследок тупой вопрос: Значит можно писать и так: Код (Text): mov dword [0xfee00000 + 0x300], 00001100b*256*256 + 00000101b*256 + 0 ?
kush да, если 1. База в DS = 0 2. Лимит DS >= 0xFEE00 (в страницах) 3. Страничный режим выключен 4. адреса выше 0xFFFFF допустимы
kush Возможно, потому, что без страничной адресации режим работы памяти определяется MSR-ами MTRR и PAT, а что там - хз.