Архив за ‘XSystem’ категория

День убит, но с пользой.

Октябрь 28th, 2007

Проблему, кажется, решил.

НЕЛЬЗЯ ВЕРИТЬ BIOS, ЧТО APIC РАБОТАЕТ В РЕЖИМЕ СОВМЕСТИМОСТИ.

После программирования APIC в Virtual Wire Mode комп перестал виснуть.

Собственно, код…

Учимся вырубать APIC

Октябрь 25th, 2007

Для корректной работы ОС на многопроцессорных системах очень важно (АРХИВАЖНО) для первоначальной инициализации вырубить 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 :) ).

Жосткий дебагer

Октябрь 22nd, 2007

Иногда приходится вот так вот отлаживать ОСь.
Комп превращается в мега-тормоза. А результата 0.
Но за бегущими циферками иногда интересно понаблюдать.

Свершилось.

Октябрь 10th, 2007

Всё-таки закоммитил загрузчик бутсектора, который читает рутовую директорию говнофата и грузит файл xload.com.
Загрузчик вешается на обработчик прерывания int 21h и позволяет две функции:
1. Открытие файла.
2. Последовательное чтение файла.
Одновременно можно работать только с одним файлом (извольте, и так много всего уже в бутсекторе понапихано).
Открывается файл по сигнатуре (то есть, те 11 байт, которые содержатся в дескрипторе файла на диске).
Если Файл xload.com или xsystem.xin не найден, то загрузчик впадает в бесконечный цикл.

Вот, собственно, и всё. Что ещё нужно для счастья? Разве что написать вторичный загрузчик на С/С++.

З.Ы.
Специально для таких блоггеров, как, например, lazytroll, заявляю, что не хочу на данный момент пользоваться GRUB ;) .

Для тех, кто всё ещё любит Microsoft.

Июнь 11th, 2007

Всем известна такая корпорация, как 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, и с чем его едят (а точнее, курят, хотя тут и так понятно — с коноплёй).

Новый релиз ОС.

Март 11th, 2007

Чем ближе идёт дело к середине семестра, тем сложнее браться за написание ОС. Спишь по 4 часа в сутки, остальное время проводишь либо на работе, либо в универе.
В общем, релизнул новую версию ядра. Конечно, планировалось внести больше изменений, но что поделаешь… Занятость даёт о себе знать.

Ждите в следущем месяце новый релиз под лозунгом «1st April» :) .

Редактор :)

Декабрь 25th, 2006

Сегодня у меня счастье. Удалось прикрутить к ваткомовскому IDE хороший, удобный текстовый редактор. Называется он Notepad++. Многофункциональный, небольшой в объёмах и очень удобный — вот его качества. По сравнению со «стандартным» ваткомовским это просто конфетка. В общем, я рад :) .

Релиз Watcom 1.6 тоже меня порадовал: наконец-то компилятор C++ начал понимать, что такое member templates. В общем, счастье да и только.

Вообще, я ЗА использование шаблонов при написании ОС. Может, они и выглядят грозно, но код от них выигрывает в качестве.
Вот конкретный пример: вместо макроса va_list можно спокойно сбацать хороший шаблончик, при этом генерируемый код будет даже получше, нежели в случае, когда использовались бы макросы.

Assembler — зло :)

Декабрь 6th, 2006

И всё же я поражаюсь людям, которые пытаются писать ОС на чистом ассемблере. Мало того, выбирают не FASM, а какой-нибудь MASM или TASM, где линковать весь тот бред, что они написали, равносильно самобичеванию.

Мало того, когда человеку говоришь, что большая часть ядра ОС должна быть написана на языке высокого уровня, и лишь критическая, аппаратно-зависимая часть — на асме, он упорно продолжает писать на асме всё ядро.

Мало того, человеку объясняют: «используй символические константы», а он упорно продолжает использовать «магические числа», в которых потом чёрт ногу сломит.

Отсюда, собственно говоря, выходит: при попытке реализовать загрузку регистра TR человек грузит в него не сегмент TSS, а шлюз задачи. И из-за этого мне пришлось копаться в его коде полчаса, тогда как в программе на Си я бы разобрался за 5 минут! В общем, что говорить…

Те ОС-девелоперы, кто меня достаточно хорошо знают, знают, о ком я пишу.