НЕЛЬЗЯ ВЕРИТЬ BIOS, ЧТО APIC РАБОТАЕТ В РЕЖИМЕ СОВМЕСТИМОСТИ.
После программирования APIC в Virtual Wire Mode комп перестал виснуть.
НЕЛЬЗЯ ВЕРИТЬ BIOS, ЧТО APIC РАБОТАЕТ В РЕЖИМЕ СОВМЕСТИМОСТИ.
После программирования APIC в Virtual Wire Mode комп перестал виснуть.
Для корректной работы ОС на многопроцессорных системах очень важно (АРХИВАЖНО) для первоначальной инициализации вырубить APIC. В моей ОС это делается следующим способом:
// Disable APIC
int cpuid = sys_open("/cpuid", O_RDONLY);
if (cpuid != 0)
{
TCPUIDInfo info;
if (sys_read(cpuid, &info, sizeof(TCPUIDInfo))==sizeof(TCPUIDInfo))
{
if ((info.Extensions&CPUID_EXT_APIC)!=0) // Disable APIC if presented
{
QWORD apic = ReadMSR(IA32_APIC_BASE);
apic &= (~(1<<11)); // Clear global enable/disable flag
WriteMSR(IA32_APIC_BASE, apic);
}
}
sys_close(cpuid);
}
После чего можно инициализировать обычный PIC (на самом деле, тот же APIC, но в legacy-mode
).
Иногда приходится вот так вот отлаживать ОСь.
Комп превращается в мега-тормоза. А результата 0.
Но за бегущими циферками иногда интересно понаблюдать.
Всё-таки закоммитил загрузчик бутсектора, который читает рутовую директорию говнофата и грузит файл xload.com.
Загрузчик вешается на обработчик прерывания int 21h и позволяет две функции:
1. Открытие файла.
2. Последовательное чтение файла.
Одновременно можно работать только с одним файлом (извольте, и так много всего уже в бутсекторе понапихано).
Открывается файл по сигнатуре (то есть, те 11 байт, которые содержатся в дескрипторе файла на диске).
Если Файл xload.com или xsystem.xin не найден, то загрузчик впадает в бесконечный цикл.
Вот, собственно, и всё. Что ещё нужно для счастья? Разве что написать вторичный загрузчик на С/С++.
З.Ы.
Специально для таких блоггеров, как, например, lazytroll, заявляю, что не хочу на данный момент пользоваться GRUB
.
Всем известна такая корпорация, как Microsoft, которая занимается написанием кривого, глючного софта, кражей и патентованием идей людей, не имевших к ней до этого никакого отношения, а также созданием костылей.
Чтобы не быть голословным, приведу вполне реальный пример, с которым я столкнулся при внедрении поддержки файловой системы FAT в ядро.
Заголовок файловой системы FAT, хранящейся в бутсекторе диска:
typedef struct TFATHeader
{
BYTE JumpCode[3]; // jmp start code
BYTE OEMName[8]; // OEM Name
WORD BytesPerSector; // Bytes per one disk sector
BYTE SectorsPerCluster; // Sectors per one cluster
WORD ReservedSectors; // Count of reserved sectors
BYTE FATTables; // Count of FAT tables
WORD RootEntries; // Count of entries in root directory
WORD TotalSectors; // Total sectors count
BYTE MediaType; // Media type
WORD FATSize; // FAT size in elements
WORD SectorsPerTrack; // Sectors per one disk track
WORD HeadsCount; // Heads on the disk
DWORD HiddenSectors; // Hidden sectors count
DWORD TotalSectors32; // Total sectors count (for FAT32)
} TFATHeader;
Но не столько важен сам заголовок, сколько то, что лежит за ним. А за ним лежит в файловых системах FAT12 и FAT16:
// FAT additional information. Perhaps good.
typedef struct TFATTail
{
BYTE DriveNumber; // Device number
BYTE Reserved; // Reserved
BYTE BootSignature; // Boot signature
DWORD VolumeID; // Volume identifier
BYTE VolumeLabel[11]; // Volume label
BYTE FileSysType[8]; // File system type
} TFATTail;
И (о господи!) в FAT32:
// FAT32 additional information. Microsoft again sucks.
typedef struct TFAT32Tail
{
DWORD FATSize32; // FAT size in elements
WORD ExtFlags; // Extension flags
WORD FSVer; // Filesystem version
DWORD RootClu; // Root cluster address
WORD FSInfoSector; // FSInfo sector offset
WORD BootCopy; // Bootsector copy offset
BYTE Reserved[12]; // Reserved data
BYTE DriveNumber; // Device number
BYTE Reserved1; // Reserved
BYTE BootSignature; // Boot signature
DWORD VolumeID; // Volume identifier
BYTE VolumeLabel[11]; // Volume label
BYTE FileSysType[8]; // File system type
} TFAT32Tail;
И теперь Microsoft можно называть серьёзной организацией? Какого лешего они запихнули в середину этот код(?):
DWORD FATSize32; // FAT size in elements
WORD ExtFlags; // Extension flags
WORD FSVer; // Filesystem version
DWORD RootClu; // Root cluster address
WORD FSInfoSector; // FSInfo sector offset
WORD BootCopy; // Bootsector copy offset
BYTE Reserved[12]; // Reserved data
Это не просто усложняет жизнь, это порождает во мне сильную ненависть. Я бы понял их, если бы они просто и скромно дописали поля в конец хвоста. Но зачем в середину системных данных-то???
Всё ещё не верите, что Microsoft — отстой? Тогда ждите следующий пост, в котором я вам расскажу про такое зло, как LFN, и с чем его едят (а точнее, курят, хотя тут и так понятно — с коноплёй).
Чем ближе идёт дело к середине семестра, тем сложнее браться за написание ОС. Спишь по 4 часа в сутки, остальное время проводишь либо на работе, либо в универе.
В общем, релизнул новую версию ядра. Конечно, планировалось внести больше изменений, но что поделаешь… Занятость даёт о себе знать.
Ждите в следущем месяце новый релиз под лозунгом «1st April»
.
Сегодня у меня счастье. Удалось прикрутить к ваткомовскому IDE хороший, удобный текстовый редактор. Называется он Notepad++. Многофункциональный, небольшой в объёмах и очень удобный — вот его качества. По сравнению со «стандартным» ваткомовским это просто конфетка. В общем, я рад
.
Релиз Watcom 1.6 тоже меня порадовал: наконец-то компилятор C++ начал понимать, что такое member templates. В общем, счастье да и только.
Вообще, я ЗА использование шаблонов при написании ОС. Может, они и выглядят грозно, но код от них выигрывает в качестве.
Вот конкретный пример: вместо макроса va_list можно спокойно сбацать хороший шаблончик, при этом генерируемый код будет даже получше, нежели в случае, когда использовались бы макросы.
И всё же я поражаюсь людям, которые пытаются писать ОС на чистом ассемблере. Мало того, выбирают не FASM, а какой-нибудь MASM или TASM, где линковать весь тот бред, что они написали, равносильно самобичеванию.
Мало того, когда человеку говоришь, что большая часть ядра ОС должна быть написана на языке высокого уровня, и лишь критическая, аппаратно-зависимая часть — на асме, он упорно продолжает писать на асме всё ядро.
Мало того, человеку объясняют: «используй символические константы», а он упорно продолжает использовать «магические числа», в которых потом чёрт ногу сломит.
Отсюда, собственно говоря, выходит: при попытке реализовать загрузку регистра TR человек грузит в него не сегмент TSS, а шлюз задачи. И из-за этого мне пришлось копаться в его коде полчаса, тогда как в программе на Си я бы разобрался за 5 минут! В общем, что говорить…
Те ОС-девелоперы, кто меня достаточно хорошо знают, знают, о ком я пишу.