FreeBasic
Главная
Вход
Регистрация
Среда, 16.10.2024, 07:12Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Операционная система на FreeBasic
haavДата: Воскресенье, 05.04.2015, 07:39 | Сообщение # 1
Генералиссимус
Группа: Администраторы
Сообщений: 1366
Репутация: 49
Статус: 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


Код немного изменил, чтобы компиляция проходила без проблем.

Скачать архив со всем необходимым
Прикрепления: 1102335.png (3.3 Kb)


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
tymcritДата: Вторник, 17.11.2015, 19:52 | Сообщение # 2
Рядовой
Группа: Пользователи
Сообщений: 5
Репутация: 0
Статус: 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
Генералиссимус
Группа: Администраторы
Сообщений: 1366
Репутация: 49
Статус: 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
Репутация: 0
Статус: Offline
Понятно. А можно ли как-нибудь включить библиотеку СИ?
 
haavДата: Среда, 18.11.2015, 20:22 | Сообщение # 5
Генералиссимус
Группа: Администраторы
Сообщений: 1366
Репутация: 49
Статус: Offline
Цитата tymcrit ()
А можно ли как-нибудь включить библиотеку СИ?

Можно. В статье Bare Bones в последнем абзаце как раз говорится об этом. Вообще сайт http://wiki.osdev.org/Main_Page как раз полностью посвящен созданию операционных систем.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
tymcritДата: Четверг, 19.11.2015, 21:07 | Сообщение # 6
Рядовой
Группа: Пользователи
Сообщений: 5
Репутация: 0
Статус: Offline
Спасибо за поддержку
 
  • Страница 1 из 1
  • 1
Поиск: