صفحه 1 از 6 123 ... آخرینآخرین
نمایش نتایج: از شماره 1 تا 15 , از مجموع 83
  1. #1
    تاریخ عضویت
    Dec 2005
    محل سکونت
    اصفهان
    نوشته ها
    4,931
    تشکر از ارسال
    1,770
    Thanked 1,401 Times in 345 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. 16کاربر از joker به علت ارسالش تشکر کردند.

    00110 (01-31-2011),3H34N (08-03-2012),4w4r3 (12-08-2010),Ako0ri (12-13-2010),alieye (03-17-2014),Astalavista (03-18-2014),Averna (12-14-2010),A|iR3ZaM49icBoy (12-03-2010),bl4ckl0rd (12-11-2010),Black_Eagle (12-23-2010),BLaDe (09-02-2012),byteptr (03-16-2011),CsT (12-25-2011),darkn3ssking (12-03-2010),Delphi_Develope (07-26-2012),dintic (09-29-2013),Gondalof (10-10-2012),h27 (12-03-2010),hamed00737 (03-03-2011),hamedany (12-11-2010),hashem_wolf (12-24-2010),hayula (04-14-2013),hba (12-03-2010),iisecurity.c (12-07-2010),kahroba_d (04-13-2013),Kouros (12-07-2010),M.Pr!nc3 (10-17-2011),m0riiii (12-08-2010),M0TRIX (12-19-2011),mafia1990 (05-20-2012),mikrob (08-31-2012),mmkh (02-21-2014),mmmmms (05-02-2012),MOH3NCODEr (09-01-2012),Mokhless (02-09-2011),n0x90 (10-26-2013),NE0 (12-03-2010),nofooz9ar (01-12-2011),n_sh_17 (12-07-2010),PaMPaM (12-10-2010),PersianStar (12-03-2010),qjjqjjq (04-15-2011),r3d.w0rm (11-01-2012),rali (12-25-2010),reza.exe (12-07-2010),Royaei (08-20-2011),saber187518 (02-01-2011),saeed hg (08-26-2011),Sarmadi (11-07-2012),shamimi (06-18-2012),shervin110 (12-27-2010),shovaleye (07-15-2011),simorgh_ev (01-09-2011),sin4.c0d3r (12-03-2010),V1T4L (12-13-2010),V4I-IiD (12-30-2010),waNted (12-04-2010),X32X (12-04-2010),xman_1365_x (12-16-2010),YAHo0 (12-07-2010)

  3. #2
    تاریخ عضویت
    Dec 2005
    محل سکونت
    اصفهان
    نوشته ها
    4,931
    تشکر از ارسال
    1,770
    Thanked 1,401 Times in 345 Posts
    این قسمت هم یکسری تعاریف اولیه را کامل میکنم و بعد دیگه...... ( حتی ممکنه جائیش را اشتباه بگم ، چاره ای نیست خودمم تازه شروع کردم ،ادعایی نیست ، شما ها هم خودتون کمک کنید تصحیح بشه خطاهای نوشتاری و درک مطلبی و... )

    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

  4. 6کاربر از joker به علت ارسالش تشکر کردند.

    4w4r3 (12-08-2010),apache (12-08-2010),Averna (12-14-2010),BLaDe (09-02-2012),byteptr (03-16-2011),d3c0der (12-07-2010),Delphi_Develope (07-26-2012),dintic (09-29-2013),Gondalof (10-10-2012),Kouros (12-10-2010),L0pht (12-12-2010),m0riiii (12-08-2010),mmkh (02-21-2014),N3MiSiS (03-25-2012),n_sh_17 (12-07-2010),r3d.w0rm (12-16-2011),saber187518 (03-05-2011),shamimi (06-18-2012),shervin110 (12-27-2010),V1T4L (12-17-2010)

  5. #3
    تاریخ عضویت
    Dec 2005
    محل سکونت
    اصفهان
    نوشته ها
    4,931
    تشکر از ارسال
    1,770
    Thanked 1,401 Times in 345 Posts
    خب بریم برای مباحث شیرین تر
    اصلا سیستم عامل چیه ؟ اینا را چرا مینویسیم؟ هدفمون چیه از داشتن یک به اصطلاح سیستم عامل؟
    همه این کارها برای اینه که بتونیم این کامپیوتر دیجیتاله زبون نفهم را یه جوری رامش کنیم که کاربر بتونه باهاش ارتباط برقرار کنه و ازش کار بکشه ( نمونه هم که دیگه نیاز نیست مثال بزنم؟ ویندوز ، لینوکس ، مکینتاش و.... ) این که چرا خودمون میخوایم شروع کنیم به یادگیری هم که تکلیفش معلومه...
    سیستم عامل یک نرم افزار نیست ، در واقع مجموعه ای از نرم افزارها هستند در کنار هم
    زبانهای رایج برای توسعه سیستم عامل هم معمولا 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 را هم که پست قبلی لینک دادم حتما دانلود کنید

  6. 3کاربر از joker به علت ارسالش تشکر کردند.

    4w4r3 (12-14-2010),Averna (12-14-2010),A|iR3ZaM49icBoy (12-15-2010),bl4ckl0rd (12-11-2010),BLaDe (09-02-2012),Cybrus (05-10-2011),Delphi_Develope (07-26-2012),Kouros (12-10-2010),n_sh_17 (12-10-2010),saber187518 (03-05-2011),shamimi (06-18-2012),shervin110 (12-27-2010),V1T4L (12-17-2010)

  7. #4
    تاریخ عضویت
    Dec 2005
    محل سکونت
    اصفهان
    نوشته ها
    4,931
    تشکر از ارسال
    1,770
    Thanked 1,401 Times in 345 Posts
    برای داشتن یک سیستم عامل در حد قابل قبول نیاز داریم به
    Memory Management - مدیریت حافظه
    Program Management - مدیریت برنامه ها
    Multitasking - چند وظیفه ای یا اجرای همزمان چند پروسه
    Memory Protection - حفاظت از خرابی حافظه
    Multiuser - پشتیبانی از یک یا چند اپراتور سیستم
    Kernel - هسته اصلی سیستم عامل برای مدیریت بقیه گزینه ها
    File System - یک فایل سیستم برای کار کردن با فایلها
    Command Shell - رابط خط فرمان
    Graphical User Interface - یک محیط گرافیکی جایگزین خط فرمان
    Bootloader - و بوت لودر که به زودی میریم سراغش

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

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

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

  8. 2کاربر از joker به علت ارسالش تشکر کردند.

    4w4r3 (12-14-2010),Averna (12-14-2010),A|iR3ZaM49icBoy (12-15-2010),Delphi_Develope (07-26-2012),Kouros (12-15-2010),pioneer (01-17-2011),saber187518 (03-05-2011),shamimi (06-18-2012),shervin110 (12-27-2010),V1T4L (12-17-2010)

  9. #5
    تاریخ عضویت
    Dec 2005
    محل سکونت
    اصفهان
    نوشته ها
    4,931
    تشکر از ارسال
    1,770
    Thanked 1,401 Times in 345 Posts
    خب.....
    ساده ترین کد که قاطی این بوت لودرهای آموزشی کف اینترنت دیدم اینه و امشب اولین بوت لودر را مینویسم و کامپایل میکنیم و تست و اجرا میکنم.
    کد:
     
    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/

    فایل های پروژه ضمیمه
    فایل های پیوست شده فایل های پیوست شده
    • نوع فایل: zip FiRST.zip (9.5 کیلو بایت, 233 نمایش)

  10. 3کاربر از joker به علت ارسالش تشکر کردند.

    4w4r3 (12-14-2010),Averna (12-14-2010),d3c0der (12-14-2010),Delphi_Develope (07-26-2012),Gondalof (10-10-2012),h27 (12-13-2010),JeyJey (07-30-2011),saber187518 (03-05-2011),shamimi (06-18-2012),shervin110 (12-27-2010),V1T4L (12-17-2010)

  11. #6
    تاریخ عضویت
    Dec 2005
    محل سکونت
    اصفهان
    نوشته ها
    4,931
    تشکر از ارسال
    1,770
    Thanked 1,401 Times in 345 Posts
    خب امشب میرسیم به سوال قبلی من در اینجا
    اینکه یک دیسکت بوت ایبل داریم ولی توی ویندوز که میخوایم بازش کنیم میگه فرمت نشده!
    برای این منظور یه چیزی داریم به اسم بلوک 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
    
    	xor	bx, bx		; A faster method of clearing BX to 0
    	mov	ah, 0x0e
    	mov	al, 'J'
    	int	0x10
    
    	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 کامپیوترتون به صورت واقعی یک تست بگرید
    تصاویر پیوست شده تصاویر پیوست شده
    • نوع فایل: jpg Bochs3.jpg (30.4 کیلو بایت, 403 نمایش)

  12. 2کاربر از joker به علت ارسالش تشکر کردند.

    4w4r3 (12-14-2010),Averna (12-14-2010),A|iR3ZaM49icBoy (12-15-2010),Gondalof (10-10-2012),Mormoroth (12-14-2010),n_sh_17 (12-14-2010),reza.exe (12-14-2010),saber187518 (03-05-2011),shamimi (06-18-2012),shervin110 (12-27-2010),V1T4L (12-17-2010)

  13. #7
    تاریخ عضویت
    Dec 2005
    محل سکونت
    اصفهان
    نوشته ها
    4,931
    تشکر از ارسال
    1,770
    Thanked 1,401 Times in 345 Posts
    خب فقط الان یه توضیح کوتاه بدم در مورد چاپ رشته ها ( قاطی این آموزشها بود گفتم منم بنویسمشون)
    توی زبان استمبلی !( اسمبلی سابق) رشته ها را به این صورت تعریف میکنند :
    کد:
    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
    تصاویر پیوست شده تصاویر پیوست شده
    • نوع فایل: jpg Bochs4.jpg (35.0 کیلو بایت, 385 نمایش)

  14. کاربر زیر از joker به علت ارسالش ابراز تشکر کرد.

    4w4r3 (12-17-2010),mmkh (02-21-2014),saber187518 (03-05-2011),shervin110 (12-27-2010),V1T4L (12-17-2010),xman_1365_x (12-16-2010)

  15. #8
    تاریخ عضویت
    Dec 2005
    محل سکونت
    اصفهان
    نوشته ها
    4,931
    تشکر از ارسال
    1,770
    Thanked 1,401 Times in 345 Posts
    یه کم توضیحات.

    حلقه ها یا 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

  16. کاربر زیر از joker به علت ارسالش ابراز تشکر کرد.

    A|iR3ZaM49icBoy (12-17-2010),Gondalof (10-10-2012),hamedany (12-18-2010),m2000 (12-17-2010),qjjqjjq (04-15-2011),saber187518 (03-05-2011),shervin110 (12-27-2010),V1T4L (12-17-2010)

  17. #9
    تاریخ عضویت
    Mar 2006
    محل سکونت
    آيلند
    نوشته ها
    524
    تشکر از ارسال
    236
    Thanked 4 Times in 4 Posts
    با وجود سازگاري 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
    ......

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

  18. کاربر زیر از V1T4L به علت ارسالش ابراز تشکر کرد.

    A|iR3ZaM49icBoy (12-20-2010),Gondalof (10-10-2012),joker (12-20-2010),qjjqjjq (04-15-2011),saber187518 (03-05-2011),shervin110 (12-27-2010)

  19. #10
    تاریخ عضویت
    Feb 2006
    نوشته ها
    1,123
    تشکر از ارسال
    291
    Thanked 33 Times in 25 Posts
    به نظر مي رسه كه داريم سكتور 2 رو مي خونيم ولي اين ها كه تو سكتور 2 نيستند؟!!!

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

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

  20. کاربر زیر از h27 به علت ارسالش ابراز تشکر کرد.

    Gondalof (10-10-2012)

  21. #11
    تاریخ عضویت
    Dec 2005
    محل سکونت
    اصفهان
    نوشته ها
    4,931
    تشکر از ارسال
    1,770
    Thanked 1,401 Times in 345 Posts
    هر دو پست بالا را درست گفتین ، دوتا org نمیشه تعریف کرد توی برنامه و هم محل شروع قاعدتا باید سکتور دوم باشه که فرضا ممکنه موقع کپی فایل کرنل ،هرجائی این اتفاق بی افته ...
    برای این منظور باید در ادامه یه کم در مورد ساختار فت توضیح بدم و روشی که توی بوت سکتور طوری برنامه بنویسم که بیاد و از طریق خوندن اطلاعات فت ،واستفاده از جدول آدرس فایلها ، محل فیزیکی فایل کرنل را پیدا کنه و ادامه برنامه را به اون منتقل کنه ( راه حل منطقی )
    همین لودری که اون بالا ویتال گذاشته کارش اینه ، توضیحاتش را هم امشب یا فردا شب مینویسم ، یه کم این چند روز داشتم ناامید میشدم که اصلا کسی پیدا میشه اینا را بخونه یا نه

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

  22. 2کاربر از joker به علت ارسالش تشکر کردند.

    A|iR3ZaM49icBoy (12-20-2010),BLaDe (09-02-2012),Gondalof (10-10-2012),qjjqjjq (04-15-2011),saber187518 (03-05-2011),shervin110 (12-27-2010),V1T4L (12-21-2010)

  23. #12
    تاریخ عضویت
    Dec 2005
    محل سکونت
    اصفهان
    نوشته ها
    4,931
    تشکر از ارسال
    1,770
    Thanked 1,401 Times in 345 Posts
    هرچی میخوام این مطالب که چطوری محاسبه میشه و بوت لودر میاد هارد را سکتور به سکتور میخونه را بنویسم میبینم هم خودم کم فهمیدم هم مطالبش خیلی گنگه برام اینه که کلا بیخیال و یه پله را جا میندازیم میریم یه پله بعد و مستقیم یک لودر را تشریح میکنیم که عملا پله قبلی را توی دل خودش داره

    کد:
    ;*********************************************
    ;	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 بیتی توش بدیم همینجا بسته نگهش میداریم..


    سورسها به همراه فایلهای کامپایل شده و یک نمونه ایمیج از فلاپی ، اماده به کار در محیط بوچز ضمیمه
    فایل های پیوست شده فایل های پیوست شده
    • نوع فایل: zip Demo1.zip (7.3 کیلو بایت, 237 نمایش)

  24. کاربر زیر از joker به علت ارسالش ابراز تشکر کرد.

    A|iR3ZaM49icBoy (12-22-2010),behzadkhan (02-21-2013),bl4ckl0rd (12-25-2010),qjjqjjq (04-15-2011),reza.exe (12-22-2010),saber187518 (03-05-2011),V1T4L (12-22-2010)

  25. #13
    تاریخ عضویت
    Dec 2006
    نوشته ها
    9
    تشکر از ارسال
    10
    Thanked 0 Times in 0 Posts

    Red face كمك

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

  26. #14
    تاریخ عضویت
    Dec 2005
    محل سکونت
    اصفهان
    نوشته ها
    4,931
    تشکر از ارسال
    1,770
    Thanked 1,401 Times in 345 Posts
    این مال اینکه پستهای قبلی را خوب نمیخونی
    نوشتم که:
    این ستاره ها هم همون s*E*x هست که فیلتر میشه !
    خط به خط را بخونید ، حتی یک خط هم جا بندازین ممکنه به مشکلاتی بر بخورید.


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

  27. #15
    تاریخ عضویت
    Dec 2006
    نوشته ها
    9
    تشکر از ارسال
    10
    Thanked 0 Times in 0 Posts

    Unhappy

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

 

 

مجوز های ارسال و ویرایش

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