Пишем загрузчик на gas

Пишем загрузчик на gas

Сообщение nezabudka » 07 сен 2016, 17:05

В порядке знакомства с процессом загрузки ОС
попробовала найти в инете самописную программу
работающую как загрузчик. Нашла коды написанные
на nasm и yasm. Но как известно большинство линуксоидов
за исключением писателей компиляторов кодеры на Си.
Если посмотреть все форумы по программированию на
ассемблере то линукс разделы попросту пустуют или
отсутствуют. Тем более по родному gnu ассемблеру, да
еще и x86_64 архитектуре информацию можно собирать в сети
только по крупицам. Многие современные ассемблеры
очень продвинуты для написания больших программ. Но
повторюсь, работая в линуксе порой нужно хотябы понимать
именно синтаксис разработанный в компании AT&T.
Вот я и решила, простенький, демонстрационный
загрузчик написанный на yasm, помещающийся целиком в первом
загрузочном секторе переписать на gas. Что нам для этого
нужно? В певую очередь установленный пакет buinutils.
Во вторых то что будет далее написано, работает как на
32 битной так и на 64 битной архитектуре без каких либо
изменений. Для начала привожу сам код загрузчика который считывает
программа - биос и помещает в оперативную память для выполнения всего
одного действия - вывода на экран текстовой строки:
Код: выделить все
#filename test.s
.code16
.section .text
.globl _start
_start:
        mov $welcome, %si
print:  lodsb
        test %al, %al
        jz exit
        movb $0x0e, %ah
        int $0x10
        jmp print
        welcome: .asciz "Hello, from Nezabudka\n\rto users of Linuxim"
exit:
     . = _start + 510
     .byte 0x55
     .byte 0xaa


Теперь ассемблируем код в объектный файл:
Код: выделить все
as test.s -o test.o

Слинкуем его в файл специального формата:
Код: выделить все
ld -Ttext 0x7C00 --oformat=binary test.o -o test.bin

Создадим образ дискеты:
Код: выделить все
dd if=/dev/zero of=floppy.img bs=1024 count=1440

И запишем на нее первый загрузочный сектор. Если мы посмотрим
командой ls -l то увидим что файл test.bin имеет размер
ровно 512 байт под размер сектора.
Код: выделить все
dd if=test.bin of=floppy.img conv=notrunc

Запускаем на виртуалке:
Код: выделить все
qemu-kvm -fda floppy.img -boot a

Я запускала на своем нетбуке с процессором atom не поддерживающим
полной виртуализации и поэтому я использовала гипервизор qemu
без модуля kvm, моя строчка при этом имела вот такой вид:
Код: выделить все
qemu-system-i386 -fda floppy.img -boot a

Смотрим результат:
446
"I invented the term Object-Oriented and I can tell you I did not have C++ in mind." - Alan Kay
Аватар пользователя
nezabudka
Местный говорун
Местный говорун
 
Автор темы
Сообщений: 619
Фото: 180
Стаж: 4 года 7 месяцев 3 дня
Откуда: Ростов на Дону
Благодарил (а): 287 раз.
Поблагодарили: 148 раз.

Пишем загрузчик на gas

Спонсор

Спонсор
 

Вернуться в Другие языки

Кто сейчас на форуме

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

cron