Спосибо
RXL, что пытаешся так же разобраться в этой проблеме.
Теперь по существу: первая и вторая проблемы в принцепе на данном этапе меня не волнуют. А вот проблема три стоит на моем пути.
Для сборки исполняемого файла использую вот такой исходник:
#include <config.h>
#define ABS(x) (x-_start)
#define SELECTOR_CODE 8
#define SELECTOR_VIDEO 16
/* код для реального режима работы (i8086) */
.code16
.text
.globl _start
/*
* Код загружается в память по адресу 7с00h,
* в DL номер накопителя. Управления передается по
* адресу 0:7с00h.
* Это значит, что
* CS = 0
* IP = 7c00h
* DL = номеру накопителя (в соответствии с правилами
* BIOS int 13h).
*
* Итого:
* регистры:
* cs:ip - 0:7c00h
* dl - номер накопителя
* память:
* 00000-003FF таблица векторов прерываний
* 00400-005FF используется BIOS ( 1536 )
* 00600-07BFF свободно ( 30208 )
* 07C00-07DFF программа начальной загрузки ( 512 )
* 07E00-9FFFF свободно ( 623104 )
* A0000-FFFFF используется BIOS ( 393216 )
*/
/* настроим рабочее пространство данный и стека */
_start:
jmp main
msg: .asciz "Kernel code starting...\n"
/* основной код программы */
main:
cli
movw $SEG_BOOT_KERNEL, %ax
movw %ax, %ds /* определяем сегмент данных */
sti
/* Сообщение о начале работы kernel */
movw $ABS(msg), %ax
pushw %ax
call puts
addw $2, %sp
cli
lgdtw _gdtr
/* Переключаемся в PM */
movl %cr0, %eax
orb $1, %al
movl %eax, %cr0
ljmp $SELECTOR_CODE, $entry_PM
.code32
entry_PM:
movw $SELECTOR_VIDEO, %ax
movw %ax, %ds
xorl %eax, %eax
movw $0x1f41, (%eax)
movl $3998, %eax
movw $0x1f41,(%eax)
stop: jmp stop
_gdtr:
.word 23
.long _gdt+0x8000
_gdt:
.quad 0x0000000000000000
.quad 0x00c09a0080000000
.quad 0x0040920b80000f9f
На счет разных режимов работы (
".code16" и
".code32") не обращайте внимания, это инструкции только для ассемблера, а линкеру по барабанну какой код в секции
".text" 32 или 16 разрядный.
Скрипт для линкера имеет следующий вид:
OUTPUT_FORMAT ("binary")
OUTPUT_ARCH (i386)
ENTRY (_start)
SECTIONS
{
.text :
{
*(.text)
}
.bss :
{
*(.bss)
}
.data :
{
*(.data)
}
}
Так вот, я хочу заменить выходной формат файла с
"binary" на
"a.out-i386-linux" но в объектных файлах выдоваемых
"gcc" (точнее будет
"as") пресутствует секция
".comment" и как мне от нее избавиться я не знаю. У кого есть подобный опыт работы, поделитесь своими познаниями, я буду очень признателен.
Причина по которой я хочу использовать именно формат
"a.out" заключается в то, что он намного проще
"elf32" и его проще разместить в памяти. Кроме этого, исполняемый файл собранный в формате
"a.out" является, если так можно сказать, самодостаточным если он не использует системные вызовы.