Пишем загрузчик на gas
Добавлено: 07 сен 2016, 17:05
В порядке знакомства с процессом загрузки ОС
попробовала найти в инете самописную программу
работающую как загрузчик. Нашла коды написанные
на nasm и yasm. Но как известно большинство линуксоидов
за исключением писателей компиляторов кодеры на Си.
Если посмотреть все форумы по программированию на
ассемблере то линукс разделы попросту пустуют или
отсутствуют. Тем более по родному gnu ассемблеру, да
еще и x86_64 архитектуре информацию можно собирать в сети
только по крупицам. Многие современные ассемблеры
очень продвинуты для написания больших программ. Но
повторюсь, работая в линуксе порой нужно хотябы понимать
именно синтаксис разработанный в компании AT&T.
Вот я и решила, простенький, демонстрационный
загрузчик написанный на yasm, помещающийся целиком в первом
загрузочном секторе переписать на gas. Что нам для этого
нужно? В певую очередь установленный пакет buinutils.
Во вторых то что будет далее написано, работает как на
32 битной так и на 64 битной архитектуре без каких либо
изменений. Для начала привожу сам код загрузчика который считывает
программа - биос и помещает в оперативную память для выполнения всего
одного действия - вывода на экран текстовой строки:
Теперь ассемблируем код в объектный файл:
Слинкуем его в файл специального формата:
Создадим образ дискеты:
И запишем на нее первый загрузочный сектор. Если мы посмотрим
командой ls -l то увидим что файл test.bin имеет размер
ровно 512 байт под размер сектора.
Запускаем на виртуалке:
Я запускала на своем нетбуке с процессором atom не поддерживающим
полной виртуализации и поэтому я использовала гипервизор qemu
без модуля kvm, моя строчка при этом имела вот такой вид:
Смотрим результат:
[album]446[/album]
попробовала найти в инете самописную программу
работающую как загрузчик. Нашла коды написанные
на 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полной виртуализации и поэтому я использовала гипервизор qemu
без модуля kvm, моя строчка при этом имела вот такой вид:
Код: Выделить всё
qemu-system-i386 -fda floppy.img -boot a[album]446[/album]