به نام خداوند بخشنده و مهربان!

سلام خدمت دوستان و همطنان گرامی!

از این رو که من توی برنامه نویسی بوت لودر سیستم عامل مشکلات کثیری برام پیش اومد تصمیم گرفتم راه حل مشکلات رو بزارم شاید بدرد کسی خورد s02

مشکل مقایسه اسم فایل کرنل در بوت لودر

خوب من برای این مشکل نزدیک 4 ساعت وقت گذاشتم! s12 واقعا داشتم نا امید میشدم که به لطف خدا یهویی به این فکر افتادم که باید استرینگ نام فایل کرنل رو توی برنامه بوت لودر رو با حروف بزرگ بنویسم!

مثلا فرض کنید شما فایل kernel.bin رو توی فلاپی رختید نام این فایل توی سیستم عامل KERNEL  BIN میشه! یعنی با حروف بزرگ نوشته میشه و این نکته اصلی این مشکل بود

 

تبدیل LBA به CHS

خوب این برای من یک مشکل خیلی بزرگ و یک هیولای ترسناک بود s05 چون از این موضوع میترسیدم. دلیلش هم این بود که دقیقا نمیدونستم چطوری باید اینارو بهم تبدیل کنم و اینم خودش یه اصل مهم بود! تا بالاخره یه جایی اینو خوندم و موضوع رو خوب شیر فهم شدم s15

ببینید شما باید برای بدست آوردن سکتور مقدار 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 خالی تقسیم میشه!

میتونید کد زیر رو ببینید که نوشتم و جواب هم داده s10

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

 

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

من داشتم کدم رو مینوشتم توی یه تابع ولی بدون اینکه تابع رو فراخوانی کنم وقتی برنامه ام رو کامپایل کردم دیدم برنامه درست اجرا نمیشه! یعد از کلی ور رفتن با برنامه متوجه شدم کد برنامه خیلی زیاد شده و بنابراین مشکلات پیش بینی نشده ای بوجود میاد!

اگه به این مشکل برخوردید باید کد های اضافی و رشته های اضافی رو پاک کنید تا فضای بیشتری برای بوتلودر داشته باشید!

 

پرش به آدرس دیگری در حافظه ( مکان لود شدن کرنل)

خوب میتونید از ترفند زیر برای اینکار استفاده کنید! s04

مقدار CS یا همون کد سگمت رو توی AX  قرار بدید و اونو PUSH کنید

مقدار افست رو توی BX قرار بدید و اونو PUSH کنید

از دستور العمل RETF برای پرش به AX:BX استفاده کنید! 

نکته : میتونید مقدار CS رو از طریق دستور العمل MOV AX,CS هم به AX انتقال بدید.

 

اجرای بوت لودر روی فلش USB

خیلی برای اینکار تلاش کردم و خیلی زحمت کشیدم و خیلی سرچ کردم s19

در نهایت از روی سورس یکی از سیستم عامل ها فهمیدم که در ابتدا شماره دیسک (فلاپی، هارد دیسک، فلش و...) توی ثبات dl ذخیره هست! این نکته بسیار مهمی بود!

یعنی اینکه وقتی بوت لودر باز بشه شما میتونید مقدار dl رو توی یه متغییر ذخیره کنید و هرجا به شماره دیسک نیاز داشتید از متغییر استفاده کنید!

 

امیدوارم مطالب بالا به دردتون خورده باشه!

فعلا یا علی مدد