OSDev

для всех
Текущее время: 06 дек 2019, 14:34

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 15 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Windows, FASM и MinGW для создания ОС
СообщениеДобавлено: 22 дек 2010, 20:51 

Зарегистрирован: 22 окт 2010, 13:22
Сообщения: 92
Откуда: Ртищево
Всем доброго вечера!

У меня стоит Windows 7. Опишу Вам мою ситуацию.

Создал в папке файл boot.asm:

Код:
format ELF
use16
org 0x7C00

hlt

rb 510-($-$$)
db 0x55,0xAA


Компилирую, линкую и превращаю в бинарник:

Код:
fasm boot.asm boot.o
ld -o Test.bin boot.o
objcopy Test.bin -O binary


На выходе получаю файл Test.bin с размером в 8212 байт. Странно, я думал что будет 512 байт, ну да ладно. Открываю его в hex-редакторе. С самого начала идёт:

Цитата:
FF FF FF FF 00 00 00 00 FF FF FF FF



А вот начиная со смещения 0x1000 (то есть 4096) идёт:

Цитата:
F4 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 55 AA



И далее снова 0x00.

Почему так? Я думал я получу 512 байт.

_________________
Изучаю процессор...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Windows, FASM и MinGW для создания ОС
СообщениеДобавлено: 23 дек 2010, 01:16 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1096
Откуда: Балаково
А "format ELF" указывать обязательно? Без него наверно сразу получится бинарник из fasm, и не нужен будет ld и objcopy.
Можешь на сайте http://flatassembler.net/examples.php
посмотреть пример "FAT12 boot loader".

Видать, данная конфигурация ld и objcopy не поддерживает binary. Напиши в какой системе компилируешь, тогда станет ясней. Я лично для решения этой проблемы в Cygwin и MinGW пересобирал пакет binutils из исходников, по инструкции с сайта
http://wiki.osdev.org/GCC_Cross-Compiler
Если не получится, то можешь скачать готовые версии ld и objcopy (распаковать архив в bin.). Они предназначены для получения ELF и binary:
http://code.google.com/p/express-os/dow ... list?can=4
Возможно, objcopy использовать не обязательно, если для ld добавить параметры
--oformat=binary --omagic
И честно говоря, я собирал бинарник не для реального i8086, а защищённого режима i386, поэтому результата не гарантирую.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Windows, FASM и MinGW для создания ОС
СообщениеДобавлено: 23 дек 2010, 13:03 

Зарегистрирован: 22 окт 2010, 13:22
Сообщения: 92
Откуда: Ртищево
chizh
Я работаю в Windows, поэтому --oformat=binary вызывает ошибку.

_________________
Изучаю процессор...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Windows, FASM и MinGW для создания ОС
СообщениеДобавлено: 23 дек 2010, 16:19 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1096
Откуда: Балаково
s3dworld писал(а):
chizh
Я работаю в Windows, поэтому --oformat=binary вызывает ошибку.

И я в Windows. И параметр --oformat=binary в моей сборке работает.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Windows, FASM и MinGW для создания ОС
СообщениеДобавлено: 23 дек 2010, 16:37 

Зарегистрирован: 22 окт 2010, 13:22
Сообщения: 92
Откуда: Ртищево
Тогда почему у меня не работает? Если я уберу ELF, тогда у меня не будет рассчитан адрес для вызова функции.

Вот мой код.

boot.asm:

Код:
use16
org 0x7C00

boot__code16:
   mov AX,CS
   mov DS,AX
   mov ES,AX
   mov FS,AX
   mov GS,AX
   mov SS,AX
   mov AX,boot_stack16_start
   mov SP,AX
   
   mov AH,0x02
   mov AL,10               ; Количество читаемых секторов
   mov CL,2               ; Сектор
   mov CH,0               ; Цилиндр
   mov DH,0               ; Головка
   mov DL,0               ; Диск
   mov BX,boot__continuation
   int 0x13
   
   jmp boot__continuation

boot__stack16:
   db 0,0,0,0,0,0,0,0
   db 0,0,0,0,0,0,0,0
   db 0,0,0,0,0,0,0,0
   db 0,0,0,0,0,0,0,0
   db 0,0,0,0,0,0,0,0
   db 0,0,0,0,0,0,0,0
   db 0,0,0,0,0,0,0,0
   boot_stack16_start:
   db 0,0,0,0,0,0,0,0

rb 510-($-$$)
db 0x55,0xAA

boot__continuation:


preparation.asm:

Код:
format ELF
use32
extrn '_kernel' as kernel

call kernel


main.c:

Код:
void kernel(void)
{
   int a=0;
   int b=0;
   int c=0;
   
   a=2;
   b=3;
   c=a+b;
}


И собираю:

Код:
@echo on
fasm boot.asm boot.bin
fasm preparation.asm preparation.o
gcc -ffreestanding -c -o main.o main.c
ld --oformat=binary -o Test.img preparation.o main.o
pause


В ответ:

Код:

D:\01>fasm boot.asm boot.bin
flat assembler  version 1.69.29  (985305 kilobytes memory)
3 passes, 512 bytes.

D:\01>fasm preparation.asm preparation.o
flat assembler  version 1.69.29  (985271 kilobytes memory)
1 passes, 348 bytes.

D:\01>gcc -ffreestanding -c -o main.o main.c

D:\01>ld --oformat=binary -o Test.img preparation.o main.o
ld: cannot perform PE operations on non PE output file 'Test.img'.

D:\01>pause
Для продолжения нажмите любую клавишу . . .


Вот я и озадачен. Я сначала хотел переход в защищённый режим писать на C-коде, а тут оказывается что я даже просто на 32-битный C-код перейти не могу.

_________________
Изучаю процессор...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Windows, FASM и MinGW для создания ОС
СообщениеДобавлено: 23 дек 2010, 18:52 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1096
Откуда: Балаково
ld из моего архива называется i686-elf-ld. Посмотри содержимое архива.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Windows, FASM и MinGW для создания ОС
СообщениеДобавлено: 23 дек 2010, 19:32 

Зарегистрирован: 22 окт 2010, 13:22
Сообщения: 92
Откуда: Ртищево
Какого архива?

_________________
Изучаю процессор...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Windows, FASM и MinGW для создания ОС
СообщениеДобавлено: 24 дек 2010, 01:18 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1096
Откуда: Балаково
s3dworld писал(а):
Какого архива?

http://code.google.com/p/express-os/dow ... list?can=4
Я о нём писал в сообщении 22 дек 2010 22:16
Но я его уже стёр, оказалось что он тоже неправильно работает.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Windows, FASM и MinGW для создания ОС
СообщениеДобавлено: 25 дек 2010, 18:42 

Зарегистрирован: 30 янв 2010, 19:44
Сообщения: 63
я делал так:
Цитата:
boot16.asm

1. копирую бутсег в какую-то часть памяти
2. дочитываю бутсектор (то что за 512 байтами)
3. включаю расширеный режим (сегменты простые типа всю память под один сегмент кода и данных)
4. прыгаю в место с уже 32-ым кодом
5. перенастраиваю сегменты на 32-й режим
6. прыгаю на код ядра


Цитата:
bootstrap.c

void _main();

void ___start(){
_main();
}


тут вся хитрость.. этот код компилируется просто в call на реальное место начала программы.

объектные файлы можно компилировать в любом порядке. компилирование нужно делать так чтоб бутстрап был первым.
ld -Ttext 0x40000 -nostdlib bootstrap.o %objects%

дальше преобразовываем в бинарник
objcopy -O binary a.exe %binary%

в итоге манипуляций должно быть два файла. первый это буткод для стартапа и второй это собственно ядро написаное на С.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Windows, FASM и MinGW для создания ОС
СообщениеДобавлено: 25 дек 2010, 19:33 

Зарегистрирован: 22 окт 2010, 13:22
Сообщения: 92
Откуда: Ртищево
Спасибо!

Сейчас всё работает. Практически уже свою файловую систему написал. Только вот не знаю как читать сектора с дискеты в защищённом режим. Не подскажите?

И ещё у меня вопрос по поводу языка C++. Как мне можно настроить операторы new, new[], delete и delete[], чтобы я их мог использовать в программе. Я просто даже представить не могу что они делают на низком уровне и как мне их переопределить. Для меня это очень важно. Так как файловую систему придумал, осталось только реализовать. Даже написал программу форматирования образа в мою файловую систему. Друг написал программу, позволяющую в Windows открывать образ дискете моей файловой системы, просматривать, извлекать и импортировать файлы.

_________________
Изучаю процессор...


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 15 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB