کامپایل کرنل ۳۲ بیتی روی سیستم ۶۴ بیتی
سلام
من تازه دارم با لینوکس کار میکنم
با اسمبلی و سی یک کرنل ساختم - بوت لودرم کامل کار میکنه ولی توی نقطه ورود به سی مشکل داره فایل کرنل که با سی نوشته شده کار نمیکنه
خودم تصور میکنم بخاطر سیستم ۶۴ بیتی من باشه و باید از یه کامپایلر ۳۲ بیتی استفاده کنم ولی نمیدونم چطوری
کلا یه بوت لودر دارم که یه فایل به نام 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 پیدا میکنه ولی نمیتونه اجراش کنه
راهنمایی کنید لطفا - شاید مشکل جای دیگه باشه
نقل قول: کامپایل کرنل ۳۲ بیتی روی سیستم ۶۴ بیتی
نقل قول: کامپایل کرنل ۳۲ بیتی روی سیستم ۶۴ بیتی
بوت لودرو خودم نوشتم
از گراب هم استفاده کردم فایده ای نداشت
نقل قول: کامپایل کرنل ۳۲ بیتی روی سیستم ۶۴ بیتی
از گراب که استفاده میکنم میگه فرمت وارد شده صحیح نیست
نقل قول: کامپایل کرنل ۳۲ بیتی روی سیستم ۶۴ بیتی
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
یکبار توی یک سیستم مجازی تستش کن ببین بازم مشکل همینه؟
تو حالت مجازی مشکلی نداره ولی اینو باید درستش کنم
نقل قول: کامپایل کرنل ۳۲ بیتی روی سیستم ۶۴ بیتی
این قضیه یه قلق کوچولو هم توی کامپایل و هم توی کدینگ داره. کدهای مربوط به سیستم عامل من رو نگاه بکن دستگیرت میشه مشکل از کجاست. این قضیه کامپایل اول یکم اذیت کننده هست. اما بعدش دیگه آسونترین مرحله میشه. بهتره از گراب هم بجای بوت لودر خودت استفاده کنی. قبل از هر کار دیگه پیشنهاد می کنم موارد زیر رو کامل مطالعه کنی وگرنه بازم مثل من چند ماه درجا میزنی و بعدش متوجه میشی چه خبره:
۱. استاندارد مولتی بوت رو حتما کامل بخون. درمورد اون و گراب توی نت سرچ بزنی راهنماهای زیادی وجود داره.
۲. در مورد GCC خوب مطالعه کن. (بشدت کتاب GCC complete refrence رو پیشنهاد میکنم. ) این کتاب میتونه چندین ماه شما رو جلو بندازه. (مخصوصا قسمت ابزارها)
مورد دیگه اینه که مثل بالا سعی نکنین از کدهای آماده روی نت استفاده کنین. چون در مورد C و سیستم عامل بر عکس عمل میکنه. (توی این مورد هر کس یه سلیقه ای داره و توی یه بازه زمانی متفاوتی کد رو نوشته که شرایط نرم افزاری و سخت افزاری زمانش با شما متفاوت بوده.). مثلا در مورد کد بالا سعی شده که یه پشته جدید ساخته بشه که به نظر من کار اشتباهی هست. اینکار باید تحت نظارت کامل کد سی باشه. و یا سعی شده که هدر مولتی بوت اول فایل باشه با اینکه هیچ تظمینی براش وجود نداره و اسکریپت کامپایل باید این موضوع رو مشخص کنه. در مورد قسمت entry به شکل ۱۰۰ درصد مطمئن هستم که کدهای کامپایل شما با منبعی که استفاده کردین متفاوت هست. دلیلش هم اینه که منبعی که استفاده کردین ترتیب متفاوتی رو توی کامپایل و لینک رعایت کرده و در نتیجه منجر شده که گراب نتونه فایل هسته شما رو شناسایی کنه. این مساله مربوط به استاندارد مولتی بوت هست. من حدود چند ماه خودم درگیر این قضیه بودم.
نقل قول:
برای کامپایل از کد های زیر استفاده میکنم ولی خطا میده
همیشه یه Makefile بنویس. اینجوری بخوای کار کنی پیر میشی.
نقل قول: کامپایل کرنل ۳۲ بیتی روی سیستم ۶۴ بیتی
ممنون پویا سعی میکنم توصیه هاتو عملی کنم
نقل قول: کامپایل کرنل ۳۲ بیتی روی سیستم ۶۴ بیتی
سلام
هنگام کامپایل با gcc از گزینه m32 استفاده کن. به این صورت:
gcc -m32 -Wall -O -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc -fno-builtin -I./include -c -o main.o main.c
نقل قول: کامپایل کرنل ۳۲ بیتی روی سیستم ۶۴ بیتی
نقل قول: کامپایل کرنل ۳۲ بیتی روی سیستم ۶۴ بیتی
مشکل کامپایلم حل شد ولی باز به یه مشکل دیگه برخوردم
وقتی از کد زیر استفاده میکنم هیچ مشکلی نیست
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++]);
}
}
نقل قول: کامپایل کرنل ۳۲ بیتی روی سیستم ۶۴ بیتی
تابع putch هم بصورت زیر تعریف میشه:
putch(char ch);