#linux #gcc #assembly #boot
#linux #gcc #сборка #загрузка
Вопрос:
я новичок в сборке и программировании на c (использую GCC в Linux)
может кто-нибудь здесь сказать мне, как скомпилировать код c в сборку и загрузиться с него с помощью pen drive
я использую команду (в терминале Linux) :
gcc -S bootcode.c
код выдает мне загрузочный код.S-файл
что мне с этим делать???
я просто хочу скомпилировать следующий код и запустить его непосредственно с USB-накопителя
#include<stdio.h>
void main()
{
printf ("hi");
}
любая помощь здесь???
Комментарии:
1. Взгляните на wiki.osdev.org/Main_Page и особенно — wiki.osdev.org/Boot_sequence чтобы увидеть, как загружается компьютер.
2. Если я вас правильно понял, вы хотите загрузить USB-накопитель непосредственно из BIOS? Это огромная задача, требующая много работы, которую обычная программа не может выполнить (например, нет операционной системы для вашего printf для использования). Вам следует выполнить поиск в Google по разработке кода загрузчика и операционных систем.
Ответ №1:
Прежде всего,
Вы должны знать, что когда вы пишете коды загрузчика, вы должны знать, что вы СОЗДАЕТЕ СВОЮ СОБСТВЕННУЮ СРЕДУ КОДА, это означает, что вам не доступна такая готовая библиотека C или что-то подобное, ТОЛЬКО и ТОЛЬКО СЛУЖБЫ BIOS (или ПРОЦЕДУРЫ ПРЕРЫВАНИЯ).
Теперь, если вы получили это, вы, вероятно, поймете, что приведенный выше код не будет загружаться, поскольку у вас нет заголовка «stdio.h», это означает, что процессор при выполнении вашего скомпилированного кода не найдет этот заголовок и, следовательно, не поймет, что такое «printf» (посколькуprintf — это метод stdio.заголовок h). Поэтому, если вы хотите напечатать какую-либо строку, вам нужно написать эту функцию САМОСТОЯТЕЛЬНО либо в отдельный файл в качестве заголовка и связать его объектный файл во время компиляции при создании конечного двоичного файла, либо в том же файле. это зависит от вас. Могут быть и другие способы, я с ними не очень хорошо знаком, просто проведите некоторые исследования.
Еще одна вещь, которую вы должны знать, именно BIOS отвечает за загрузку этого загрузочного кода (вашего кода выше в вашем случае) в ячейку памяти 0x07C00 (0x0000h: 0x7C00 в представлении segment: offset), поэтому вы ДОЛЖНЫ указать в своем коде, что вы пишете этот код в этой ячейке памяти,либо с помощью
1-использование инструкции ORG
2-Или загрузив соответствующие регистры для этого (cs, ds, es)
Кроме того, вы должны ознакомиться со схемой представления памяти segment: offset, просто погуглите или почитайте руководства Intel.
Наконец, чтобы BIOS загрузил ваш код в 0x07C00, загрузочный код не должен превышать 512 байт (ТОЛЬКО НА ПЕРВОМ СЕКТОРЕ ЗАГРУЗОЧНОГО НОСИТЕЛЯ, поскольку размер раздела составляет 512 байт), и он должен найти в последних двух байтах этого первого сектора (байт 510 и байт 511) вашего кодаподпись загрузки 0x55AA, иначе BIOS не будет считать этот код ЗАГРУЗОЧНЫМ. Обычно это кодируется как :
ORG 0x7C00
…
вашего загрузочного кода и загрузки большего количества кодов, начиная с 512 байт, будет недостаточно.
…
раз 510 — ($ — $$) db 0x00; Обнуление до 510 байт
dw 0xAA55 ;Boot Sector signature,written in reverse order since it
will be stored as little endian notation
Просто чтобы вы знали, я здесь не все описываю, потому что, если это так, я буду писать об этом страницы, вам нужно поискать больше ресурсов в сети, и вот ссылка для начала (кодирование на ассемблере):
http://www.brokenthorn.com/Resources/OSDevIndex.html
Вот и все, надеюсь, это было полезно для вас … ^_^
Khilo — АЛЖИР
Ответ №2:
Загрузка компьютера не так проста. Необходимо написать загрузчик. Загрузчик должен подчиняться определенным правилам и соответствовать оборудованию, такому как ПЗУ. Вам также необходимо отключить прерывания, зарезервировать некоторую память и т. Д. Посмотрите MikeOS, это отличный проект, который может лучше помочь вам понять процесс. Приветствия