и со включенным страничным режимом тоже есть иерархия типов кэширования они могут задаваться как с помощью PAT, так и с помощью MTRR-ов и PCD/PWT в случае перекрытия регионов (например когда страница описывается как MTRR-ом, так и спомощью PCD/PWT) выбирается более сильный критерий кэширования иерархия: UC -> WC -> WT -> WB (от более сильного к слабому)
rei3er Хм... буду знать. Заблуждался, что при использовании PCD/PWT PAT берется только из них, а MSR игнорируются.
Начитался Intel'овских мануалов... если верить спецификации (придерживаются ли ее производители BIOS'ов - вот вопрос...) - то при загрузке выполняется инициализация ВСЕХ процессоров - после чего все, кроме BootStrap-процессора загоняются в cli-hlt. Отсюда вопрос - так ли надо им INIT IPI? Вопроc пока отложил, ковыряю I/O APIC... во там понаворочено - крыша едет
Ustus угу, я тоже читал MultiProcessor Specification. По крайне мере так заполняется таблица конфигурации APIC BIOS'ом. Которую рекомендуют юзать в ОСях. Так и делают некоторые ОСи. ROS, Win, например.
если верить спецификации, то надо лучше юзать ACPI (в частности MADT (Multiple APIC Description Table))
MultiProcessor Specification Version 1.4 May 1997 24201606.pdf Может есть поновее, однако только такую нашёл.
Я так понял, что поновее нет. Но в "Intel® 64 and IA-32 Architectures Software Developer’s Manual" в принципе расписано довольно подробно, я так понял, что они отдельно мультипроцессорную спецификацию уже не выпускают, а приписали все к процам, тем более, что для HT там еще свои заморочки... правда где оно теперь, то HT . Еще для полноты картины - "BIOS and Kernel Developer's Guide for AMD AthlonTM 64 and AMD OpteronTM Processors" - там некоторые вещи опущены, зато APIC на мой взгляд, лучше описан. Ох... чувствую, под этими двумя глыбами меня и похоронят
rei3er Не сложно - много... трудно выковыривать информацию, которой мне надо всего-то ничего... а тут еще руки чешутся на x86-64 она же AMD64 она же Intel 64 она же EM64T (существовать под столькими именами - свойство темных личностей ). А сейчас уперся в I/O APIC - блин, придется наверное Линух ставить, без живого кода буквы из мануалов остаются просто буквами
Ustus скачай ядро линуха. Оно обычно в сорцах. Плюс linux-bios, в нём тоже про apic кое-что есть. В ReactOS'е тоже не мало.
Подскажите, что я делаю не так: Код (Text): QWORD apic = ReadMSR(IA32_APIC_BASE); // _asm { mov ecx, 0x1b; rdmsr } size_t addr = size_t(apic&APIC_MSR_BASE_M); // addr = apic & 0xfffff000 RegisterPage(addr, addr, PAGE_ATTR_KERNEL | PAGE_FLAG_PCD ); // pg_attr = 0x13 (PCD, READABLE, PRESENTED) FBase = reinterpret_cast<DWORD *>(addr); // FBase = 0xffe00000 InvalidatePage(0x90000); // _asm { mov eax, 0x90000; invlpg [eax]; } RegisterPage(0x90000, 0x90000, PAGE_ATTR_KERNEL | PAGE_FLAG_PCD ); // pg_attr = 0x13 BYTE *ptr = reinterpret_cast<BYTE *>(0x90000); // Copy 16-bit code to linear 0x90000 memcpy(ptr, RealmodeSeg, 0x10000); TIntHandler::ClearInterrupts(); // _asm { CLI } FBase[APIC_DWREG_ICR0] = 0x000c0500; //0x000c4500 (?); // INIT IPI for (int i=0; i<0x1000000; i++) ; // delay FBase[APIC_DWREG_ICR0] = 0x000c0690; //0x000c4690 (?); // STARTUP IPI 0x000c46xx for (int i=0; i<0x1000000; i++) ; // delay FBase[APIC_DWREG_ICR0] = 0x000c0690; //0x000c4690 (?); // STARTUP IPI 0x000c46xx while (true); 16-битный код: Код (Text): public _realmode_entry _realmode_entry: cli mov ax, cs mov ds, ax mov fs, ax mov gs, ax mov ax, 0b800h mov es, ax mov si, offset realmode_message xor di, di mov ah, 0x1e real_out_loop: lodsb test al, al jz real_out_end stosw jmp real_out_loop real_out_end: jmp $ realmode_message: db "Hello from another processor!", 0 RealmodeSeg == _realmode_entry (совпадают адреса) В qemu не стартует, на атлоне x2 тоже. Не вижу текста на экране.
Стартануть второй проц, чтобы вывел текст в видеобуфер и зациклился. После посылки IPI-SIPI-SIPI 0 реакции.
SadKo Стартануть второй проц, чтобы вывел текст в видеобуфер и зациклился. После посылки IPI-SIPI-SIPI 0 реакции. Тогда вышеприведенный код - только выдранные, абсолютно несвязанные куски. Лучше об этом почитать мануалы к процу от intel (там все понятно расписано в разделе Multiprocessor Initialization) или посмотри как BIOS делает это. http://icbook.com.ua/post/_amimps/index.html Приведи весь код (только упакованным, чтобы собирался) тогда что нибудь поглядим.
Так этот код - часть драйвера в ядре... Исходники лежат здесь - http://xskernel.svn.sf.net/ Конкретно что я делаю с APIC - http://xskernel.svn.sourceforge.net/viewvc/xskernel/xskernel/include/io/apic/file.cpp?revision=170&view=markup Код я брал из ia32 manual, но, по ходу, чего-то не доглядел... Единственное - этот код у меня сейчас закомментирован, так как всё равно не даёт эффекта (/* */). P.S. За ссылку спасибо.
Разобрался с процессорами. Просто они стартовали, но выполняли всякую фигню (проблема оказалась в оффсетах).