Операционная система на FreeBasic
|
|
haav | Дата: Воскресенье, 05.04.2015, 07:39 | Сообщение # 1 |
Генералиссимус
Группа: Администраторы
Сообщений: 1363
Статус: Offline
|
Bare Bones показал, как можно создать OS на FreeBasic. Конечно же, это только показательный пример, который выводит текстовую надпись на экране, однако может кому будет интересно.
Для сборки необходим кроссплатформенный пакет GCC: http://wiki.osdev.org/GCC_Cross-Compiler Из пакета нужны только файлы i686-elf-ar.exe, i686-elf-as.exe, i686-elf-ld.exe. Их нужно переименовать в ar.exe, as.exe , ld.exe и этими файлами заменить стандартные FB файлы в папке Bin (в приложенном архиве я положил эти файлы) Я собирал kernel.bin в Windows, а образ диска .iso в Linux Debian. Конечно все можно сделать в одной системе...
Сборка kernel.bin:
Пути для fbc и ld должны быть прописаны в переменных средах или нужно указывать до них полный путь
Компилируем:
Код fbc -c kernel.bas -o kernel.o
Линкуем:
Код ld -T link.ld -o kernel.bin kernel.o
Сборка iso образа:
Для сборки ISO нужна установленная программа xorriso
1) Кладем kernel.bin в папку isodir\boot\ 2) Собираем:
Код grub-mkrescue -o FbOS.iso isodir
Для теста там же под Linux можно запустить образ в эмуляторе QEMU:
Код qemu -hda FbOS.iso -m 32
Все!!! ----------------------------------------------------------------------------------------------------------------
Сам код:
link.ld:
Код OUTPUT_FORMAT("elf32-i386") ENTRY (loader)
SECTIONS{ . = 0x00100000;
.text :{ KERNEL_START = .;
*(.text) }
.rodata ALIGN (0x1000) : { *(.rodata) _CTORS = .; *(.ctors) _CTORS_END = .; }
.data ALIGN (0x1000) : { *(.data) }
.bss : { SBSS = .; *(COMMON) *(.bss) EBSS = .;
KERNEL_END = .; } }
kernel.bas
Код Extern "C" Declare SUB PrintString(src AS Byte Ptr, x AS LONG, y AS LONG) DECLARE SUB main () DECLARE Sub multiboot ()
Sub multiboot () Asm 'setting up the Multiboot header - see GRUB docs for details .set ALIGN, 1<<0 .set MEMINFO, 1<<1 .set FLAGS, ALIGN | MEMINFO .set MAGIC, 0x1BADB002 .set CHECKSUM, -(MAGIC + FLAGS) .align 4 .LONG MAGIC .LONG FLAGS .LONG CHECKSUM .set STACKSIZE, 0x4000 .comm stack, STACKSIZE, 32 .global loader loader: lea esp, stack + STACKSIZE push eax push ebx CALL MAIN cli hlt END Asm End Sub Sub main () CONST s = "FreeBasic OS from Bare Bones" PrintString CPtr(Byte Ptr, @s), 26, 12 End Sub Sub PrintString(src AS Byte Ptr, x AS LONG, y AS LONG) DIM dst AS Byte Ptr Dim bColor As Byte bColor = 1 DIM counter AS Long dst = CPtr(Byte Ptr, &HB8000 + y * 160 + x * 2) counter = 0 WHILE src[counter] <> 0 dst[2 * counter] = src[counter] dst[2 * counter + 1] = bColor counter = counter + 1 bColor=bColor+1 If bColor = 16 Then bColor = 1 WEND END Sub End Extern
Код немного изменил, чтобы компиляция проходила без проблем.
Скачать архив со всем необходимым
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
tymcrit | Дата: Вторник, 17.11.2015, 19:52 | Сообщение # 2 |
Рядовой
Группа: Пользователи
Сообщений: 5
Статус: Offline
| Проблема с файлом link.ld При изменении кода компиляция проходит успешно, нопри линковании происходит ошибка. Файл kernel.bas
Код Extern "C" DECLARE SUB main () DECLARE Sub multiboot () Sub multiboot () Asm 'setting up the Multiboot header - see GRUB docs for details .set ALIGN, 1<<0 .set MEMINFO, 1<<1 .set FLAGS, ALIGN | MEMINFO .set MAGIC, 0x1BADB002 .set CHECKSUM, -(MAGIC + FLAGS) .align 4 .LONG MAGIC .LONG FLAGS .LONG CHECKSUM .set STACKSIZE, 0x4000 .comm stack, STACKSIZE, 32 .global loader loader: lea esp, stack + STACKSIZE push eax push ebx CALL MAIN cli hlt END Asm End Sub Sub main () Print "Testing OS" Sleep(2000) End End Sub End Extern
Ошибка при линковании: Код kernel.o: In function `main': (.text+0x3a): undefined reference to `fb_StrAllocTempDescZEx' kernel.o: In function `main': (.text+0x45): undefined reference to `fb_PrintString' kernel.o: In function `main': (.text+0x52): undefined reference to `fb_Sleep' kernel.o: In function `main': (.text+0x5c): undefined reference to `fb_End'
Файл link.ld не изменял (был взят из архива)
|
|
| |
haav | Дата: Среда, 18.11.2015, 08:06 | Сообщение # 3 |
Генералиссимус
Группа: Администраторы
Сообщений: 1363
Статус: Offline
| Цитата tymcrit ( ) При изменении кода компиляция проходит успешно, нопри линковании происходит ошибка. Все правильно, так и должно быть. Компилятор не может определить и наладить связи с функциями Print и Sleep. RunTime freebasic жестко завязан на функциях библиотеки СИ , а так же на других функциях целевой платформы (windows, linux, dos). Если вы будете компилировать под поддерживаемую платформу, то линкер наладит связи с функциями целевой OS , в первую очередь потому что данные функции есть в OS и во вторую потому что компилятор freebasic умеет и знает как это делать под поддерживаемую платформу. В случае же данной миниос мы по факту имеем голый компилятор без RunTime , то есть имеем те инструкции , которые есть в ассемблере и в которые freebasic умеет преобразовывать из Basic инструкций (например: присваивание, объявление переменных, сложение , вычитание, работа с адресацией памяти...). То есть, при построении этой , либо какой-то другой OS , можно забыть почти про все операторы и функции freebasic. Если говорить аналогиями, то представьте , что вы оказались в прошлом примерно на 500 лет назад с электрической дрелью. У вас есть дрель, в ней сверло, но нет способа запитать эту дрель. Что вы сможете сделать? Либо крутить патрон руками, либо создавать какой то свой генератор, что потребует от вас немысленные знания в разных областях науки. В случае создания своей OS примерно так же. Знаний языка freebasic крайне мало, нужно знать ассемблер, прочитать кучу документации по принципам построения OS и техническим данным физических устройств (видеокарты, звуковой карты, сетевой карты и пр.). Надеюсь понятно написал.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
tymcrit | Дата: Среда, 18.11.2015, 19:11 | Сообщение # 4 |
Рядовой
Группа: Пользователи
Сообщений: 5
Статус: Offline
| Понятно. А можно ли как-нибудь включить библиотеку СИ?
|
|
| |
haav | Дата: Среда, 18.11.2015, 20:22 | Сообщение # 5 |
Генералиссимус
Группа: Администраторы
Сообщений: 1363
Статус: Offline
| Цитата tymcrit ( ) А можно ли как-нибудь включить библиотеку СИ? Можно. В статье Bare Bones в последнем абзаце как раз говорится об этом. Вообще сайт http://wiki.osdev.org/Main_Page как раз полностью посвящен созданию операционных систем.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
tymcrit | Дата: Четверг, 19.11.2015, 21:07 | Сообщение # 6 |
Рядовой
Группа: Пользователи
Сообщений: 5
Статус: Offline
| Спасибо за поддержку
|
|
| |
|