به نام خداوند بخشنده و مهربان!
سلام خدمت دوستان و همطنان گرامی!
از این رو که من توی برنامه نویسی بوت لودر سیستم عامل مشکلات کثیری برام پیش اومد تصمیم گرفتم راه حل مشکلات رو بزارم شاید بدرد کسی خورد
مشکل مقایسه اسم فایل کرنل در بوت لودر
خوب من برای این مشکل نزدیک 4 ساعت وقت گذاشتم! واقعا داشتم نا امید میشدم که به لطف خدا یهویی به این فکر افتادم که باید استرینگ نام فایل کرنل رو توی برنامه بوت لودر رو با حروف بزرگ بنویسم!
مثلا فرض کنید شما فایل kernel.bin رو توی فلاپی رختید نام این فایل توی سیستم عامل KERNEL BIN میشه! یعنی با حروف بزرگ نوشته میشه و این نکته اصلی این مشکل بود
تبدیل LBA به CHS
خوب این برای من یک مشکل خیلی بزرگ و یک هیولای ترسناک بود چون از این موضوع میترسیدم. دلیلش هم این بود که دقیقا نمیدونستم چطوری باید اینارو بهم تبدیل کنم و اینم خودش یه اصل مهم بود! تا بالاخره یه جایی اینو خوندم و موضوع رو خوب شیر فهم شدم
ببینید شما باید برای بدست آوردن سکتور مقدار Logical سکتور را بر تعداد سکتور ها در هر تراک (Sector Per Track) تقسیم کنید ( که این عدد توی فلاپی های FAT12 معمولا 18 هست)
باید مقدار سکتور LBA رو توی رجیستر AX قرار بدید تا بشه تقسیمش کرد!
باید دقت داشته باشید که مقدار Sector Per Track بر دو رجیستر DX:AX تقسیم میشه! پس باید مقدار DX رو برابر صفر کنیم!
حالا خیلی دقت کنید که بعد از تقسیم ما دو مقدار داریم 1- خارج قسمت (AX) و 2- باقی مانده (DX) . ما برای بدست آوردن سکتور کافیه باقی مانده (DX) رو با عدد یک جمع کنیم.
حالا اصلا به مقدار AX دست نزنید. چون مقدار درون AX برابر با خارج قسمت تقسیم قبلی هست که ما به اون برای بدست آوردن شماره هد و تراک نیاز داریم!
بنابراین مقدار DX رو دوباره صفر کنید و این بار AX رو بر تعداد هد ( که معمولا 2 هست ) تقسیم کنید. دوباره دو مقدار باقی مانده و خارج قسمت خواهیم داشت که مقدار AX برابر با تراک و مقدار DX برابر با Head خواهد شد.
یه مثال میزنم که خوی متوجه بشید!
ببینید فک کنید ما میخوایم CHS سکتور دایرکتوری ریشه که در سکتور 19 هست رو بدست بیاریم
ابتدا عدد 19 رو بر 18 (تعداد سکتور در هر ترک) تقسیم میکنیم باقی مونده و خارج قسمت میشه 1. بعد میایم و باقی مونده که 1 هست رو با 1 جمع میکنیم و میشه 2 بنابراین سکتور ما میشه 2
حالا خارج قسمت هم که یک بود. ما میایم خارج قسمت رو بر 2 (تعداد هد در هر کلاستر) تقسیم میکنیم و خارج قسمت میشه 0 چون 1 تقسیم بر 2 نمیشه بنابراین تراک ما میشه 0 و خارج قسمت تقسیم 1 بر دو میشه 1 بنابراین هد ما میشه 1 و در نهایت ما مشخصات زیر را بدست میاریم
C: 0
H: 1
S: 2
نکته: وقتی خواستید Sector Per Track رو بر مقدار AX تقسیم کنید حتما باید Sector Per Track رو WORD بزارید تا بر DX:AX تقسیم بشه در غیر اینصورت بر AX خالی تقسیم میشه!
میتونید کد زیر رو ببینید که نوشتم و جواب هم داده
push ax
mov dx,0
div word [bpbSectorsPerTrack] ; 18
inc dl
mov cl,dl
mov dx,0
div word [bpbHeadsPerCylinder]
mov dh,dl ;head
mov ch,al
pop ax
ret
مشکل افزودن کد به بوت لودر و خراب شدن بوت لودر
من داشتم کدم رو مینوشتم توی یه تابع ولی بدون اینکه تابع رو فراخوانی کنم وقتی برنامه ام رو کامپایل کردم دیدم برنامه درست اجرا نمیشه! یعد از کلی ور رفتن با برنامه متوجه شدم کد برنامه خیلی زیاد شده و بنابراین مشکلات پیش بینی نشده ای بوجود میاد!
اگه به این مشکل برخوردید باید کد های اضافی و رشته های اضافی رو پاک کنید تا فضای بیشتری برای بوتلودر داشته باشید!
پرش به آدرس دیگری در حافظه ( مکان لود شدن کرنل)
خوب میتونید از ترفند زیر برای اینکار استفاده کنید!
مقدار CS یا همون کد سگمت رو توی AX قرار بدید و اونو PUSH کنید
مقدار افست رو توی BX قرار بدید و اونو PUSH کنید
از دستور العمل RETF برای پرش به AX:BX استفاده کنید!
نکته : میتونید مقدار CS رو از طریق دستور العمل MOV AX,CS هم به AX انتقال بدید.
اجرای بوت لودر روی فلش USB
خیلی برای اینکار تلاش کردم و خیلی زحمت کشیدم و خیلی سرچ کردم
در نهایت از روی سورس یکی از سیستم عامل ها فهمیدم که در ابتدا شماره دیسک (فلاپی، هارد دیسک، فلش و...) توی ثبات dl ذخیره هست! این نکته بسیار مهمی بود!
یعنی اینکه وقتی بوت لودر باز بشه شما میتونید مقدار dl رو توی یه متغییر ذخیره کنید و هرجا به شماره دیسک نیاز داشتید از متغییر استفاده کنید!
امیدوارم مطالب بالا به دردتون خورده باشه!
فعلا یا علی مدد