2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2, 3  След.
 
 Стек и bootloader
Сообщение29.12.2010, 04:20 


08/11/09
156
Я создал загрузчик (asm), который загружает ядро (Си) по адресу в памяти. Реальный режим. Но пока еще молодой, и долго не понимал, куда должен указывать регистр DS в момент загрузки ядра (понимал, да не работало). Теперь аналогичное со стеком. Если параметры функции, вызываемой в ядре, передаются через регистры, все ок. Но если нет - например, переменное количество аргументов, все летит. Как инициализировать стек? Куда должны указывать регистры? Спасибо..

 Профиль  
                  
 
 Re: Стек и bootloader
Сообщение29.12.2010, 10:54 


08/11/09
156
Вот kernel.c. В qemu код ничего не выводит, и выводит 'S', если '...' заменить на 'int x'. Отличие в передаче параметров через стек, как видно в ассемблерном коде.
Код:
__asm__(".code16gcc\n");
__asm__ ("jmp _start\n");

int extern __attribute__((noinline)) __attribute__((regparm(3))) sprintf(char * buf, const char *fmt, ...)
{
   __asm__ __volatile__ ("int 0x10" : : "a" (0x0E00 | *fmt), "b"(144));
}

void __attribute__((noreturn)) _start()
{
   char buf[128];
   sprintf(buf, "Sasha%d", 123);
   while(1);
}


Нынешняя инициализация регистров:
Код:
   mov   ax, SETUP_ADDR>>4   ; SETUP_SEG
   mov   es, ax
   mov   ds, ax
   mov  cs, ax
   mov  ss, ax
   mov   sp, 0x400
   jmp   SETUP_ADDR>>4:0


Компиляция и запуск:
Код:
#!/bin/bash
gcc -c -Wall -save-temps -march=i386 -ffreestanding -Wno-main -fno-builtin -masm=intel -O0 -o kernel.o  kernel.c
ld -nostdlib -static -Ttext 0 --oformat binary -o kernel.bin kernel.o

mkdir diskc
mount -t msdos -o loop=/dev/loop3,blocksize=1024 dos.img diskc
rm diskc/BOOTOR
cp kernel.bin diskc/BOOTOR
umount diskc
rmdir diskc

nasm boot.asm -o boot.bsr
dd if=boot.bsr of=dos.img bs=512 count=1 conv=notrunc

qemu -fda dos.img -boot a

 Профиль  
                  
 
 Re: Стек и bootloader
Сообщение29.12.2010, 13:49 


08/11/09
156
Исходники: http://zalil.ru/30246211

 Профиль  
                  
 
 Re: Стек и bootloader
Сообщение29.12.2010, 16:39 
Заслуженный участник


26/07/09
1559
Алматы
Да уж, это для меня что-то сложновато, надо ещё покумекать (да и вы намудрили). Но вопрос у меня один уже есть, вот что вообще у вас делает mov cs, ax? Как это так, разве так можно? :)

 Профиль  
                  
 
 Re: Стек и bootloader
Сообщение29.12.2010, 17:18 


08/11/09
156
Ну да... Это делает за вас ОС обычно. Я не прав? Судя по отладчику регистр заполняется правильно...

Кажется нарыл. в двоичном файле ядра строка "Sasha%d" строго в конце файла, хотя OFFSET .LC0 по дизассемблеру есть 0. Разве по опции -Ttext оно не должно быть в начале???

 Профиль  
                  
 
 Re: Стек и bootloader
Сообщение29.12.2010, 19:13 
Заслуженный участник


26/07/09
1559
Алматы
Наверное глупость скажу, но у вас ваша строка ведь в .rodata лежит, а не в .text секции. Ну это я так, не обращайте внимания. :) Я просто подумал, что вы же вроде бы вообще можете обойтись без указания адресов секций...

А вот с cs-регистром стоит разобраться. Явная инициализация этого регистра -- это какой-то злостный хак, который я первый раз вижу... Я думал, что этот регистр "сам" настраивается за счет последующего jmp'а... :)

Также я побоялся бы настраивать стек (ss/sp) без предварительного отключения прерываний (cli/sti).

В общем, даже не знаю, что посоветовать. :)

-- Ср дек 29, 2010 22:25:01 --

Ещё попробуйте gcc-опцию -fomit-frame-pointer. Кстати, что-то у вас какая-то подозрительная сместь 16-ти и 32-х разрядного кода используется (это я про дизассемблированный код говорю). Может в этом дело? Вы уж или в 16b работайте или уж в 32b защищенный режим переходите... А то ни туда, ни сюда. :)

 Профиль  
                  
 
 Re: Стек и bootloader
Сообщение29.12.2010, 21:58 


08/11/09
156
Так это генерируется cc, то есть с языка C. Я ничего не менял, гляньте kernel.c выше... Только инструкция ".code16gcc", некий "режим компромиссной 16-битности".

Я вот че понял: все правильно, он берет смещения переменных от начала какого-то сегмента... Какого? Я просто привык, что мы пишем ASSUME, а GCC такого не пишет... Или это на linux всегда так? Так вот: базирование .LC0 ведь идет по DS? А кто его устанавливает? Сейчас - я, причем абсолютно неправильно!!! А как GCC формирует сегменты? Один сегмент данных или как? Как получить его адрес, и почему он не записывается в DS? И где сегмент стека?

Ответьте, пожалуйста, и простите за тупые вопросы! :)

 Профиль  
                  
 
 Re: Стек и bootloader
Сообщение29.12.2010, 23:07 


08/11/09
156
А, то есть все намекают, что это flat memory model? И какими тогда GCC полагает значения регистров? Ну тогда предыдущий вопрос: А почему же OFFSET .0LC == 0, а в бинарнике реальное смещение этого байта 0x4e?

 Профиль  
                  
 
 Re: Стек и bootloader
Сообщение29.12.2010, 23:27 
Заслуженный участник


26/07/09
1559
Алматы
kuraga писал(а):
он берет смещения переменных от начала какого-то сегмента
...
А, то есть все намекают, что это flat memory model?

Ну да, вроде-бы gcc работает с плоской памятью... Я в этом плохо разбираюсь, и надеюсь ещё кто-нибудь подскажет. А я пошел качать qemu, может что и получится. :)

kuraga писал(а):
А почему же OFFSET .0LC == 0

А с чего вы это взяли?

 Профиль  
                  
 
 Re: Стек и bootloader
Сообщение29.12.2010, 23:59 


08/11/09
156
Circiter в сообщении #393593 писал(а):
kuraga писал(а):
А почему же OFFSET .0LC == 0

А с чего вы это взяли?

Код:
dissy kernel.o

И если OFFSET .0LC заменить на 0x14, все работает!
P.S. Спасибо за помощь!

 Профиль  
                  
 
 Re: Стек и bootloader
Сообщение30.12.2010, 00:02 
Заслуженный участник


26/07/09
1559
Алматы
kuraga писал(а):
И если OFFSET .0LC заменит на 0x14, все работает!

Не понял. До меня вот только дошло, что OFFSET .0LC == 0 вполне ожидаемый результат в модели [сегмент:смещение], т.е. смещение-то нулевое, но относительно ds (ну или секции данных, или даже соответствующего селектора в pm). Так откуда какие-то 0x14 взялись?

 Профиль  
                  
 
 Re: Стек и bootloader
Сообщение30.12.2010, 00:12 


08/11/09
156
Так в этом и прикол! Видимо, сам GCC работает в FMM, а вот ASM... То есть GCC не заботится о DS, а ASM (или LD?) понимает OFFSET как смещение от начала (но какого??), так что ли?
0x14 - размер кода kernel плюс один: строка "Sasha" идет после него [кода].

 Профиль  
                  
 
 Re: Стек и bootloader
Сообщение30.12.2010, 00:29 
Заслуженный участник


26/07/09
1559
Алматы
А вы не пробовали при инициализации писать mov ds, 0x14? Сейчас у вас там кладется SETUP_ADDR>>4.

 Профиль  
                  
 
 Re: Стек и bootloader
Сообщение30.12.2010, 00:46 


08/11/09
156
Пробовал, работает. Но как узнать, где GCC начнет сегмент данных? Я об этом и спрашивал выше...

 Профиль  
                  
 
 Re: Стек и bootloader
Сообщение30.12.2010, 03:11 
Заслуженный участник


26/07/09
1559
Алматы
Для нормального взаимодействия ассемблерного и сишного кода в gcc, лучше написать на ассемблере "заглушку", первая инструкция которой находится прямо в начале кода и совпадает с точкой входа (стартовой меткой), а дальше идет вспомогательный код, который в конечном итоге вызывает main(). Заглушка и основной код на C компилируются и компонуются вместе. Это решает все проблемы (я уже когда-то вам писал об этой схеме).

Причем часть кода заглушки может быть 16-ти битной, но потом должен быть переход в 32bPM (заодно будут правильно заполнены все сегментные регистры). Это я к тому, что работать с 16-ти битным кодом на gcc, имхо, нормально не получится.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 36 ]  На страницу 1, 2, 3  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: Dmitriy40


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group