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  След.

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



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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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