PDA

View Full Version : سوال: کامپایل کرنل ۳۲ بیتی روی سیستم ۶۴ بیتی



yassersajjadi
شنبه 04 شهریور 1391, 14:55 عصر
سلام
من تازه دارم با لینوکس کار میکنم
با اسمبلی و سی یک کرنل ساختم - بوت لودرم کامل کار میکنه ولی توی نقطه ورود به سی مشکل داره فایل کرنل که با سی نوشته شده کار نمیکنه
خودم تصور میکنم بخاطر سیستم ۶۴ بیتی من باشه و باید از یه کامپایلر ۳۲ بیتی استفاده کنم ولی نمیدونم چطوری
کلا یه بوت لودر دارم که یه فایل به نام SWITCH رو لود میکنه توی رم و پرش میکنه به اونجا و در فایل سویچ a20 , gdt فعال میشن و بعد فایل کرنل رو لود میکنه و پرش میکنه به آدرسش
من برای کامپایل کرنل از این کد استفاده کردم :




nasm -f bin Boot.s -o BOOT
losetup /dev/loop0 floppy.img
cat BOOT > /dev/loop0

nasm -f bin Switch.s -o SWITCH

gcc -ffreestanding -c entry.c -o entry.o
ld -e entry -Ttext 0x100000 -o kernel.o entry.o
ld -i -e entry -Ttext 0x100000 -o kernel.o entry.o
objcopy -R .note -R .comment -S -O binary kernel.o KERNEL
qemu -fda /dev/loop0 -m 32

اما بوت لودرم فایل KERNEL پیدا میکنه ولی نمیتونه اجراش کنه
راهنمایی کنید لطفا - شاید مشکل جای دیگه باشه

pswin.pooya
شنبه 04 شهریور 1391, 17:08 عصر
بوت لودرت چيه؟

yassersajjadi
شنبه 04 شهریور 1391, 17:29 عصر
بوت لودرو خودم نوشتم
از گراب هم استفاده کردم فایده ای نداشت

yassersajjadi
شنبه 04 شهریور 1391, 17:30 عصر
از گراب که استفاده میکنم میگه فرمت وارد شده صحیح نیست

yassersajjadi
شنبه 04 شهریور 1391, 18:27 عصر
start.s :



[BITS 32]
global start
extern _main
start:
mov esp, _sys_stack ; This points the stack to our new stack area
jmp stublet

; This part MUST be 4byte aligned, so we solve that issue using 'ALIGN 4'
ALIGN 4
mboot:

MULTIBOOT_PAGE_ALIGN equ 1<<0
MULTIBOOT_MEMORY_INFO equ 1<<1
MULTIBOOT_AOUT_KLUDGE equ 1<<16
MULTIBOOT_HEADER_MAGIC equ 0x1BADB002
MULTIBOOT_HEADER_FLAGS equ MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO | MULTIBOOT_AOUT_KLUDGE
MULTIBOOT_CHECKSUM equ -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)
EXTERN code, bss, end

dd MULTIBOOT_HEADER_MAGIC
dd MULTIBOOT_HEADER_FLAGS
dd MULTIBOOT_CHECKSUM

dd mboot
dd code
dd bss
dd end
dd start

stublet:
call _main
jmp $


SECTION .bss
resb 8192
_sys_stack:


main.c :

void main()
{

for (;;);
}

link.ld :


OUTPUT_FORMAT("binary")
ENTRY(start)
phys = 0x00100000;
SECTIONS
{
.text phys : AT(phys) {
code = .;
*(.text)
*(.rodata)
. = ALIGN(4096);
}
.data : AT(phys + (data - code))
{
data = .;
*(.data)
. = ALIGN(4096);
}
.bss : AT(phys + (bss - code))
{
bss = .;
*(.bss)
. = ALIGN(4096);
}
end = .;
}

برای کامپایل از کد های زیر استفاده میکنم ولی خطا میده
nasm -f aout -o start.o start.s
gcc -Wall -O -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc -fno-builtin -I./include -c -o main.o main.c
ld -T link.ld -o kernel.bin start.o

خطا:


emsys@XPS:~/Storage/Applications/Tios/Kernel$ nasm -f aout -o start.o start.s
emsys@XPS:~/Storage/Applications/Tios/Kernel$ gcc -Wall -O -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc -fno-builtin -I./include -c -o main.o main.c
main.c:1:6: warning: return type of ‘main’ is not ‘int’ [-Wmain]
emsys@XPS:~/Storage/Applications/Tios/Kernel$ ld -T link.ld -o kernel.bin start.o
ld: i386 architecture of input file `start.o' is incompatible with i386:x86-64 output
start.o:start.o:(.text+0x29): undefined reference to `_main'
emsys@XPS:~/Storage/Applications/Tios/Kernel$

joker
شنبه 04 شهریور 1391, 22:39 عصر
یکبار توی یک سیستم مجازی تستش کن ببین بازم مشکل همینه؟

yassersajjadi
شنبه 04 شهریور 1391, 22:54 عصر
یکبار توی یک سیستم مجازی تستش کن ببین بازم مشکل همینه؟

تو حالت مجازی مشکلی نداره ولی اینو باید درستش کنم

pswin.pooya
یک شنبه 05 شهریور 1391, 09:58 صبح
این قضیه یه قلق کوچولو هم توی کامپایل و هم توی کدینگ داره. کدهای مربوط به سیستم عامل من رو نگاه بکن دستگیرت میشه مشکل از کجاست. این قضیه کامپایل اول یکم اذیت کننده هست. اما بعدش دیگه آسونترین مرحله میشه. بهتره از گراب هم بجای بوت لودر خودت استفاده کنی. قبل از هر کار دیگه پیشنهاد می کنم موارد زیر رو کامل مطالعه کنی وگرنه بازم مثل من چند ماه درجا میزنی و بعدش متوجه میشی چه خبره:

۱. استاندارد مولتی بوت رو حتما کامل بخون. درمورد اون و گراب توی نت سرچ بزنی راهنماهای زیادی وجود داره.
۲. در مورد GCC خوب مطالعه کن. (بشدت کتاب GCC complete refrence رو پیشنهاد میکنم. ) این کتاب میتونه چندین ماه شما رو جلو بندازه. (مخصوصا قسمت ابزارها)


مورد دیگه اینه که مثل بالا سعی نکنین از کدهای آماده روی نت استفاده کنین. چون در مورد C و سیستم عامل بر عکس عمل میکنه. (توی این مورد هر کس یه سلیقه ای داره و توی یه بازه زمانی متفاوتی کد رو نوشته که شرایط نرم افزاری و سخت افزاری زمانش با شما متفاوت بوده.). مثلا در مورد کد بالا سعی شده که یه پشته جدید ساخته بشه که به نظر من کار اشتباهی هست. اینکار باید تحت نظارت کامل کد سی باشه. و یا سعی شده که هدر مولتی بوت اول فایل باشه با اینکه هیچ تظمینی براش وجود نداره و اسکریپت کامپایل باید این موضوع رو مشخص کنه. در مورد قسمت entry به شکل ۱۰۰ درصد مطمئن هستم که کدهای کامپایل شما با منبعی که استفاده کردین متفاوت هست. دلیلش هم اینه که منبعی که استفاده کردین ترتیب متفاوتی رو توی کامپایل و لینک رعایت کرده و در نتیجه منجر شده که گراب نتونه فایل هسته شما رو شناسایی کنه. این مساله مربوط به استاندارد مولتی بوت هست. من حدود چند ماه خودم درگیر این قضیه بودم.


برای کامپایل از کد های زیر استفاده میکنم ولی خطا میده
همیشه یه Makefile بنویس. اینجوری بخوای کار کنی پیر میشی.

yassersajjadi
یک شنبه 05 شهریور 1391, 17:06 عصر
ممنون پویا سعی میکنم توصیه هاتو عملی کنم

nimvb123456
یک شنبه 05 شهریور 1391, 18:33 عصر
سلام
هنگام کامپایل با gcc از گزینه m32 استفاده کن. به این صورت:
gcc -m32 -Wall -O -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc -fno-builtin -I./include -c -o main.o main.c

yassersajjadi
دوشنبه 06 شهریور 1391, 12:59 عصر
مشکل کامپایلم حل شد

yassersajjadi
دوشنبه 06 شهریور 1391, 13:08 عصر
مشکل کامپایلم حل شد ولی باز به یه مشکل دیگه برخوردم
وقتی از کد زیر استفاده میکنم هیچ مشکلی نیست
char txt[]="Text Message";
puts(txt)
void puts(char text[])
{
unsigned long i;
i=0;
while(text[i])
{
putch(text[i++]);
}
}

ولی نمیشه که من همیشه یه آرایه تعریف کنم واسه نوشتن در خروجی واسه همین میخوام از کد زیر استفاده کنم ولی وقتی استفاده میکنم هیچی نمایش داده نمیشه
puts("Text Message");
void puts(char *text)
{
unsigned long i;
i=0;
while(text[i])
{
putch(text[i++]);
}
}

yassersajjadi
دوشنبه 06 شهریور 1391, 13:16 عصر
تابع putch هم بصورت زیر تعریف میشه:

putch(char ch);