اطلاعیه

Collapse
No announcement yet.

طراحی سیستم عامل - قدم به قدم

Collapse
X
 
  • Filter
  • زمان
  • Show
Clear All
new posts

  • طراحی سیستم عامل - قدم به قدم

    نوشتن سیستم عامل - نوشتن یک سیستم عامل - برای نوشتن یک سیستم عامل به چه چیزی نیاز است ؟
    خیلی وقت بود تصمیم گرفته بودم که شروع کنم به یاد گیری ساخت یک سیستم عامل شاید به قدمت 15الی 20 سال ، همیشه فکر میکردم کار من نیست ، نمیشه ، گاو نر میخواد و الی آخر....
    همیشه هم همین رابه خودم گفتم که اینقدر طول کشید
    این چند وقت کتابهای زیادی در مورد سخت افزار و درک مطلب کارکرد سخت افزاری کامپیوتر خوندم
    که سه تا از اصلیها که یه کم فکرم را اصلاح کرد
    کتاب کرنل بی درنگ نوشته جین لبروس ( ترجمه فرزاد شکاری زاده ، انتشارات نص بود که مبحث راه اندازی یک سیستم عامل بر روی میکروکنترلرها بود
    و دومی کتاب اصول میکروکامپیوترها نوشته علیرضا رضائی انتشارات آیلار)
    سومی هم مرجع کامل الکترونیک بود که هی فکر نکنم چرا حالا این کلیده روشن شد (زیادی رفتم از پایه )
    الانم دارم اسمبلی برادر جعفر نژاد قمی را میخونم ( اگه وقت کنم )


    بعد از نوشتن اولین بوت لودر ، دیدم نه ، انگار میشه ، منتها باید هم کشید و قدم اول را برداشت...
    از امروز شروع کردم به خوندن مطالب مربوطه روی اینترنت ، و همزمان( به فاصله زمانی کم) هم شروع میکنم به آموزش در اینجا ، میدونم به من مجال نمیده که یه غلط درست حسابی بکنم ولی میدونم جونترهایی هستند که یه روزی این تاپیک براشون بشه سکوئی برای ساخت اون چیزی که من سالهاست به فکرشم و میکروسافت سالهاست ساخته ...

    خب این حرفها را که نوشتم مقدمه ای بود بر مقدمه ( این جمله یعنی شروع از قبل از شروع )


    اول
    زبانهایی که برای نوشتن یک سیستم عامل نیاز هست اسمبلی هست و بعد سی
    اسمبلی که پایه ترین زبان هست و برای استارت کار حتما نیاز بهش داریم ، چرا ؟
    چون سیستم عامل برای لود شدن نیاز به یک بوت لودر داره ، بوت لودر چیه ؟
    بوت لود کدیست که در محلی از هارد دیسک(یا هرچی تو این مایه Cd-rom-Flopy-FlashMemory ) هست که در اولین سکتور این دیوایس نوشته میشه و چه بخواهین چه نخواهین حداکثر حجمی که قابل برنامه نویسی هست فقط 512 بایت هست
    در پرانتز : بوت لودر یک امضاء دارد که در فرمت هگز به شکل 55AA نوشته میشه ، یعنی عملا شما بوت لودرتون باید درکمتر از 512 بایت نوشته بشه ( خیلی کم هست ولی خب علت داره ، علتش چیه ؟
    وقتی کامپیوتر بوت میشه ، ROM Bios که در واقع اولین کدی هست که اجرا میشه میاد روی دیوایس ها میگرده ببینه که آیا بوت ایبل هست یا نه( همان تنظیمی که توی ستاپ میکنید برای معرفی First Boot) ، و این اتفاق فقط روی 512 بایت اول که در واقع برابر حجم هر سکتور یک فلاپی دیسک هست انجام میشه
    پس تا اینجا منظور این بوده که وقتی کامپیوتر ریست میشه ، بایوس میاد و اولین سکتور از هارد را میخونه و میخواد که اجراش کنه ! همین
    (عکس ضمیمه )

    پس نیاز داریم که با کامپایلری کار کنیم که اولا 16 بیتی را ساپورت کنه دوما مینیمم حجم را اشغال کنه ، پس از C نمیتونیم استفاده کنیم چون حداقل فایلی که تحویل میده حجمش بیشتر از این حرفاست
    ویکی دیگه از دلایل اینه که فایلهای خروجی سی به علت ساختاری که دارند (PE) از همون بایت اول اجرائی نیستند ، و ما در بوت سکتور از همان بایت اول باید دست و آستین بالا بزنیم چون چیزی برای شناختن فرمت فایلها و غیره اصلا وجود نداره.
    *** اديت شد : با سي هم ميشه

    خب ممکنه سوال پیش بیاد که چرا همه سیستم عامل را با اسمبلی نمینویسیم ؟ سی یک زبان سطح بالا هست و برنامه نویسی باهاش راحت تره و به علاوه بسیاری از دستورات را به صورت کتابخانه های آماده در اختیارمون میذاره ، پس وقت ، که همون طلاست را بیخودی نباید با نوشتن کدهای اسمبلی هدر بدیم ( البته در نهایت برای طراحی بیس یک سیستم عامل نیاز فراوانی به اسمبلی داریم )
    پس اول یک برنامه اسمبلی مینویسم که سیستم اصطلاحا بوت بشود و بعد درونش در واقع یک JUMP میکنیم به محلی که قراره Kernel اصلی سیستم عامل قرار داره برای اجرا به قول معروف Entry Point ، از اینجا به بعد دیگه محدودیتی به نام 512 بایت نداریم دیگه...
    ( مثلا برای ویندوز ما NTLDR را داریم)
    مورد توجه نویسندگان بوت کیت ها

    ( خلاصه با هرچیزی میشه نوشت با سی یا بورلند سی یا فری بیسیک یا هر کوفت وزهر مار دیگه ای که میشه برنامه های 32بیتی مستقل نوشت )
    (با برنامه هایی که تحت ویندوز الان دارند کارمیکنند و از API ها استفاده میکنند و...اشتباه نشه )

    پس در واقع ما برای اینکه یک سیستم عامل 32 بیتی داشته باشیم ، نیاز به مخلوطی از 16 بیتی و 32 بیتی داریم .

    خب ما نیاز داریم به دونستن یکسری مطالب پایه مثل اشاره گرها ، آدرس های فضای فیزیکی ،تخصیص حافظه ،و....

    ایشالا اگه زنده موندم بقیه اش بعداز برگشت از بندر انزلی

    در همین حین شما برای اینکه بیکار نمونید ابزارهائی که در آینده نیاز دارید را دانلود کنید
    NASM
    Pcopy
    VFD
    Bochs
    Visual Studio 2005
    C++
    HxD Hex Editor
    لینک ندادم توضیح هم ندادم که بیکار نمونید ، برگشتم دیدم دانلود نکردین ، خب خودم با ذکر توضیحات آپلود میکنم ;)

  • #2
    این قسمت هم یکسری تعاریف اولیه را کامل میکنم و بعد دیگه...... ( حتی ممکنه جائیش را اشتباه بگم ، چاره ای نیست خودمم تازه شروع کردم ،ادعایی نیست ، شما ها هم خودتون کمک کنید تصحیح بشه خطاهای نوشتاری و درک مطلبی و... )

    Pointer : یا اشاره گرها ، در واقع کارشون اینه که قسمتی از حافظه را به شما معرفی میکنند و در اختیار شما میگذارند ، چون در حالت معمولی خدا میدونه اطلاعات کجای حافظه سخت افزار PAS قراره ریخته بشه ! پس به واسطه متغییر از جنس اشاره گرها کلی کارمون راه می افته ، البته همونقدر که خوبه ، اگر هم درست آدرس دهی ها تعریف نشه همونقدر این اشاره گرها ممکن هستند گیج بزنند.

    کد PHP:
    charpointer
    PAS چیه؟ Physical Address Space فضای آدرس سخت افزاری ! فکر کنید یه جائی توی ramکامپیوتر هست ( البته حافظه سخت افزاری حتی میتونه این روزها روی کارت گرافیک یا هر دیوایس دیگه هم عنوان بشه ، فعلا کاریش نداریم )

    IVT
    Interrupt Vector Table یا جدول بردار وقفه ، که هر زمان وقفه ای رخ بده سیستم میاد از این جدول مکانی که آدرس اجرای پروسه مربوط به اون وقفه هست را پیدا میکنه و برای ادامه به اونجا منتقل میشه ( معمولا قبلش از رجیسترهای حافظه یک کپی در پشته میگیره (push کردن) که بعدا توضیح میدم. ( نکته ما یک جدول بردار وقفه سخت افزاری داریم ، و یک جدول وقفه نرم افزاری DOS که مال سیستم عامل داس هست وتوی اکثر کتابهای آموزشی از این جدول داس استفاده کردن که خودش یک سیستم عامل جدا هست برای خودش ، گفتم گیج نشین بعدا" )

    مورد بعدی Dynamic Memory Allocation هست یا تخصیص حافظه پویا
    که احتمالا قبلا توابع مربوطه را دیدین malloc() - free() - new - delete
    کارشون این هست که بلوکی از حافظه را برای شما نگه میدارن ما در سیستم هایی که از پایه نوشته میشن ( سیستم عامل ) با این قضیه استفاده بهینه از حافظه ، تخصیص حافظه ، آزاد کردن حافظه بلا استفاده و اینها خیلی کار داریم. توجه کنید در موقع نوشتن سیستم عامل دستمون اونقدرها هم باز نیست که هر غلطی دلمون خواست بکنیم

    مورد بعدی استفاده از دستورات اسمبلی در دیگرزبانهایی هست که قراره برای توسعه استفاده کنید به قول خودشون " Inline Assembly "

    مثلا در زبان سی وقتی میخواهیم اسمبلی بنویسیم اینطوری شروع میکنیم:
    مثال
    کد:
    _asm cli ; disable interrupts
    یا اگر بیشتر از یک دستور داشته باشیم از بلوک ها استفاده میکنیم
    کد:
    _asm {
    	cli
    	hlt
    }
    خب و مورد بعدی که باید یه توضیحی در مورد بدم RTL هست
    Standard Library and the Run Time Library
    استفاده از کتابخانه های برنامه نویسی که قبلا آماده شده ، مثلا دیگه نیاز نیست دستور printf() را بشینیم با اسمبلی بازنویسی کنیم ، یک کلمه مینویسیم اسم تابع را میریم پی کارمون
    اینطوری میشه گفت حدود 90% از سیستم عامل کذائ که قراره نوشته بشه را از توابع آماده موجود از قبل استفاده میکنیم.

    خب و اما یه بحث که یه کم میایم توی عمل ( با اون عمل پای منقل فرق میکنه ، معتادای بی جنبه )
    Debug و خطایابی
    خب اگه قرار باشه هربار که کدی برای سیستم عامل مینویسیم ، یکبار سیستم را ریست کنیم که نه تنها خاروماٍدر سیستم را مورد عنایت قرار میدیم بلکه کلی از وقتمون را هم هدر میدیم
    اینجا برای تستها از یه ابزاری به نام Bochs استفاده میکنیم ، یه چیزی شبیه به VMWare هست ولی خب راحت تر و سریعتره... ( از هر نرم افزار دیگه ای هم میتونید استفاده کنید مثلا vpc میکروسافت یا .... هرکی هرچی دوست داره )
    ببینم اصلا دانلود کردین اون لیستی که صفحه قبل نوشتم ؟
    نه کون گشاد که از این اجازه ها نمیده


    لینک دانلود Bochs : http://Www.ALT.ir/os/Bochs-2.4.5.exe
    نرم افزار جالبیه برای تستهای نوشتن یک سیستم عامل ( دلم به حال بیل گیتس اون زمانهایی که این شبیه سازها نبوده میسوزه )
    ِ

    میکروسافت ویندوز - ورژن 1 به سنه 1985

    Comment


    • #3
      خب بریم برای مباحث شیرین تر
      اصلا سیستم عامل چیه ؟ اینا را چرا مینویسیم؟ هدفمون چیه از داشتن یک به اصطلاح سیستم عامل؟
      همه این کارها برای اینه که بتونیم این کامپیوتر دیجیتاله زبون نفهم را یه جوری رامش کنیم که کاربر بتونه باهاش ارتباط برقرار کنه و ازش کار بکشه ( نمونه هم که دیگه نیاز نیست مثال بزنم؟ ویندوز ، لینوکس ، مکینتاش و.... ) این که چرا خودمون میخوایم شروع کنیم به یادگیری هم که تکلیفش معلومه...
      سیستم عامل یک نرم افزار نیست ، در واقع مجموعه ای از نرم افزارها هستند در کنار هم
      زبانهای رایج برای توسعه سیستم عامل هم معمولا c++ و اسمبلی 80x86 هستند ( معمولا)
      البته با زبانهای دیگه هم میشه ولی خب کار سخت تر میشه احتمالا
      منابع خارجی برای آموزش سی :
      cprogramming.com
      Thinking in C++
      و.... منبع آموزشی به تعداد موهای سر خودتون توی اینترنت هست ، فت و فراوون.

      زبان اسمبلی هم که مناسب ترین زبان هست که میتونه با سخت افزار در پائین ترین سطح ارتباط برقرار کنه هم آموزش زیاد هست ( البته فهمش برای من یکی که همیشه سخت بوده )
      مثلا خارجکی ها :
      Assembly Language: Step by Step
      Art of Assembly
      ولی کلا این لینک دومیه جالبه ، یه جورائی گرافیکش را قبلا توی آموزشهای اسمبلی ندیده بودم، حتما ببینید
      خب از ابزاری که لازم داریم مهمترینش NASM هست ، یک کامپایلر اسمبلی ،
      http://www.nasm.us
      هم پیج های دولوپرهاش را هم ببینید ، هرکدومشون ماشالا پروژه های جالبی را اجرا کردند.
      نکته اینه که این کامپایلر برای ما ترجیح داره به توربو اسمبلی و میکروسافت اسمبلی _ TASM - MASM به علت اینکه هم 16 بیتی فلت را ساپورت میکنه هم 32 بیتی و هم 64 بیتی !!
      به قول خودش :
      64-bit (x86-64/x64/AMD64/Intel 64) Support Is Here!!!
      البته روی سورس فورج هست و این بی پدر مادرها هم که با ip ایران مشکل دارند
      دانلود NASM : http://www.ALT.ir/os/nasm-2.09.04-installer.exe

      ابزار بعدی که نیاز داریم
      Microsoft Visual C++ 2005 or 2008
      کد نویسی توی محیط ویژوال ، مورد توجه اون دوستمون ;)
      نسخه های جدید را از اینجا : http://www.microsoft.com/express/Downloads میتونید دانلود کنید و نسخه 2005 اون را از اینجا دانلود کنید
      http://www.microsoft.com/downloads/e...displaylang=en

      البته همچنان محدود به اینها نیستید ، از GCC یا DJGPP یا Mingw یا Pelles یا... هم میتونید استفاده کنید
      خودم هم بعضی از این کامپایلرها را برای اولین بار توی عمرم بود که اسمشون را خوندم..!!!
      اما به نظر میاد انجین همشون یکی باشه ، قیافه هاشون (IDE )را قشنگ طراحی کردند.

      خب یکی دیگه از ابزارهایی که گفتم دانلود کنید و میدونم نکردید "پارت کپی" هست ، کارش چیه؟ کارش کپی کردن فایل بوت لودر هست در اولین سکتور هارد ( یا فلش مموری یا ایمیج یا رم درایو یا ...)
      خواستید از اینجا میتونید دانلود کنید : http://www.ALT.ir/os/pcopy02.zip
      البته ابزارهای دیگه هم برای این کار هستند که بعدا بهشون میرسیم ، اما این حجمی نداره ، 10 کیلوبایت دانلود کنید ضرری نداره
      مثلا از Debug خود ویندوز هم میشه برای کپی کردن اطلاعات روی بوت سکتور استفاده کرد
      کد:
      C:\>debug boot_loader.bin
      -w 100 0 0 1
      -q
      ابزار بعدی که بهش نیاز داریم ( برای راحتی کار )
      VFD - Virtual Floppy Drive
      از اینجا دانلود کنید ( بعدا آموزشش را موقع کار مینویسیم ، البته یادگیریش سخت نیست !)
      http://www.ALT.ir/os/VFD.zip
      برنامه خیلی خوبیه برای ساخت یک فلاپی دیسک مجازی که بوت لودری که بعدا مینویسیم را بتونیم روش رایت کنیم و تستهامون را خیلی سریع بگیریم... همه مدل فرمتی را هم قبول میکنه
      البته یهو دلتون بخواد CD بوت ایبل بسازید ، اونم غمی نداره با MAgicISO میتونید.

      به طور خلاصه مراحل استفاده از ابزارهای معرفی شده در بالا این میشه که
      1- تنظیمات اولیه لازم برای شروع کار
      شامل ساخت فلاپی مجازیVFD و داشتن یک ماشین مجازی Bochs
      2- بوت لودر
      شامل برنامه نویسی به زبان اسمبلی و کامپایلش با NASM و کپی کردن برنامه کامپایل شده روی بوت سکتور مثلا با PartCopy یا Debug یا HxD Hex Editor یا...
      3-نوشتن کرنل
      با استفاده از زبانهای سطح بالائی که معرفی شد مثلا c++ یا هرچی دیگه
      و کپی فایل نهائی روی فلاپی دیسکت
      4- تست کارکرد
      Bochs Emulator را هم که پست قبلی لینک دادم حتما دانلود کنید

      Comment


      • #4
        برای داشتن یک سیستم عامل در حد قابل قبول نیاز داریم به
        Memory Management - مدیریت حافظه
        Program Management - مدیریت برنامه ها
        Multitasking - چند وظیفه ای یا اجرای همزمان چند پروسه
        Memory Protection - حفاظت از خرابی حافظه
        Multiuser - پشتیبانی از یک یا چند اپراتور سیستم
        Kernel - هسته اصلی سیستم عامل برای مدیریت بقیه گزینه ها
        File System - یک فایل سیستم برای کار کردن با فایلها
        Command Shell - رابط خط فرمان
        Graphical User Interface - یک محیط گرافیکی جایگزین خط فرمان
        Bootloader - و بوت لودر که به زودی میریم سراغش

        حتما تاریخچه سیستم عامل ها را میدونید ، اول فقط تک وظیفه ای و خط فرمانی مثل داس بودند ، بعد به صورت مولتی تسک در اومدن و حالا به صورت گرافیکی و و چند هسته ای و و و و .... پس انتظار زیادی از خودمون فعلا نداشته باشیم

        خب امیدوارم تمام مطالب 3 تا پست قبلی را هم خوب خونده باشین( خط به خط ) چون "الف" کار طراحی سیستم عامل و نیازهای ابتدائی بودن ...

        پیوست
        امشب چشام درد میکنه و حال تایپ زیاد نداشتم ،ایشالا کارا خوب پیش بره دو جلسه آینده میرسیم به کلاس عملی

        Comment


        • #5
          خب.....
          ساده ترین کد که قاطی این بوت لودرهای آموزشی کف اینترنت دیدم اینه و امشب اولین بوت لودر را مینویسم و کامپایل میکنیم و تست و اجرا میکنم.
          کد:
           
          org		0x7c00				; We are loaded by BIOS at 0x7C00
           
          bits	16					; We are still in 16 bit Real Mode
           
          Start:
           
          	cli					; Clear all Interrupts
          	hlt					; halt the system
          	
          times 510 - ($-$$) db 0				; We have to be 512 bytes. Clear the rest of the bytes with 0
           
          dw 0xAA55					; Boot Signiture
          خب خطوط نوشته شده هرکدوم چه معنی میدن ؟
          کد:
          org		0x7c00				; We are loaded by BIOS at 0x7C00
          فایلهای com پیش فرض در آدرس 100 هگز بارگذاری میشوند ، ولی به صورت استثنا در بوت لودرها باید به کامپایلر بگیم که فایل در آدرس 0x7C00 قراره اجرا بشه ، چون بایوس و cpu به صورت قراردادی میدونن که برنامه بوت باید از این آدرس شروع بشه و اولین نقطه ای که میره میخونه اینجاست
          البته یک روش دیگه هم هست که خب نهایتا به همین جا ختم میشه
          کد:
          [ORG 0]
          
                      jmp 07C0h:start     ; Goto segment 07C0
          
              start:
                      ; Update the segment registers
          خب خط بعدی برنامه چی میگه ؟
          کد:
          bits	16					; We are still in 16 bit Real Mode
          این به کامپایلر میگه این فایلی که قراره تحویلمون بده یک فایل باینتری 16 بیتی هست

          تکلیف Start:
          هم که مشخصه ، شروع
          کد:
          CLI
          hlt
          CLI به معنی Clear کردن یا پاک کردن تمام اینتراپتهای سخت افزاری هست که ممکنه رخ بده
          ( از فشار دادن صفحه کلید گرفته تا هر اتفاق سخت افزاری روی تجهیزات کامپیوتر که به مادربرد متصل هستند)
          خط بعدی هم سیستم را به حالت Halt میبره ، همون هنگ کردم خودمون ، به معنی توقف سیستم.
          کد:
          times 510 - ($-$$) db 0
          خب گفتیم هر سکتور 512 بایت هست... و 2 باید اون هم 55 AA امضاء بوت سکتور بودن هست
          یعنی 510 بایت
          پس ما با این دستور میایم فاصله بین کد بوت تا رسیدن به امضاء را با 00 پرمیکنیم ( کامپیوتر در این مرحله شعورش نمیرسه و ممکنه هر دیتایی که اینجا از قبل نوشته شده باشه را بخونه و قصد اجراشون را داشته باشه )
          کد:
          dw 0xAA55
          خط آخر هم امضاء بوت سکتور هست ( اگه این نباشه ، بایوس نبفهمه که این سکتور ( با استفاده از اینتراپت 19 این کار را میکنه )، سکتور بوت هست و فکر میکنه الکی بهش معرفی کردین که این دیوایس یک بوت سکتور داشته )
          خب NASM را که لینکش را دادم را نصب کنید و فولدری که نصب شده را پیدا کنید
          پیش فرض » Program Files\nasm
          یک فایل با پسوند .asm در کنارش بسازید و کد بالا را توش کپی کنید ( مثلا boot1.asm)
          و بعد در خط فرمان وارد بشید CMD
          کد:
          nasm -f bin Boot1.asm -o Boot1.bin
          اگه همه چیز درست باشه یک فایل با پسوند .bin برای شما ساخته میشه
          خب حالا نرم افزار VFD را اجرا کنید و یک فلاپی مجازی بسازید

          خب برنامه PartCopy را هم که لینکش را دادم با این خط دستور اجرا کنید
          کد:
          partcopy Boot1.bin 0 200 -f1
          معنیش چیه ؟
          اولین پارامترش اسم فایل هست را در
          دومین پارامتر میگه از بایت x شروع کن
          تا سومین پارامتر بایت Y ( که اینجا 200 هست و در مبنای دسیمال همون 512 میشه ) در درایور f0 که برابر هست با A: یا f1 که برابر هست با B: کپی کن
          خب بعد از این کار میتونید در برنامه VFD فلاپی مجازی که در ram ساختین و تبدیل به بوت هم شده را SAVE کنید و از این بوت ، یک ایمیج بوت ایبل همیشه داشته باشید
          خب پس سیوش میکنیم مثلا به اسم test.img
          دیگه میتونید VFD را هم ببندید.
          خب برنامه Bochs را اجرا کنید ،
          طبق عکس جلو برید

          و بعد هم کلید start
          یه چیزی به این شکل میبینید


          خب حالا شما اولین بوت لودر خودتون را نوشتید و کامپایل کردید و اجرا هم کردید ( البته الان هیچ غلطی نمیکنه )
          در ادامه روش نوشتن و استفاده از kernel ایشالا...

          پیوست : یه بنده خدائی هست که یه سیستم عامل نوشته به اسم آراکس ، مطالب خوبی روی سایت برنامه نویس در این مورد بوت و سیستم عامل منتشر کرده که جا داره تشکر کنم ازش ( هرچند که فکر نمیکنم اینجا آیدی داشته باشه http://osdever.blogfa.com )
          پیوست 2: یک لینک برای مطالعه در زمانهای بیکاری ;) : http://www.nondot.org/sabre/os/articles/ProtectedMode/

          فایل های پروژه ضمیمه
          فایل های پیوست شده

          Comment


          • #6
            خب امشب میرسیم به سوال قبلی من در اینجا
            اینکه یک دیسکت بوت ایبل داریم ولی توی ویندوز که میخوایم بازش کنیم میگه فرمت نشده!
            برای این منظور یه چیزی داریم به اسم بلوک OEM که یکسری مشخصات درایو توی اون نوشته شده
            کد:
            bpbBytesPerSector:  	DW 512
            bpbSectorsPerCluster: 	DB 1
            bpbReservedSectors: 	DW 1
            bpbNumberOfFATs: 	    DB 2
            bpbRootEntries: 	    DW 224
            bpbTotalSectors: 	    DW 2880
            bpbMedia: 	            DB 0xF0
            bpbSectorsPerFAT: 	    DW 9
            bpbSectorsPerTrack: 	DW 18
            bpbHeadsPerCylinder: 	DW 2
            bpbHiddenSectors: 	    DD 0
            bpbTotalSectorsBig:     DD 0
            bsDriveNumber: 	        DB 0
            bsUnused: 	            DB 0
            b***tBootSignature: 	DB 0x29
            bsSerialNumber:	        DD 0xa0a1a2a3
            bsVolumeLabel: 	        DB "MOS FLOPPY "
            bsFileSystem: 	        DB "FAT12   "
            اسامیش تقریبا مشخصه که هرکدوم کارشون چیه
            منم کاری به کارشون ندارم و عینا توی برنامه استفاده میکنم به اضافه اینکه امشب میخوایم علاوه بر اینکه بوت شد یه غلط کوچیک هم بکنه ، یعنی نمایش یک کاراکتر بعد از بوت شدن سیستم
            کد:
            ;*********************************************
            ;	Boot1.asm
            ;		- A Simple Bootloader
            ;
            ;	Operating Systems Development Tutorial
            ;*********************************************
            
            bits	16							; We are still in 16 bit Real Mode
            
            org		0x7c00						; We are loaded by BIOS at 0x7C00
            
            start:          jmp loader					; jump over OEM block
            
            ;*************************************************;
            ;	OEM Parameter block
            ;*************************************************;
            
            TIMES 0Bh-$+start DB 0
            
            bpbBytesPerSector:  	DW 512
            bpbSectorsPerCluster: 	DB 1
            bpbReservedSectors: 	DW 1
            bpbNumberOfFATs: 	    DB 2
            bpbRootEntries: 	    DW 224
            bpbTotalSectors: 	    DW 2880
            bpbMedia: 	            DB 0xF0
            bpbSectorsPerFAT: 	    DW 9
            bpbSectorsPerTrack: 	DW 18
            bpbHeadsPerCylinder: 	DW 2
            bpbHiddenSectors: 	    DD 0
            bpbTotalSectorsBig:     DD 0
            bsDriveNumber: 	        DB 0
            bsUnused: 	            DB 0
            b***tBootSignature: 	DB 0x29
            bsSerialNumber:	        DD 0xa0a1a2a3
            bsVolumeLabel: 	        DB "MOS FLOPPY "
            bsFileSystem: 	        DB "FAT12   "
            
            ;*************************************************;
            ;	Bootloader Entry Point
            ;*************************************************;
            
            loader:
            
            	cli			; Clear all Interrupts
            	hlt			; halt the system
            	
            times 510 - ($-$$) db 0		; We have to be 512 bytes. Clear the rest of the bytes with 0
            
            dw 0xAA55			; Boot Signiture
            خب اگه نگاه کنید میبینید که بلوک OEM وظیفه اجرائی نداره ، پس برنامه باید به محض اجرا از روش بگذره و به بره جائی که اجرائیه
            پس یک لیبل به اسم Loader: تعریف میکنیم و کد اجرائی را از اونجا به بعد مینویسم و اول برنامه هم مینویسم :
            کد:
            start:          jmp loader					; jump over OEM block
            JMP هم که توی اسمبلی به معنی خودشه دیگه ، جامپ کن ، بپر ...

            قبل از بلوک OEM هم یک خط داریم که نوشته
            کد:
            TIMES 0Bh-$+start DB 0
            اینو شما معنیشو بگین که چرا 11 بایت را برابر با 0 قرار میده؟!!!


            خب برای چاپ یک کاراکتر نیاز به اینتراپت 0x10 داریم
            پارامترهای این اینتراپت به این صورت هستند
            کد:
            AH = 0x0E
            AL = Character to write
            BH - Page Number (Should be 0)
            BL = Foreground color (Graphics Modes Only)
            ما اینجا میتونیم دوتای آخری را فاکتور بگیریم
            پس نتیجه میشه :
            کد:
            	xor	bx, bx		; A faster method of clearing BX to 0
            	mov	ah, 0x0e
            	mov	al, 'A'
            	int	0x10
            خط اول مقدار Bx را صفر میکنه
            خط دوم مقدار 0x0E را در رجیستر ah قرار میده
            خط سوم کاراکتری که میخواهیم چاپ بشه را در رجیستر al قرار میده و با فراخوانی اینتراپت 10 اون را روی صفحه نمایش میدیم
            کد نهائی میشه این :
            کد:
            ;*********************************************
            ;	Boot1.asm
            ;		- A Simple Bootloader
            ;
            ;	Operating Systems Development Tutorial
            ;*********************************************
            
            bits	16							; We are still in 16 bit Real Mode
            
            org		0x7c00						; We are loaded by BIOS at 0x7C00
            
            start:          jmp loader					; jump over OEM block
            
            ;*************************************************;
            ;	OEM Parameter block
            ;*************************************************;
            
            TIMES 0Bh-$+start DB 0
            
            bpbBytesPerSector:  	DW 512
            bpbSectorsPerCluster: 	DB 1
            bpbReservedSectors: 	DW 1
            bpbNumberOfFATs: 	    DB 2
            bpbRootEntries: 	    DW 224
            bpbTotalSectors: 	    DW 2880
            bpbMedia: 	            DB 0xF0
            bpbSectorsPerFAT: 	    DW 9
            bpbSectorsPerTrack: 	DW 18
            bpbHeadsPerCylinder: 	DW 2
            bpbHiddenSectors: 	    DD 0
            bpbTotalSectorsBig:     DD 0
            bsDriveNumber: 	        DB 0
            bsUnused: 	            DB 0
            b***tBootSignature: 	DB 0x29
            bsSerialNumber:	        DD 0xa0a1a2a3
            bsVolumeLabel: 	        DB "MOS FLOPPY "
            bsFileSystem: 	        DB "FAT12   "
            
            ;*************************************************;
            ;	Bootloader Entry Point
            ;*************************************************;
            
            loader:
            
            	cli			; Clear all Interrupts
            [B]
            	xor	bx, bx		; A faster method of clearing BX to 0
            	mov	ah, 0x0e
            	mov	al, 'J'
            	int	0x10[/B]
            
            	hlt			; halt the system
            	
            times 510 - ($-$$) db 0		; We have to be 512 bytes. Clear the rest of the bytes with 0
            
            dw 0xAA55			; Boot Signiture
            خب کامپایلش کنید و با دستور partcopy اون را روی فلاپی مجازی بریزید و ازش یک سیو بگیرید و با یک شبیه ساز که اینجا Bochs هست اجراش کنید
            از vmware میتونید استفاده کنید
            از فلاپی واقعی میتونید استفاده کنید
            حتی میتونید فلش مموری خودتون را هم به این صورت ویرایش کنید و اون را بوت ایبل کنید و با تنظیم دیسک بوت در Setup کامپیوترتون به صورت واقعی یک تست بگرید
            فایل های پیوست شده

            Comment


            • #7
              خب فقط الان یه توضیح کوتاه بدم در مورد چاپ رشته ها ( قاطی این آموزشها بود گفتم منم بنویسمشون)
              توی زبان استمبلی !( اسمبلی سابق) رشته ها را به این صورت تعریف میکنند :
              کد:
              msg	db	"Welcome to My Operating System!", 0
              و برای چاپ رشته میتونیم به این روش عمل کنیم
              کد:
              ;***************************************
              ;	Prints a string
              ;	DS=>SI: 0 terminated string
              ;***************************************
              
              Print:
              			lodsb
              			or			al, al				; al=current character
              			jz			PrintDone			; null terminator found
              			mov			ah,	0eh			; get next character
              			int			10h
              			jmp			Print
              PrintDone:
              			ret
              دستور lodsb کارش اینه که :
              LODSB Load byte at address DS:(E)SI into AL
              پس ما باید بنویسیم :
              کد:
              	mov	si, msg
              	call	Print
              یک مثال کامل :
              کد:
              ;*********************************************
              ;	Boot1.asm
              ;		- A Simple Bootloader
              ;
              ;	Operating Systems Development Tutorial
              ;*********************************************
              
              bits	16							; We are still in 16 bit Real Mode
              
              org		0x7c00						; We are loaded by BIOS at 0x7C00
              
              start:          jmp loader					; jump over OEM block
              
              ;*************************************************;
              ;	OEM Parameter block
              ;*************************************************;
              
              ; Error Fix 2 - Removing the ugly TIMES directive -------------------------------------
              
              ;;	TIMES 0Bh-$+start DB 0					; The OEM Parameter Block is exactally 3 bytes
              								; from where we are loaded at. This fills in those
              								; 3 bytes, along with 8 more. Why?
              
              bpbOEM			db "My OS   "				; This member must be exactally 8 bytes. It is just
              								; the name of your OS :) Everything else remains the same.
              
              bpbBytesPerSector:  	DW 512
              bpbSectorsPerCluster: 	DB 1
              bpbReservedSectors: 	DW 1
              bpbNumberOfFATs: 	    DB 2
              bpbRootEntries: 	    DW 224
              bpbTotalSectors: 	    DW 2880
              bpbMedia: 	            DB 0xF0
              bpbSectorsPerFAT: 	    DW 9
              bpbSectorsPerTrack: 	DW 18
              bpbHeadsPerCylinder: 	DW 2
              bpbHiddenSectors: 	    DD 0
              bpbTotalSectorsBig:     DD 0
              bsDriveNumber: 	        DB 0
              bsUnused: 	            DB 0
              b***tBootSignature: 	DB 0x29
              bsSerialNumber:	        DD 0xa0a1a2a3
              bsVolumeLabel: 	        DB "MOS FLOPPY "
              bsFileSystem: 	        DB "FAT12   "
              
              msg	db	"Welcome to My Operating System!  - shabgard.org ", 0		; the string to print
              
              ;***************************************
              ;	Prints a string
              ;	DS=>SI: 0 terminated string
              ;***************************************
              
              Print:
              			lodsb					; load next byte from string from SI to AL
              			or			al, al		; Does AL=0?
              			jz			PrintDone	; Yep, null terminator found-bail out
              			mov			ah,	0eh	; Nope-Print the character
              			int			10h
              			jmp			Print		; Repeat until null terminator found
              PrintDone:
              			ret					; we are done, so return
              
              ;*************************************************;
              ;	Bootloader Entry Point
              ;*************************************************;
              
              loader:
              
              	xor	ax, ax		; Setup segments to insure they are 0. Remember that
              	mov	ds, ax		; we have ORG 0x7c00. This means all addresses are based
              	mov	es, ax		; from 0x7c00:0. Because the data segments are within the same
              				; code segment, null em.
              
              	mov	si, msg						; our message to print
              	call	Print						; call our print function
              
              	xor	ax, ax						; clear ax
              	int	0x12						; get the amount of KB from the BIOS
              
              	cli							; Clear all Interrupts
              	hlt							; halt the system
              	
              times 510 - ($-$$) db 0						; We have to be 512 bytes. Clear the rest of the bytes with 0
              
              dw 0xAA55							; Boot Signiture
              فایل های پیوست شده

              Comment


              • #8
                یه کم توضیحات.

                حلقه ها یا Ring
                سیستم های نرم افزاری از چند حلقه تشکیل شده اند Ring0 که پائینترین سطح را داره ( سیستم عامل اینجاست ) و حلقه 2 و 3 که حلقه 3 یا rin3 سطحیه که کاربر توی اون قرار داره

                حلقه صفر بیشترین دسترسی به سیستم و همینطور دسترسی کم میشه تا برسه به سطح کاربر
                سیستم عامل قاعدتا باید بیشترین سطح دسترسی را به سیستم داشته باشه ، پس قاعدتا در حلقه صفر باید باشه
                تنها مرحله ای که ما نهایت محدودیت را داریم مرحله اول یا هموان بوت لودر هست که فضائی در حد 512 بایت داریم ( موجود در اولین سکتور دیسک ( سکتورصفر)) ، نه بیشتر و اسمبلی و زبانی که توش ساپورت میشه اسمبلی 16 بیتی هست ، پس برای رسیدن به یک سیستم عامل 32 بیتی باید یه نرم افزار واسط بنویسم (همان کرنل) یا مرحله دوم ( stage 2 )
                بعضی جاها خودشون را راحت کردند ، بهش گفتن بوت لودر دو مرحله ای
                پس ما برای اینکه به بقیه فضای دیسک بتونیم دسترسی داشته باشیم باید بتونیم بقیه سکتورها را بخونیم.
                خب پس ما نیاز داریم به وقفه ( اینتراپت ) ای که بتونه بره و دیسکت را بخونه و اطلاعاتشو به ما برگردونه این وقفه شماره 13 هست ( INT13 )
                پس اول باید دیسک را ریست کنیم ، چون نمیدونیم که موقع شروع ، سخت افزار دقیقاکجا بوده
                قبلا

                کد:
                .Reset:
                	mov		ah, 0					; reset floppy disk function
                	mov		dl, 0					; drive 0 is floppy drive
                	int		0x13					; call BIOS
                	jc		.Reset					; If Carry Flag (CF) is set, there was an error. Try resetting again
                INT 0x13/AH=0x0 - DISK : RESET DISK SYSTEM
                AH = 0x0
                DL = Drive to Reset

                Returns:
                AH = Status Code
                CF (Carry Flag) is clear if success, it is set if failure

                پس با این کد ما عملا هد خواندن از دیسک را میاریم در نقطه صفر قرار میدیم میکنیم. به عنوان یک نقطه مبنا و مبداءشروع.
                پس تا اینجا شد وقفه 13 با پارامتر Ah = 0 ( این یعنی ریست و اومدن به نقطه 0 واقعی )
                خب برای خوندن سکتورها یک فانکشن یا پارامتر دیگه که به این وقفه 13 بدیم ، زحمت خوندن سکتورها انجام میشه
                BIOS Interrupt (INT) 0x13 Function 0x02 - Reading Sectors

                INT 0x13/AH=0x02 - DISK : READ SECTOR(S) INTO MEMORY
                AH = 0x02
                AL = Number of sectors to read
                CH = Low eight bits of cylinder number
                CL = Sector Number (Bits 0-5). Bits 6-7 are for hard disks only
                DH = Head Number
                DL = Drive Number (Bit 7 set for hard disks)
                ES:BX = Buffer to read sectors to

                Returns:
                AH = Status Code
                AL = Number of sectors read
                CF = set if failure, cleared is successfull
                خب این
                سیلندر چیه ؟ کلا هد چیه ؟ سکتور چیه ؟
                شکل زیر را برای درک بهتر مسئله ببینید:

                هر Track معمولا به 512 قسمت تقسیم شده
                نکته : یک فلاپی دیسکت دارای 2 هد بیشتر نیست .
                اگه مقادیری زیادتر از حد بهش بدیم ، سیستم نبفهمه و قاط میزنه
                این از قسمتی مربوط به CH = Low eight bits of cylinder number

                در موردDH = Head Number هم با اینکه فلاپی دوتا هد داره ولی همیشه باید از هد شماره 0 استفاده بکنیم.

                در مورد DL = Drive Number (Bit 7 set for hard disks
                شماره درایوی هست که میخواهیم باهاش کار کنیم ، شماره 0 همیشه فلاپی یا همون A: هست
                شماره 1 معمولا به 5-1/4" Floppy drives. گفته میشه که الان دیگه جزو عتیقه جاته ولی خب هنوز توسط کامپیوترها به صورت یک سنت قدیمی ساپورت میشه

                یک کد مثال :
                کد:
                Reset:
                	mov		ah, 0					; reset floppy disk function
                	mov		dl, 0					; drive 0 is floppy drive
                	int		0x13					; call BIOS
                	jc		.Reset					; If Carry Flag (CF) is set, there was an error. Try resetting again
                 
                	mov		ax, 0x1000				; we are going to read sector to into address 0x1000:0
                	mov		es, ax
                	xor		bx, bx
                 
                .Read:
                	mov		ah, 0x02				; function 2
                	mov		al, 1					; read 1 sector
                	mov		ch, 1					; we are reading the second sector past us, so its still on track 1
                	mov		cl, 2					; sector to read (The second sector)
                	mov		dh, 0					; head number
                	mov		dl, 0					; drive number. Remember Drive 0 is floppy drive.
                	int		0x13					; call BIOS - Read the sector
                	jc		.Read					; Error, so try again
                 
                	jmp		0x1000:0x0				; jump to execute the sector!
                این کد کارش اینه که ، فلاپی را ریست کنه و فقط یک سکتور را بخونه ( سکتور شماره 2)

                قبلش یک مروری داشته باشیم بر روی بلوک OEM که در واقع راهنمای ما هست در خواندن سکتورها .
                کد:
                bpbBytesPerSector:  	DW 512
                bpbSectorsPerCluster: 	DB 1
                bpbReservedSectors: 	DW 1
                bpbNumberOfFATs: 	    DB 2
                bpbRootEntries: 	    DW 224
                bpbTotalSectors: 	    DW 2880
                bpbMedia: 	            DB 0xF0
                bpbSectorsPerFAT: 	    DW 9
                bpbSectorsPerTrack: 	DW 18
                bpbHeadsPerCylinder: 	DW 2
                bpbHiddenSectors: 	    DD 0
                bpbTotalSectorsBig:     DD 0
                bsDriveNumber: 	        DB 0
                bsUnused: 	            DB 0
                b***tBootSignature: 	DB 0x29
                bsSerialNumber:	        DD 0xa0a1a2a3
                bsVolumeLabel: 	        DB "MOS FLOPPY "
                bsFileSystem: 	        DB "FAT12   "
                ......
                اطلاعات بالا مربوط به FAT12 هست ( برای اطلاعات بیشتر نسبت به فت 32 و NTFS به سایت میکروسافت میتونید مراجعه کنید و بلوکoem های مربوطه را ببینید)
                این دوتا به چه معنی هست ؟
                کد:
                bpbBytesPerSector:  	DW 512
                bpbSectorsPerCluster: 	DB 1
                اولی میگه چه تعداد بایت در هر سکتور قرار داره و دومی هم میگه روی هر کلاستر چند سکتور هست


                کد:
                bpbReservedSectors: 	DW 1
                bpbNumberOfFATs: 	    DB 2
                اولی را همیشه 1 میزاریم چون ترجمه اش را متوجه نشدم منظورش چیه ، شما معنیشو بنویسید:
                A Reserved Sector is the number of sectors not included in FAT12. ie, not part of the Root Directory. In our case, The Bootsector, which contains our bootloader, will not be part of this directory. Because of this, bpbReservedSectors should be 1.
                دومی هم نوع فت را مشخص میکنه که برای fat 12 ما عدد 2 را داریم.
                کد:
                bpbRootEntries: 	    DW 224
                bpbTotalSectors: 	    DW 2880
                قسمت اول میگه شما میتونید در ریشه، حداکثر 224 تا دایرکتوری داشته باشد
                دومی هم حداکثر تعداد سکتورها را مشخص میکنه ( توی فلاپی 2880 تا سکتور داریم )

                کد:
                bpbMedia: 	            DB 0xF0
                bpbSectorsPerFAT: 	    DW 9
                قسمت اول توضیحی میده در مورد خواص دیسکتی که داریم باهاش کار میکنیم

                کد:
                The Media De******or Byte (bpbMedia) is a byte code that contains information about the disk. This byte is a Bit Pattern:
                
                    * Bits 0: Sides/Heads = 0 if it is single sided, 1 if its double sided
                    * Bits 1: Size = 0 if it has 9 sectors per FAT, 1 if it has 8.
                    * Bits 2: Density = 0 if it has 80 tracks, 1 if it is 40 tracks.
                    * Bits 3: Type = 0 if its a fixed disk (Such as hard drive), 1 if removable (Such as floppy drive)
                    * Bits 4 to 7 are unused, and always 1.
                اینجا
                کد:
                bpbSectorsPerTrack: 	DW 18
                bpbHeadsPerCylinder: 	DW 2
                اگه مطمئن نبودیم که تعداد سیلندر چندتاست ، از همون وقفه 13 برای پیدا کردن این مقادیر میشه استفاده کرد

                کد:
                bpbHiddenSectors: 	    DD 0
                نشون میده از سکتور شماره چند باید شروع کنیم ، ( میتونید چندتا سکتور را ندید بگیرید به این روش ، فکر کنم ، )

                کد:
                bpbTotalSectorsBig:     DD 0
                bsDriveNumber: 	        DB 0
                برای فلاپی همیشه صفر

                کد:
                bsUnused: 	            DB 0
                b***tBootSignature: 	DB 0x29
                این ستاره ها هم همون s*E*x هست که فیلتر میشه !
                اولی که همیشه صفر هست ، بلا استفاده. و اما دومی امضاء نوع بوت هست که در بایوس مثلا برای 28 و 29 نوع داس تعریف شدن ( به قول خودشون Bios Parameter Block

                0x28 and 0x29 indicate this is a MS/PC-DOS version 4.0
                اگه مقدار 0x29 داشته باشیم باید مقادیر زیر را هم تعریف کنیم
                کد:
                bsSerialNumber:	        DD 0xa0a1a2a3
                bsVolumeLabel: 	        DB "MOS FLOPPY "
                bsFileSystem: 	        DB "FAT12   "
                توجه داشته باشین که ولوم لیبل حداکثر 11 کاراکتره و فایل سیستم حداکر 8 کاراکتر

                یک مثال : ( ببینم اشکالشو کسی پیدا میکنه ، اصلا کسی هست این نوشته ها را بخونه و همزمان بیاد جلو؟ )
                کد:
                ;*********************************************
                ;	Boot1.asm
                ;		- A Simple Bootloader
                ;
                ;	Operating Systems Development Tutorial
                ;*********************************************
                 
                bits	16							; We are still in 16 bit Real Mode
                 
                org		0x7c00						; We are loaded by BIOS at 0x7C00
                 
                start:          jmp loader					; jump over OEM block
                 
                ;*************************************************;
                ;	OEM Parameter block / BIOS Parameter Block
                ;*************************************************;
                 
                TIMES 0Bh-$+start DB 0
                 
                bpbBytesPerSector:  	DW 512
                bpbSectorsPerCluster: 	DB 1
                bpbReservedSectors: 	DW 1
                bpbNumberOfFATs: 	DB 2
                bpbRootEntries: 	DW 224
                bpbTotalSectors: 	DW 2880
                bpbMedia: 	        DB 0xF0
                bpbSectorsPerFAT: 	DW 9
                bpbSectorsPerTrack: 	DW 18
                bpbHeadsPerCylinder: 	DW 2
                bpbHiddenSectors:       DD 0
                bpbTotalSectorsBig:     DD 0
                bsDriveNumber: 	        DB 0
                bsUnused: 	        DB 0
                b***tBootSignature: 	DB 0x29
                bsSerialNumber:	        DD 0xa0a1a2a3
                bsVolumeLabel: 	        DB "MOS FLOPPY "
                bsFileSystem: 	        DB "FAT12   "
                 
                ;***************************************
                ;	Prints a string
                ;	DS=>SI: 0 terminated string
                ;***************************************
                 
                Print:
                			lodsb					; load next byte from string from SI to AL
                			or			al, al		; Does AL=0?
                			jz			PrintDone	; Yep, null terminator found-bail out
                			mov			ah,	0eh	; Nope-Print the character
                			int			10h
                			jmp			Print		; Repeat until null terminator found
                PrintDone:
                			ret					; we are done, so return
                 
                ;*************************************************;
                ;	Bootloader Entry Point
                ;*************************************************;
                 
                loader:
                 
                .Reset:
                	mov		ah, 0					; reset floppy disk function
                	mov		dl, 0					; drive 0 is floppy drive
                	int		0x13					; call BIOS
                	jc		.Reset					; If Carry Flag (CF) is set, there was an error. Try resetting again
                 
                	mov		ax, 0x1000				; we are going to read sector to into address 0x1000:0
                	mov		es, ax
                	xor		bx, bx
                 
                	mov		ah, 0x02				; read floppy sector function
                	mov		al, 1					; read 1 sector
                	mov		ch, 1					; we are reading the second sector past us, so its still on track 1
                	mov		cl, 2					; sector to read (The second sector)
                	mov		dh, 0					; head number
                	mov		dl, 0					; drive number. Remember Drive 0 is floppy drive.
                	int		0x13					; call BIOS - Read the sector
                	
                 
                	jmp		0x1000:0x0				; jump to execute the sector!
                 
                 
                times 510 - ($-$$) db 0						; We have to be 512 bytes. Clear the rest of the bytes with 0
                 
                dw 0xAA55							; Boot Signiture
                 
                ; End of sector 1, beginning of sector 2 ---------------------------------
                 
                 
                org 0x1000							; This sector is loaded at 0x1000:0 by the bootsector
                 
                cli								; just halt the system
                hlt

                Comment


                • #9
                  با وجود سازگاري NASM تو فايل manual
                  7.1.1 ORG: Binary File Program Origin
                  ...
                  Its sole function is to specify one offset which is added to all internal address references within the section
                  Double ORG , New Segment Define , 32 bit و ... جواب نداد
                  راه حل منطقي پيدا نشد
                  اين لودر رو پيدا كردم كه به روش خودش ( تعريف فايل كرنل ) مشكل رو حل كرده و لودر خوبي هم هست
                  کد:
                  ;
                  ; Copyright (c) Eike Dehling 2004, all rights reserved
                  ;
                  ; Compile with nasm, write to first sector of a floppy, have fun
                  ;
                  
                  [BITS 16]
                  [ORG 0x7c00]
                  
                  ; -------------------------------------
                  ; disk de******ion
                  ; -------------------------------------
                  	jmp short start	; 3 bytes to e.g. jump
                  	nop
                  	db "EikeBoot"	; 8 byte label / OemId
                  	dw 512		; bytes per sector
                  	db 1		; sectors per cluster
                  	dw 1		; size of the bootloader, in sectors
                  	db 2		; number of copies of the FAT
                  	dw 224		; number of entries in Root-Dir
                  	dw 2880 	; 16-bit number of sectors
                  	db 0xf0		; media de******or
                  	dw 9		; number of sectors per FAT
                  	dw 18		; sectors per track
                  	dw 2		; number of heads
                  	dd 0		; number of hidden sectors
                  	dd 0		; 32-bit number of sectors
                  	db 0		; bios drive number
                  	db 0		; reserved
                  	db 0x29 	; extended boot signature
                  	dd 0		; volume ID
                  	db "NO NAME    "; volume label
                  	db "FAT12   "	; filesystem type
                  
                  ; -------------------------------------
                  ; bootloader code
                  ; -------------------------------------
                  print_io_error_trampoline:
                  	jmp print_io_error	; out of range crap :(
                  
                  start:
                  	; set segments, bios may set 0x07c0:0x0000 or 0x0000:0x7c00
                  	jmp 0:start2
                  start2: mov ax, 0
                  	mov ds, ax
                  	mov es, ax
                  	mov ss, ax
                  	mov sp, 0x7000
                  
                  	; save boot device
                  	mov byte [bootdev], dl
                  	
                  	; reset disks 
                  	mov ah, 0
                  	mov dl, byte [bootdev]
                  	int 0x13
                  
                  	; load FAT
                  	mov ah, 0x02			; read from disk
                  	mov al, 9			; number of sectors to read
                  	mov bx, fatbuf			; es: bx = buffer
                  	mov ch, 0			; track ((1 / 18) / 2)
                  	mov cl, 2			; sector (1 % 18 + 1)
                  	mov dh, 0			; head ((1 / 18) % 2)
                  	mov dl, byte [bootdev]		; dl = device, but that's still correct
                  	int 0x13
                  	jc print_io_error_trampoline
                  
                  	; load root directory
                  	mov ah, 0x02			; read from disk
                  	mov al, 14			; number of sectors to read
                  	mov bx, rootdir			; es: bx = buffer
                  	mov ch, 0			; track ((19 / 18) / 2)
                  	mov cl, 2			; sector (19 % 18 + 1)
                  	mov dh, 1			; head ((19 / 18) % 2)
                  	mov dl, byte [bootdev]		; dl = device, but that's still correct
                  	int 0x13
                  	jc print_io_error_trampoline
                  	
                  	; find file
                  	mov ax, rootdir			; ax = pointer to current dir-entry
                  	cld
                  
                  find_start:
                  	mov si, ax			; point si to current filename
                  	mov di, filename		; point di to the filename we need
                  	mov cx, 11			; compare max 11 bytes
                  
                  	repe cmpsb
                  	je found_file
                  	
                  	add ax, 32			; done yet?
                  	cmp ax, rootdir_end
                  	jne find_start
                  
                  	; print error and halt
                  	mov si, file_not_found
                  	call print
                  	jmp $
                  
                  found_file:
                  	; save cluster
                  	mov si, ax
                  	mov ax, word [si + 26]		; load cluster of file from the directory entry
                  	mov word [cluster], ax
                  
                  	; decode FAT
                  	mov cx, 512*(9/3)		; number of entries in the fat.
                  	mov si, fatbuf
                  	mov di, fatdecoded
                  
                  	;
                  	; XXX - WATCH OUT, THIS REALLY NEEDS TO USE EAX, EBX & CO!!!
                  	;
                  fat_decode_loop:		; load dword, split into two pieces of 12 bits, and discard last byte
                  	lodsd				; load dword
                  	dec si				; need only 3 bytes
                  	mov ebx, eax
                  	and eax, 0xFFF			; mask
                  	stosw
                  	mov eax, ebx
                  	shr eax, 12			
                  	and eax, 0xFFF			; shift & mask
                  	stosw
                  	loop fat_decode_loop
                  	
                  	; load file:
                  	;	es:bx = buffer
                  	;	ds:si = decoded fat buffer
                  	;	rest is for temporary usage only	
                  	
                  	; prepare buffer
                  	mov ax, 0x1000
                  	mov es, ax
                  	mov bx, 0
                  	mov ax, word [cluster]
                  
                  load_loop:
                  	; calculate next cluster
                  	mov si, ax
                  	shl si, 1
                  	mov cx, word [fatdecoded + si]
                  	mov word [cluster], cx
                  	
                  	; calculate track, head and sector
                  	add ax, 31			; ax = logical sector
                  	mov dx, 0
                  	mov di, 18
                  	div di
                  	mov cl, dl
                  	add cl, 1			; cl = sector = (logical % 18 + 1)
                  	mov dx, 0
                  	mov di, 2
                  	div di
                  	mov ch, al			; ch = track = ((logical / 18) / 2)
                  	mov dh, dl			; dh = head = ((logical / 18) % 2)
                  
                  	; read data
                  	mov ah, 0x02
                  	mov al, 1
                  	mov dl, byte [bootdev]
                  	int 0x13
                  	jc print_io_error
                  	add bx, 512
                  
                  	; done?
                  	mov ax, word [cluster]
                  	cmp ax, 0xFF8
                  	jb load_loop
                  
                  	; DEBUG: print loaded file && halt
                  	;mov si, 0
                  	;mov di, 0
                  	;mov ax, 0x1000
                  	;mov ds, ax
                  	;mov ax, 0xb800
                  	;mov es, ax
                  	;mov cx, 2000
                  	;mov al, ' '
                  	;print_file_loop:
                  	;movsb
                  	;stosb
                  	;loop print_file_loop
                  	;jmp $
                  
                  	; execute file?
                  	; jmp 0x1000:0x0000
                  	; jmp $
                  
                  	; disable interrupts
                  	cli
                  
                  	; load our GDT
                  	lgdt [gdt]
                  	
                  	; enable protected mode  ...
                  	mov eax, cr0
                  	or eax, 1
                  	mov cr0, eax
                  	jmp 0x08 : dword cs_flush	; jump into 32-bit
                  
                  [BITS 32]
                  cs_flush:
                  
                  	; setup segements
                  	mov eax, 0x10
                  	mov ds, eax
                  	mov es, eax
                  	mov ss, eax
                  	mov fs, eax
                  	mov gs, eax
                  
                  	; make stack-register p-mode compliant
                  	shl esp, 4
                  
                  	; clear flags
                  	push dword 0
                  	popf
                  
                  	; Execute loaded file ...
                  	jmp 0x10000
                  
                  [BITS 16]
                  ; -------------------------------------
                  ; procedures
                  ; -------------------------------------
                  
                  print_io_error:
                  	mov si, io_error
                  	call print
                  	jmp $
                  
                  	; print zero-terminated string (without formatting)
                  	;	ds:si = string
                  	;	es:di = position on screen
                  print:
                  	mov ax, 0xb886
                  	mov es, ax
                  	mov di, 0
                  print_loop:
                  	lodsw
                  	cmp al, 0
                  	jz print_done
                  	stosw
                  	jmp print_loop
                  print_done:
                  	ret
                  
                  ; -------------------------------------
                  ; data & variables (not in a separate section, cause that makes padding to the
                  ; 	512 byte border easier)
                  ; -------------------------------------
                  
                  	; filename
                  	filename: db "KERNEL  BIN"
                  
                  	; messages
                  	io_error:		db "I / O   e r r o r ", 0
                  	file_not_found:	db "[   O S   K e r n e l   n o t   f o u n d   ] ", 0
                  	executing:		db "E x e c u t i n g . . . ", 0
                  
                  gdt:
                  	dw (gdtend - gdt)
                  	dd gdt
                  	dw 0						; first entry is our gdt-pointer
                  	dd 0x0000ffff, 0x00cf9a00	; second entry: code
                  	dd 0x0000ffff, 0x00cf9200	; third entry: data
                  	gdtend:						; end
                  
                  	; boot signature
                  ;	resb 510 - ($ - $$) ; align at 512 bytes
                  	times 510 - ($ - $$) db 0 ; align at 512 bytes
                  	dw 0xAA55
                  
                  ; -------------------------------------
                  ; BSS data (starts at 0x8000, that leaves 32k space in the first 64k segment)
                  ; -------------------------------------
                  
                  [ABSOLUTE 0x8000]
                  	
                  	; boot device
                  	bootdev: resb 1
                  	
                  	; first cluster of the file we need
                  	cluster: resw 1
                  	
                  	; FAT buffer
                  	fatbuf: resb 9 * 512
                  
                  	; root directory
                  	rootdir: resb 224 * 32
                  	rootdir_end:
                  
                  	; buffer for decoding the FAT
                  	fatdecoded: resb (9 * 512 * 3) / 2
                  تست شده و كاملا كار ميكنه

                  اين هم براي پيگيري بيشتر تصحيح مورد بالا
                  http://forum.osdev.org/viewtopic.php?f=1&t=15497
                  ......

                  به سلامتي شبگرد ...

                  Comment


                  • #10
                    به نظر مي رسه كه داريم سكتور 2 رو مي خونيم ولي اين ها كه تو سكتور 2 نيستند؟!!!

                    کد:
                    org [COLOR="Red"]0x1000[/COLOR]							; This sector is loaded at 0x1000:0 by the bootsector
                     
                    cli								; just halt the system
                    hlt
                    مگه سكتور 2 نبايد از 512 به بعد شروع بشه ظاهرا كه كد بالا تو سكتور 8 هست يا من اصلا نفهميدم !!!
                    ¯/(°_o)\¯
                    بیچاره آن کسی است که گرفتار عقل شد **** آسوده آن کسی است که خر آمد و الاغ رفت
                    این چه شوری است که در دور قمر می بینم **** همه آفاق پر از فتنه و شر می بینم
                    اسب تازی شده مجروح به زیر پالن **** طوغ زرین بر گردن خر می بینم
                    Copyright: Enigma2

                    به اميد شبگردي بهتر

                    Comment


                    • #11
                      هر دو پست بالا را درست گفتین ، دوتا org نمیشه تعریف کرد توی برنامه و هم محل شروع قاعدتا باید سکتور دوم باشه که فرضا ممکنه موقع کپی فایل کرنل ،هرجائی این اتفاق بی افته ...
                      برای این منظور باید در ادامه یه کم در مورد ساختار فت توضیح بدم و روشی که توی بوت سکتور طوری برنامه بنویسم که بیاد و از طریق خوندن اطلاعات فت ،واستفاده از جدول آدرس فایلها ، محل فیزیکی فایل کرنل را پیدا کنه و ادامه برنامه را به اون منتقل کنه ( راه حل منطقی )
                      همین لودری که اون بالا ویتال گذاشته کارش اینه ، توضیحاتش را هم امشب یا فردا شب مینویسم ، یه کم این چند روز داشتم ناامید میشدم که اصلا کسی پیدا میشه اینا را بخونه یا نه

                      پیوست : فکر کنم برای راحت کردن این قسمت میشه از GRUB هم استفاده کرد ، ولی خب دیگه از اول اول نمیشه و حال نمیده ( مازوخیسم)

                      Comment


                      • #12
                        هرچی میخوام این مطالب که چطوری محاسبه میشه و بوت لودر میاد هارد را سکتور به سکتور میخونه را بنویسم میبینم هم خودم کم فهمیدم هم مطالبش خیلی گنگه برام اینه که کلا بیخیال و یه پله را جا میندازیم میریم یه پله بعد و مستقیم یک لودر را تشریح میکنیم که عملا پله قبلی را توی دل خودش داره

                        کد:
                        ;*********************************************
                        ;	Boot1.asm
                        ;		- A Simple Bootloader
                        ;
                        ;	Operating Systems Development Series
                        ;*********************************************
                        
                        bits	16						; we are in 16 bit real mode
                        
                        org	0						; we will set regisers later
                        
                        start:	jmp	main					; jump to start of bootloader
                        
                        ;*********************************************
                        ;	BIOS Parameter Block
                        ;*********************************************
                        
                        ; BPB Begins 3 bytes from start. We do a far jump, which is 3 bytes in size.
                        ; If you use a short jump, add a "nop" after it to offset the 3rd byte.
                        
                        bpbOEM			db "My OS   "			; OEM identifier (Cannot exceed 8 bytes!)
                        bpbBytesPerSector:  	DW 512
                        bpbSectorsPerCluster: 	DB 1
                        bpbReservedSectors: 	DW 1
                        bpbNumberOfFATs: 	DB 2
                        bpbRootEntries: 	DW 224
                        bpbTotalSectors: 	DW 2880
                        bpbMedia: 		DB 0xf8  ;; 0xF1
                        bpbSectorsPerFAT: 	DW 9
                        bpbSectorsPerTrack: 	DW 18
                        bpbHeadsPerCylinder: 	DW 2
                        bpbHiddenSectors: 	DD 0
                        bpbTotalSectorsBig:     DD 0
                        bsDriveNumber: 	        DB 0
                        bsUnused: 		DB 0
                        b***tBootSignature: 	DB 0x29
                        bsSerialNumber:	        DD 0xa0a1a2a3
                        bsVolumeLabel: 	        DB "MOS FLOPPY "
                        bsFileSystem: 	        DB "FAT12   "
                        
                        ;************************************************;
                        ;	Prints a string
                        ;	DS=>SI: 0 terminated string
                        ;************************************************;
                        Print:
                        			lodsb				; load next byte from string from SI to AL
                        			or	al, al			; Does AL=0?
                        			jz	PrintDone		; Yep, null terminator found-bail out
                        			mov	ah, 0eh			; Nope-Print the character
                        			int	10h
                        			jmp	Print			; Repeat until null terminator found
                        	PrintDone:
                        			ret				; we are done, so return
                        
                        ;************************************************;
                        ; Reads a series of sectors
                        ; CX=>Number of sectors to read
                        ; AX=>Starting sector
                        ; ES:BX=>Buffer to read to
                        ;************************************************;
                        
                        ReadSectors:
                             .MAIN
                                  mov     di, 0x0005                          ; five retries for error
                             .SECTORLOOP
                                  push    ax
                                  push    bx
                                  push    cx
                                  call    LBACHS                              ; convert starting sector to CHS
                                  mov     ah, 0x02                            ; BIOS read sector
                                  mov     al, 0x01                            ; read one sector
                                  mov     ch, BYTE [absoluteTrack]            ; track
                                  mov     cl, BYTE [absoluteSector]           ; sector
                                  mov     dh, BYTE [absoluteHead]             ; head
                                  mov     dl, BYTE [bsDriveNumber]            ; drive
                                  int     0x13                                ; invoke BIOS
                                  jnc     .SUCCESS                            ; test for read error
                                  xor     ax, ax                              ; BIOS reset disk
                                  int     0x13                                ; invoke BIOS
                                  dec     di                                  ; decrement error counter
                                  pop     cx
                                  pop     bx
                                  pop     ax
                                  jnz     .SECTORLOOP                         ; attempt to read again
                                  int     0x18
                             .SUCCESS
                                  mov     si, msgProgress
                                  call    Print
                                  pop     cx
                                  pop     bx
                                  pop     ax
                                  add     bx, WORD [bpbBytesPerSector]        ; queue next buffer
                                  inc     ax                                  ; queue next sector
                                  loop    .MAIN                               ; read next sector
                                  ret
                        
                        ;************************************************;
                        ; Convert CHS to LBA
                        ; LBA = (cluster - 2) * sectors per cluster
                        ;************************************************;
                        
                        ClusterLBA:
                                  sub     ax, 0x0002                          ; zero base cluster number
                                  xor     cx, cx
                                  mov     cl, BYTE [bpbSectorsPerCluster]     ; convert byte to word
                                  mul     cx
                                  add     ax, WORD [datasector]               ; base data sector
                                  ret
                             
                        ;************************************************;
                        ; Convert LBA to CHS
                        ; AX=>LBA Address to convert
                        ;
                        ; absolute sector = (logical sector / sectors per track) + 1
                        ; absolute head   = (logical sector / sectors per track) MOD number of heads
                        ; absolute track  = logical sector / (sectors per track * number of heads)
                        ;
                        ;************************************************;
                        
                        LBACHS:
                                  xor     dx, dx                              ; prepare dx:ax for operation
                                  div     WORD [bpbSectorsPerTrack]           ; calculate
                                  inc     dl                                  ; adjust for sector 0
                                  mov     BYTE [absoluteSector], dl
                                  xor     dx, dx                              ; prepare dx:ax for operation
                                  div     WORD [bpbHeadsPerCylinder]          ; calculate
                                  mov     BYTE [absoluteHead], dl
                                  mov     BYTE [absoluteTrack], al
                                  ret
                        
                        ;*********************************************
                        ;	Bootloader Entry Point
                        ;*********************************************
                        
                        main:
                        
                             ;----------------------------------------------------
                             ; code located at 0000:7C00, adjust segment registers
                             ;----------------------------------------------------
                             
                                  cli						; disable interrupts
                                  mov     ax, 0x07C0				; setup registers to point to our segment
                                  mov     ds, ax
                                  mov     es, ax
                                  mov     fs, ax
                                  mov     gs, ax
                        
                             ;----------------------------------------------------
                             ; create stack
                             ;----------------------------------------------------
                             
                                  mov     ax, 0x0000				; set the stack
                                  mov     ss, ax
                                  mov     sp, 0xFFFF
                                  sti						; restore interrupts
                        
                             ;----------------------------------------------------
                             ; Display loading message
                             ;----------------------------------------------------
                             
                                  mov     si, msgLoading
                                  call    Print
                                  
                             ;----------------------------------------------------
                             ; Load root directory table
                             ;----------------------------------------------------
                        
                             LOAD_ROOT:
                             
                             ; compute size of root directory and store in "cx"
                             
                                  xor     cx, cx
                                  xor     dx, dx
                                  mov     ax, 0x0020                           ; 32 byte directory entry
                                  mul     WORD [bpbRootEntries]                ; total size of directory
                                  div     WORD [bpbBytesPerSector]             ; sectors used by directory
                                  xchg    ax, cx
                                  
                             ; compute location of root directory and store in "ax"
                             
                                  mov     al, BYTE [bpbNumberOfFATs]            ; number of FATs
                                  mul     WORD [bpbSectorsPerFAT]               ; sectors used by FATs
                                  add     ax, WORD [bpbReservedSectors]         ; adjust for bootsector
                                  mov     WORD [datasector], ax                 ; base of root directory
                                  add     WORD [datasector], cx
                                  
                             ; read root directory into memory (7C00:0200)
                             
                                  mov     bx, 0x0200                            ; copy root dir above bootcode
                                  call    ReadSectors
                        
                             ;----------------------------------------------------
                             ; Find stage 2
                             ;----------------------------------------------------
                        
                             ; browse root directory for binary image
                                  mov     cx, WORD [bpbRootEntries]             ; load loop counter
                                  mov     di, 0x0200                            ; locate first root entry
                             .LOOP:
                                  push    cx
                                  mov     cx, 0x000B                            ; eleven character name
                                  mov     si, ImageName                         ; image name to find
                                  push    di
                             rep  cmpsb                                         ; test for entry match
                                  pop     di
                                  je      LOAD_FAT
                                  pop     cx
                                  add     di, 0x0020                            ; queue next directory entry
                                  loop    .LOOP
                                  jmp     FAILURE
                        
                             ;----------------------------------------------------
                             ; Load FAT
                             ;----------------------------------------------------
                        
                             LOAD_FAT:
                             
                             ; save starting cluster of boot image
                             
                                  mov     si, msgCRLF
                                  call    Print
                                  mov     dx, WORD [di + 0x001A]
                                  mov     WORD [cluster], dx                  ; file's first cluster
                                  
                             ; compute size of FAT and store in "cx"
                             
                                  xor     ax, ax
                                  mov     al, BYTE [bpbNumberOfFATs]          ; number of FATs
                                  mul     WORD [bpbSectorsPerFAT]             ; sectors used by FATs
                                  mov     cx, ax
                        
                             ; compute location of FAT and store in "ax"
                        
                                  mov     ax, WORD [bpbReservedSectors]       ; adjust for bootsector
                                  
                             ; read FAT into memory (7C00:0200)
                        
                                  mov     bx, 0x0200                          ; copy FAT above bootcode
                                  call    ReadSectors
                        
                             ; read image file into memory (0050:0000)
                             
                                  mov     si, msgCRLF
                                  call    Print
                                  mov     ax, 0x0050
                                  mov     es, ax                              ; destination for image
                                  mov     bx, 0x0000                          ; destination for image
                                  push    bx
                        
                             ;----------------------------------------------------
                             ; Load Stage 2
                             ;----------------------------------------------------
                        
                             LOAD_IMAGE:
                             
                                  mov     ax, WORD [cluster]                  ; cluster to read
                                  pop     bx                                  ; buffer to read into
                                  call    ClusterLBA                          ; convert cluster to LBA
                                  xor     cx, cx
                                  mov     cl, BYTE [bpbSectorsPerCluster]     ; sectors to read
                                  call    ReadSectors
                                  push    bx
                                  
                             ; compute next cluster
                             
                                  mov     ax, WORD [cluster]                  ; identify current cluster
                                  mov     cx, ax                              ; copy current cluster
                                  mov     dx, ax                              ; copy current cluster
                                  shr     dx, 0x0001                          ; divide by two
                                  add     cx, dx                              ; sum for (3/2)
                                  mov     bx, 0x0200                          ; location of FAT in memory
                                  add     bx, cx                              ; index into FAT
                                  mov     dx, WORD [bx]                       ; read two bytes from FAT
                                  test    ax, 0x0001
                                  jnz     .ODD_CLUSTER
                                  
                             .EVEN_CLUSTER:
                             
                                  and     dx, 0000111111111111b               ; take low twelve bits
                                 jmp     .DONE
                                 
                             .ODD_CLUSTER:
                             
                                  shr     dx, 0x0004                          ; take high twelve bits
                                  
                             .DONE:
                             
                                  mov     WORD [cluster], dx                  ; store new cluster
                                  cmp     dx, 0x0FF0                          ; test for end of file
                                  jb      LOAD_IMAGE
                                  
                             DONE:
                             
                                  mov     si, msgCRLF
                                  call    Print
                                  push    WORD 0x0050
                                  push    WORD 0x0000
                                  retf
                                  
                             FAILURE:
                             
                                  mov     si, msgFailure
                                  call    Print
                                  mov     ah, 0x00
                                  int     0x16                                ; await keypress
                                  int     0x19                                ; warm boot computer
                             
                             absoluteSector db 0x00
                             absoluteHead   db 0x00
                             absoluteTrack  db 0x00
                             
                             datasector  dw 0x0000
                             cluster     dw 0x0000
                             ImageName   db "KRNLDR  SYS"
                             msgLoading  db 0x0D, 0x0A, "Loading Boot Image ", 0x0D, 0x0A, 0x00
                             msgCRLF     db 0x0D, 0x0A, 0x00
                             msgProgress db ".", 0x00
                             msgFailure  db 0x0D, 0x0A, "ERROR : Press Any Key to Reboot", 0x0A, 0x00
                             
                                  TIMES 510-($-$$) DB 0
                                  DW 0xAA55
                        خب تقریبا توی سورس بالا میبینیم که هرکدوم از مقادیر Block OEM کجا استفاده میشن و کمک میکنن به شناسائی سکتورها و کلاسترها
                        مثلادر خط 63 که داریم ReadSectors:
                        میبنیدکه چطور بر اساس مقدار تعریف شده هر بایت در یک سکتور با استفاده از loop تمام یک سکتور خونده میشه و مقادیرش استخراج میشه
                        کد:
                                  add     bx, WORD [bpbBytesPerSector]        ; queue next buffer
                                  inc     ax                                  ; queue next sector
                                  loop    .MAIN                               ; read next sector
                        همچنین معرفی ImageName در اواخر برنامه که نام فایل کرنل را مشخص میکنه ،
                        و خلاصه سورس جالبه ، فقط یک نکته داره ، اونم اینه که وقتی ما فایل کرنل را برای تست روی فلاپی کپی میکنیم ، هنوز این سیستم عامل ویندوز هست که فایل را کپی میکنه و فایل مپ را در واقع میسازه
                        خیالتون را راحت کنم فعلا منم هنوز چیزی در این مورد نخوندم ولی در ادامه تا وقتی که
                        stage3 یا کرنل 32بیتی را میخوایم اجرا کنیم به مرور این مطالب را بهش میرسیم

                        فقط جهت دونستن کلیات این مورد فعلا :


                        خب تا اینجا فرض میگیرم این لودر را دقیقا میدونیم چیکار میکنه ! ، اصلا بیخیال ، صبر و حوصله شو نداریم و همین که کار میکنه بسه بهتره بریم سر اصـــــــــــــــــــــــ ــــــــــــل مطلب ، یعنی لود کردن یک فایل کرنل ساده
                        یک فایل ساده مینویسم که فقط یک متن نشون بده
                        کد:
                        
                        ;*********************************************
                        ;	Stage2.asm
                        ;		- Second Stage Bootloader
                        ;
                        ;	Operating Systems Development Series
                        ;*********************************************
                        
                        org 0x0					; offset to 0, we will set segments later
                        
                        bits 16					; we are still in real mode
                        
                        ; we are loaded at linear address 0x10000
                        
                        jmp main				; jump to main
                        
                        ;*************************************************;
                        ;	Prints a string
                        ;	DS=>SI: 0 terminated string
                        ;************************************************;
                        
                        Print:
                        	lodsb					; load next byte from string from SI to AL
                        	or			al, al		; Does AL=0?
                        	jz			PrintDone	; Yep, null terminator found-bail out
                        	mov			ah,	0eh	; Nope-Print the character
                        	int			10h
                        	jmp			Print		; Repeat until null terminator found
                        PrintDone:
                        	ret					; we are done, so return
                        
                        ;*************************************************;
                        ;	Second Stage Loader Entry Point
                        ;************************************************;
                        
                        main:
                        	cli					; clear interrupts
                        	push			cs		; Insure DS=CS
                        	pop			ds
                        
                        	mov			si, Msg
                        	call			Print
                        
                        	cli					; clear interrupts to prevent triple faults
                        	hlt					; hault the syst
                        
                        ;*************************************************;
                        ;	Data Section
                        ;************************************************;
                        
                        Msg	db	"Preparing to load operating system...",13,10,0
                        کامپایلش میکنیم
                        و فایل ساخته شده را به اسم KRNLDR.SYS تغییر نام میدیم
                        تا اینجا پس 2تا فایل داریم ، اولین که همون بوت لودر هست و با دستور
                        partcopy Boot1.bin 0 200 -f0
                        اون را روی فلاپی ریختیم
                        و این دومی که یک فایله و به صورت معمولی اون را Copy&Paste میکنیم روی فلاپی ( این دیگه partcopy نمیخواد )
                        حالا چی داریم ؟ یک دیسکت بوت که بعد از بوت شدن میگرده دنبال فایل کرنل و اون را اجرا میکنه
                        از حالا دیگه فقط باید فکرمون را بزاریم روی تکمیل این کرنل و بحث بوت لودر را تا وقتی که برسیم به قسمتهایی که باید بهش رجوع مجدد کنیم و تغییراتی برای سیستم عامل 32 بیتی توش بدیم همینجا بسته نگهش میداریم..


                        سورسها به همراه فایلهای کامپایل شده و یک نمونه ایمیج از فلاپی ، اماده به کار در محیط بوچز ضمیمه
                        فایل های پیوست شده

                        Comment


                        • #13
                          كمك

                          سلام:خسته نباشي و دستتم درد نكنه.
                          يه سوال من وقتي مي خوام بوت لودري كه گزاشتي با nasm كامپايل كنم اين ايرور رو مي ده(2.asm error: parser: instruction expected)مشكل چي؟:
                          با تشكر

                          Comment


                          • #14
                            این مال اینکه پستهای قبلی را خوب نمیخونی
                            نوشتم که:
                            این ستاره ها هم همون s*E*x هست که فیلتر میشه !
                            خط به خط را بخونید ، حتی یک خط هم جا بندازین ممکنه به مشکلاتی بر بخورید.


                            سورس بالا را از فایل ضمیمه اجرا کن تا بی مشکل کار کنه یا، اونی که توی متن صفحه هست به علت فیلترینگ کلمه SE X موقع کامپایل به خطا بر میخورید ، توی سورس برنامه بگردید جائی *** شده بود به این کلمه تغییرش بدین
                            راهنمائی : بلوک OEM را نگاه کنید چطوری شده
                            کد:
                            b***tBootSignature: 	DB 0x29

                            Comment


                            • #15
                              با سلام:ممنون كه كمك كردين-مشكل حل شد اما با يه مشكل ديگه روبه رو شدم
                              C:\PROGRA~1\nasm>partcopy bootload.bin 0 200 -f0
                              Failed to write destination at offset 0
                              بايد چكار كنم؟
                              اينم بگم كه با نرم افزار كه فلاپي مجازي ميسازه يه درايو هم ساختم اما نمي دونم چرا نمي شه.
                              با تشكر

                              Comment

                              Working...
                              X