Команда IT специалистов выполнит подготовку инфраструктуры для вашего бизнеса.
Внедрение самых передовых решений и технологий.
Поддержка и сопровождение ваших сервисов.
Выполнение работ под "ключ", от покупки сервера, до настройки автоматизации процессов.
8(977)608-78-62 adm@nixm.ru

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

Ответить
Аватара пользователя
nezabudka
Местный говорун
Местный говорун
Сообщения: 618
Зарегистрирован: 18 апр 2015, 06:13
Откуда: Ростов на Дону

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

Сообщение nezabudka »

В порядке знакомства с процессом загрузки ОС
попробовала найти в инете самописную программу
работающую как загрузчик. Нашла коды написанные
на 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
Смотрим результат:
[album]446[/album]
"I invented the term Object-Oriented and I can tell you I did not have C++ in mind." - Alan Kay
Ответить

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