نمایش نتایج 1 تا 13 از 13

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

  1. #1
    کاربر دائمی آواتار yassersajjadi
    تاریخ عضویت
    بهمن 1390
    محل زندگی
    مشهد
    پست
    104

    Question کامپایل کرنل ۳۲ بیتی روی سیستم ۶۴ بیتی

    سلام
    من تازه دارم با لینوکس کار میکنم
    با اسمبلی و سی یک کرنل ساختم - بوت لودرم کامل کار میکنه ولی توی نقطه ورود به سی مشکل داره فایل کرنل که با سی نوشته شده کار نمیکنه
    خودم تصور میکنم بخاطر سیستم ۶۴ بیتی من باشه و باید از یه کامپایلر ۳۲ بیتی استفاده کنم ولی نمیدونم چطوری
    کلا یه بوت لودر دارم که یه فایل به نام 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 پیدا میکنه ولی نمیتونه اجراش کنه
    راهنمایی کنید لطفا - شاید مشکل جای دیگه باشه

  2. #2

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

    بوت لودرت چيه؟

  3. #3
    کاربر دائمی آواتار yassersajjadi
    تاریخ عضویت
    بهمن 1390
    محل زندگی
    مشهد
    پست
    104

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

    بوت لودرو خودم نوشتم
    از گراب هم استفاده کردم فایده ای نداشت

  4. #4
    کاربر دائمی آواتار yassersajjadi
    تاریخ عضویت
    بهمن 1390
    محل زندگی
    مشهد
    پست
    104

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

    از گراب که استفاده میکنم میگه فرمت وارد شده صحیح نیست

  5. #5
    کاربر دائمی آواتار yassersajjadi
    تاریخ عضویت
    بهمن 1390
    محل زندگی
    مشهد
    پست
    104

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

    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$

  6. #6
    کاربر دائمی آواتار joker
    تاریخ عضویت
    بهمن 1381
    محل زندگی
    اصفهان
    سن
    42
    پست
    1,326

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

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

  7. #7
    کاربر دائمی آواتار yassersajjadi
    تاریخ عضویت
    بهمن 1390
    محل زندگی
    مشهد
    پست
    104

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

    نقل قول نوشته شده توسط joker مشاهده تاپیک
    یکبار توی یک سیستم مجازی تستش کن ببین بازم مشکل همینه؟
    تو حالت مجازی مشکلی نداره ولی اینو باید درستش کنم

  8. #8

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

    این قضیه یه قلق کوچولو هم توی کامپایل و هم توی کدینگ داره. کدهای مربوط به سیستم عامل من رو نگاه بکن دستگیرت میشه مشکل از کجاست. این قضیه کامپایل اول یکم اذیت کننده هست. اما بعدش دیگه آسونترین مرحله میشه. بهتره از گراب هم بجای بوت لودر خودت استفاده کنی. قبل از هر کار دیگه پیشنهاد می کنم موارد زیر رو کامل مطالعه کنی وگرنه بازم مثل من چند ماه درجا میزنی و بعدش متوجه میشی چه خبره:

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


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

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

  9. #9
    کاربر دائمی آواتار yassersajjadi
    تاریخ عضویت
    بهمن 1390
    محل زندگی
    مشهد
    پست
    104

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

    ممنون پویا سعی میکنم توصیه هاتو عملی کنم

  10. #10
    کاربر جدید
    تاریخ عضویت
    مهر 1387
    محل زندگی
    اروميه
    پست
    15

    Post نقل قول: کامپایل کرنل ۳۲ بیتی روی سیستم ۶۴ بیتی

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

  11. #11
    کاربر دائمی آواتار yassersajjadi
    تاریخ عضویت
    بهمن 1390
    محل زندگی
    مشهد
    پست
    104

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

    مشکل کامپایلم حل شد
    آخرین ویرایش به وسیله yassersajjadi : دوشنبه 06 شهریور 1391 در 14:48 عصر

  12. #12
    کاربر دائمی آواتار yassersajjadi
    تاریخ عضویت
    بهمن 1390
    محل زندگی
    مشهد
    پست
    104

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

    مشکل کامپایلم حل شد ولی باز به یه مشکل دیگه برخوردم
    وقتی از کد زیر استفاده میکنم هیچ مشکلی نیست
    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++]);
    }
    }

  13. #13
    کاربر دائمی آواتار yassersajjadi
    تاریخ عضویت
    بهمن 1390
    محل زندگی
    مشهد
    پست
    104

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

    تابع putch هم بصورت زیر تعریف میشه:

    putch(char ch);

تاپیک های مشابه

  1. فوری: اجرای asp classic بر روی ویندوز 64 بیتی xp
    نوشته شده توسط هواشناس در بخش Classic ASP
    پاسخ: 0
    آخرین پست: پنج شنبه 16 دی 1389, 10:24 صبح
  2. سیستم 32 بیتی یا 64 بیتی
    نوشته شده توسط نغمه در بخش الگوریتم، کامپایلر، هوش مصنوعی و ساختمان داده ها
    پاسخ: 1
    آخرین پست: جمعه 21 آبان 1389, 13:10 عصر
  3. مشکل فوری..........ارتباطsql با vb.net2008 در سیستم 64 بیتی
    نوشته شده توسط yalda night در بخش VB.NET
    پاسخ: 1
    آخرین پست: پنج شنبه 20 خرداد 1389, 13:14 عصر
  4. نصب اس کی ال سرور 2000 رو سیستم 64 بیتی
    نوشته شده توسط Rocker در بخش SQL Server
    پاسخ: 2
    آخرین پست: شنبه 17 مرداد 1388, 02:34 صبح
  5. نصب sqlexpress بر روی ویستا 64 بیتی
    نوشته شده توسط rnm123 در بخش SQL Server
    پاسخ: 2
    آخرین پست: یک شنبه 23 فروردین 1388, 22:42 عصر

برچسب های این تاپیک

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •