چگونگی طراحی سیستم عامل

182 views
Skip to first unread message

network

unread,
Mar 8, 2006, 4:58:14 AM3/8/06
to Persian_OS
به نام خدا

سلام به همگی .

طراحي سيستم عامل قسمت دوم وسايل و پيش
نياز ها

شروع به کار برای ساختن یه سیستم عامل :

قدم اول:
به نظر می رسه که بیشتر مردم دلشون می
خواد که یك سیستم عامل بنویسند. اما نمی
دونن که از کجا باید شروع کنند و یا اینکه
چه زبان یا زبانهایی برای این کار لازم
دارند ( باید بلد باشند).
خوب , وقتی که من هم می خواستم سیستم عامل
خودم رو بسازم مثل شما بودم بنابراین این
مقاله ی تمرینی رو براتون نوشتم تا شروع
به ساختن یه سیستم عامل برای خودتون
بکنید . من این مقاله رو بصورت سوال و
جواب نوشتم تا فهمش براتون آسون باشه

1 ) سوال : من باید چه زبان های برنامه
نویسی رو بلد باشم تا بتونم یه سیستم
عامل بسازم ؟

جواب : شما باید زبان اسمبلی ASM رو بلد
باشید تا بتونید BootSector خودتون رو بسازید
.(بنویسید) (بقیه ی توضیحات تو این زمینه
تو سوال بعدیه ) و چند تا چیز دیگه . من به
شما پیشنهاد می کنم که زبان C/C++ رو هم یاد
بگیرید (اقا این علامت + بیخود رفته پشت c .
این جلویه C هستش .++c حالا درست شد . نگید
من یه زبان جدید از خودم در آوردم .) چون
بیشتر از زبان اسمبلی قابل فهمه . بعد از
این شما می تونید هم از زبان اسمبلی و هم
از زبان سی تو ساخت سیستم عاملتون
استفاده کنین.


2 ) سوال :بوت سکتور دیگه چیه ؟

جواب : بوت سکتور (فعال سازی قست اولیه) یه
برنامه کوچیکه که تو یه فلاپی دیسک یا
هاردیسک نگهداری کرد . این بوت سکتور
مسعول پیدا کردن کرنل شما ( کرنل قسمت
اصلی سیستم عامل شماست که بیشتر کارا رو
انجام می ده ) بارگذاری اون تویه حافظه و
بعدشم اجرای اونه .

3 ) سوال : آیا لازمه که من قبل از اینکه یه
سیستم عامل بسازم , یه سیستم عامل دیگه رو
سيستمم نصب داشته باشم ( یعنی یه سیستم
عامل دیگه نصب باشه)؟

جواب : آره . بیشتر مردم از ویندوز یا
لینوکس برای ساختن یه سیستم عامل
استفاده می کنن .

4 ) سوال : من باید از چه کمپایلرهایی
استفاده کنم ؟

جواب : برای زبان اسمبلی من NASM رو پیشنهاد
می کنم . چون اولا هم رایگانه . هم مستندات
خوبی داره هم خروجی که داره فرمتهای
مختلفی رو پشتیبانی می کنه ( یعنی
فرمتهای مختلفی رو می تونید ازش بیرون
بیارید .) برای اکثر سیستم عامل ها هم در
دسترس هست . کد منابعش هم در دسترسه و
بیشتر نمونه های اسمبلی بکار رفته برای
ساخت یه سیستم عامل به اون نیاز دارن .
برای زبان C هم GCC رو پیشنهاد میکنم (
البته تحت سیستم عامل های لینوکس و DJGPP و
همینطور ویندوز ( یعنی اینکه اگه اینا رو
نصب کردید ) ( هر دو تا ی اینا با بقیه
سازگارند )


5 ) سوال : حالا چجوری من بوت سکتور سیستم
عاملم رو Bootable (قابل بالا امدن در اول
شروع به کار سیستم عامل ) کنم ؟

جواب : شما برای این کار باید خروجی فایل
رو رو فرمت Flat binary تنظیم کنید .
یعنی باید فایل شما موقعی که می خواهد از
خروجی بیاد بیرون Flat binary باشه .
برای NASM از f bin- استفاده کنین . اگه از C یا
++C استفاده می کنین شما باید از یه ارتباط
دهنده (linker) برای این کار استفاده کنید (
سوال بعدی رو ببینین )

6) سوال : این ارتباط دهنده دیگه چیه و
چجوری از اون تو ساخت یه سیستم عامل
استفاده کنیم ؟
جواب : ارتباط دهنده یا Linker فایلهای
خروجی که کمپایلرها بوجود میارند رو
میگیره و اونا رو به یك فایل ديگر ارتباط
می دهد . برای ساخت یه سیستم عامل , شما
بطور معمول می خواهید که فایلهاتون رو با
فایلها Flat binary ارتباط بدید , برای LD (
ارتباط دهنده ای که بیشتر اوقات با DJGPP و
GCC استفاده میشه ) از گزینه ی oformat binary--
استفاده کنید . اگر شما از LD استفاده کنید
باید از یه اسکریپت ارتباط دهنده برای
کنترل بهتر ارتباطها استفاده کنید
.پیشنهاد من رو برای ساختن سیستم عاملتون
ببینید .


7 ) سوال : حالت Real Mode یا مد واقعي چیه ؟

جواب : Real Mode یا حالت واقعي , عنوان لفظیه
که در (X86) 386 486 pnetium) و غیره ) وجود داره
زمانی که شما برای دفعه ی اول
کامپیوترتون رو روشن می کنید . سيستم به
اين مد مي رود (مد پيش فرض). در واقع در
اينجا منظور از مد واقعي همون حالت 16
بيتي هست كه سيستم پس از روشن شدن ابتدا
در مد واقعي (16 بيتي) هست و پس از انجام
دادن كارهاي كه در ادامه مقاله مي خوانيد
به مد محافظت شده (32 بيتي) سويچ مي كنيم
ويندوز و لينوكس در مد حفاظت شده كار مي
كنند (32 بيتي). اما این حالت واقعي چند تا
مشکل اساسی داره:


1 ) این حالت از لحاظ امنیتی و محافظتی کمي
داره , توانایی که برنامه ها رو از گم به
گور شدن و یا باعث هنگ کردن همديگه ميشه
باز میداره (این توانایی وجود نداره ) مثل
محيط داس كه شما مي توانيد در هر جاي از
حافظه مي خواهيد دادهاتون رو بنويسيد و
ممكن شما اشتباهأ در محلي كه سيستم عامل
در انجا هست دادهاتون رو بنويسيد و باعث
هنگ كردن سيستم عامل بشيد و شايد برنامه
شما مشكلي داشته بشه و باعث بشه دادهاي
رو در محل هاي حساسي از حافظه مثلا روي
سيستم عامل يا بردار وقفه بنويسه و باعث
فروپاشي ( كراش) سيستم عامل بشه يعني از
برنامه ها براي دسترسي به حافظه ديگر
برنامه ها در حال اجرا محفاظت نميشه

2 ) شما فقط مي توانيد از یك برنامه در آن
واحد استفاده (اجرا) كنيد حتي اگر شما
قابليت چند ريسماني رو براي سیستم
عاملتون در مد واقعي فراهم كنيد بازهم به
دليلي كه در قسمت قبلي گفتم سيستمتون
پايدار نيست و اشكال در يك برنامه باعث
كراش شدن كل سيستم ميشه يعني شما اگر
براي سيستم عاملتون در مد واقعي قابليت
چند ريسماني فراهم تنها امكان كراش شدن
بيشتر سيستم عاملتون رو فراهم كرديد پس
شما نمي تونيد در اين مد چند ريسماني
روبكار بگيريد و شما محدود به اجراي يك
برنامه در هر لحظه هستيد

3 ) شما تنها به یك (1) مگابایت فضا برای
ادرس دهی محدود هستيد.
4 ) شما حتما باید از سگمنت ها (Segment) برای
دسترسی به حافظه استفاده کنین

8 ) سوال: حالت Protedcted Mode یا مد محافظت شده
چیه؟
جواب :حالت محافظت شده ( به PMode هم معروف
هست ) , یه مد پیشرفته تر از از حالت واقعي
یا Real Mode هست

حالت محافظت شده نسبت به حالت واقعي
چندین مزیت داره :

1 ) حالت محافظت شده , حالتي هست كه برنامه
ها از دسترسي به حافظه همديگر حفاظت مي
شوند. قابلیت و توانایی که باعث میشه ,
برنامه گم و گور نشن و یا باعث اختلال در
کار هم نشوند . (اسم اين حالت هم به همين
دليل Protedcted هست.)

2 ) این امکان هست که شما چند برنامه
همزمان در حال اجرا داشته باشید (مثل
لینوکس یا ویندوز )

3 ) شما به 4 گیگابایت فضا برای ادرس دهی
دسترسي داريد , آره کف نکنید 4
گیگابایت فضا براي ادرس دهي داريد (زمانی
که درگاه A20 فعال شده باشه درباره A20 سوال
نکنید . سوال بعدی رو ببینید .)

4 ) شما میتونید از صحفه ها براي دسترسي به
حافظه استفاده كنيد بر خلاف مد واقعي كه
سگمنتها براي دسترسي به استفاده مي شوند
در مد حفاظت شده از صحفه ها براي دسترسي
به حافظه استفاده مي شود با استفاده از
صحفه بندي و چند قابليت ديگر ريز
پردازنده امكان پياده سازي حافظه مجازي
براي ما فراهم مي شود و ما مي توانيم به
حافظه نا محدودي دسترسي داشته باشيم
(صحبت در مورد صحفه بندي مفصل هست و نميشه
در اين مقاله بهش پرداخت و خودش يك مقاله
ديگري طلب مي كنه . براي اطلاعات بيشتر در
مورد صحفه بندي مي توانيد كتابهاي كه در
مورد سيستم عامل هست رو مطالعه كنيد)

5 ) اگر تا الان نگرفتین باید بگم که سیستم
عامل شما باید در حالت حفاظت شده اجرا
بشه . مگر اینکه شما دلیل خاصی داشته
باشید که بخواین از حالت مزخرف مد واقعي
استفاده کنید .(پس ما در حال عادی از حالت
حفاظت شده برای اجرای سیستم عامل
استفاده می کنیم.)

9 ) سوال : راستی اون درگاه A20 که گفتی , چیه
؟

جواب:ریز پردازندها 8086 (پردازنده ای که
قبل از 286,386,486و پنتیوم و غیره ... اومدن )
تنها میتونستن به یک مگابایت فضا برای
آدرس دهی دسترسی داشته باشند . برای اون
موقع گستره مقدار حافظه 20 تا ادرس 1
بیتی(نه بايت !) از A0 تا َA19 سودمند و مفید
بود . بعدش اینتل 80286 رو اختراع کرد و ساخت
( که بعدا فقط بهش 286 میگفتن ) 80286 می تونست
تا 16 مگابایت فضا برای ادرس دهی دسترسی
پیدا کنه . ولی 80286 باید با 8086 سازگار مي
شد . (برنامه هایی بودند که برای 8086 ساخته
شده بودند که حالا بايد روي 80286 اجرا
بشوند .) حالا خر بیارو باقالی بار کن .
حالا راه حل برای اینکه 80286 قابلیت
دسترسی به فضای مورد نیاز برای ادرس دهیش
بیشتر شه چیه ؟ در عین حال بعضی برنامه ها
بر روی این واقعیت که ادرسها دور وره یه
چیزی حدود 1 مگابایت جمع اوری و ساخته شده
شدن, استوار بود . بچه ها , بیاین اینو
طوری که 8086 میدید ما هم ببینیم , شما ادرس
11111111111111111111 ( 20تا 1) رو در یک سیستم دوتایی
(Dual asystem) دارید و به اون یه یک (1) اضافه
میکنید . فکر میکنید چه اتفاقی می افته ,
نتیجه صفره . چونکه شما بیست و یکمین بیت
رو ندارید (A20!) ولی در واقع 80286 بیت های
بیشتری داشت . برای حل این مشکل اینتل 80286
رو ساخت , درگاه A20 رو غیر فعال کرد و
گستره ی ادرس دهی رو به 20 بیت (َََA20)
رسوند .(محدود کرد). خوب ,پس برای دسترسی
به بیشتر از یک مگابایت حافظه , ما باید
درگاه 20 یا A20 رو فعال کنیم .

10 ) سوال : انتخاب گر یا Selector چیه ؟
یه انتخاب گر ( بعضی وقت ها , بهش شناسه یا
توصیف گر هم می گويند . ) معنیه یه بخشه .
یعنی اینکه کار و وظیه ای که براش از قبل
تعيین شده ,رو مشخص می کنه ) که اطلاعاتی
از و ظایف و کار های بخش پایه رو در خودش
داره . مثل اساس بخش (Segment base) (این شروع
کننده است) و حد بخش (این طولشه ) . هر
انتخابگر 64 بیتی هست . اطلاعات بیشتر از
این دوتا رو تو قسمت GDT و LDT بخونید .


11 ) سوال : GDT چیه ؟
GDT یه میزه (یه بخش ) که حاوی انتخابگره .
اساسا GDT ادرس اولیه رو برای ادرس دهی
تمامی انتخاب گر ها بو جود می اره . (صحبت
در مورد GDT مفصل هست و خودش يك مقاله
جداگانه طلب مي كند)


11 ) سوال : Interrupt یا وقفه چیه؟
جواب : وقفه یا Interrupt یه علامته که باعث
میشه cpu از انجام عملیاتی که در حال حاضر
در حال انجامشه دست بکشه . این به cpu میگه
که یه عملیات مهم رسیده , برای مثال يك
قطعه سخت افزاري مثل موس با هر حركت يا
فشرده شدنش (كليك) يك پيغام به CPU مي فرسته
و باعث ميشه كه CPU برنامه اي كه در حال
اجرا داره رو به طور موقت تا زمان
پاسخوگوي به وقفه كنسل كنه و سپس شماره
وقفه داده شده رو مي گيره (هر سخت افزار
خارجي يك شماره وقفه خاص داره ) و متناسب
با اون شماره از جدول بردار وقفه كه مشخص
هست (مثلا در داس از 0x0000 تا 0x03FF هست) ادرس
روالي (تابع يا زير برنامه) كه بايد با
فعال شدن اين وقفه اجرا بشه رو مي گيره و
بعد محل روالي كه در حال اجرا كردنش بود
رو به علاوه تمام رجيسترها رو در پشته
ذخيره مي كنه و CPU به اين محل (تابع وقفه)
پرش مي كنه و بعد از اجرا شدن اين تابع
دوباره آدرس برنامه اي كه در حال اجراش
بود رو از پشته بر مي داره به علاوه تمام
رجيستر ها و دوباره كارش رو ادامه مي دهد
(انجام برنامه اي كه اول در حال اجراش
بود) همونطور که می دونید وقفه ها.
تنظیمات مخصوص به خودشونو دارن . برای
مثال , اونا می تونن از Ring 3 به Ring 0 تغییر
پیدا کنن و مورد استفاده قرار بگیرن
بيشتر خود سيستم عامل ها اينكار رو
اننجام مي دهند (عوض كردن Ring ها) .اونا می
تونن در یه سیستم عامل به عنوان راهی
برای انجام مکالمات سیستم استفاده بشن
.مکالمات سیستمی لینوکس هم بر همین
مبناست . (در واقع وقفه هستند كه تمام
كارها سيستم رو انجام مي دهند و بي نهايت
مهم هستند وقفه ها به سرعت اجرا مي شوند و
دقت كنيد همين حالا كه داريد اين متن رو
مطالعه مي كنيد در هر ثانيه بيش از 100 ها
وقفه در سيستم شما اتفاق مي افتد ! )

13 ) سوال : PIC چیه ؟
جواب : مخفف کنترل گر وقفه قابل برنامه
ریزی است , یك وسیله ای هست که در خواست
های سخت افزار ها برای وقفه ( خاتمه ی یک
عملیات و شروع عملیات دیگر ) رو جمع اوری
میکند. و به Cpu علامت می ده که یه وقفه
اتفاق افتاد . وقتی که این اتفاق می افته ,
هم PIC و Cpu هر دو با هم ارتباط بر قرار می
کنن و وقفه گر رو برای اجرای درخواست
جدید اجرا می کنن .

14 ) سوال : حالا این PIT یعنی چی ؟
PIT مخفف زمانسنج وقفه قابل برنامه ریزی
هست . یه زمانسنج سخت افزاری قابل برنامه
ریزی ( شما می تونید سرعتش رو تغییر
بدهید) هستش که وقفه رو از بین می بره
زمانی که کارش تموم می شه اي زمان سنج بر
روي خط صفر وقفه مي دهد (IRQ O) این وقفه
اصلي هست كه براي زمان بندي Task ها از
استفاده مي شود (با اين وقفه چند ريسماني
پياده سازي مي شود)


15) سوال : بر چه اساس و ترتیبی من باید
سیستم عاملمو بسازم ؟
جواب :خوب شما می تونید , تقریبا از هر
جایی شروع کنید , ولی مطمعنا وقتی کارتون
تموم شد یه دو جین باگ و سوراخ سمبه پیدا
می کنید . من پیشنهاد می کنم که شما اول یه
بوت سکتور بسازین , بعدش یه کرنل پایه
بسازید و بعد هم بقیه رو به کرنل اضافه
کنین .

16)سوال : بازم یه سوال دیگه :قدمهای اساسی
و اولیه برای وارد شدن به حالت محافظت
شده در موقع بوت چیه ؟

جواب:
1 ) وقفه ها رو غیر فعال کنید تا چیزی گم و
گور نشه تا در موقع وارد شدن به مد محافظت
شده وقفه اي اجرا نشه چون اگر در موقع
وارد شدن به مد محافظت شده وقفه اي جرا
بشه به احتمال زياد سيستم هنگ (كراش) مي
كند
2 ) GDT رو نصب کنید (با دستور Lgdt در اين مورد
در مقالات بعدي صحبت خواهد شد ) .
3 )A20 رو فعال کنید .
4 ) اولین بیت از رجيستر CR0 رو 1 کنید.
5 ) مقدار مناسب رو در سگمت هاي ES و DS و SS و
FS و GS قرار دهيد (در اين مورد در مقالات
بعدي توضيح داده خواهد شد)
6 ) رجيستر و سگمنت CS و EIP رو با مقدار های
درست , بوسیله ی یک پرش بلند, بارگذاری
کنید . (در اين مورد در مقالات بعدي توضيح
داده خواهد شد)
7 ) حالا شما تو حالت محافظت شده هستید !

ThanX t0 th3 Master f0r Translati0n
ThanX t0 th3 _LOVE_CODER_ f0r advic3
C0nv3rt3d by netspc

Reply all
Reply to author
Forward
0 new messages