Команда IT специалистов выполнит подготовку инфраструктуры для вашего бизнеса.
Внедрение самых передовых решений и технологий.
Поддержка и сопровождение ваших сервисов.
Выполнение работ под "ключ", от покупки сервера, до настройки автоматизации процессов. 8(977)608-78-62 adm@nixm.ru
Внедрение самых передовых решений и технологий.
Поддержка и сопровождение ваших сервисов.
Выполнение работ под "ключ", от покупки сервера, до настройки автоматизации процессов. 8(977)608-78-62 adm@nixm.ru
Пишем загрузчик на gas
Пишем загрузчик на gas
В порядке знакомства с процессом загрузки ОС
попробовала найти в инете самописную программу
работающую как загрузчик. Нашла коды написанные
на 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]
"I invented the term Object-Oriented and I can tell you I did not have C++ in mind." - Alan Kay