• 1 رای - 5 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
توسعه هسته لینوکس
#1
مقدمه
در این مقاله(ها) قصد دارم برنامه نویسی هسته لینوکس 2 و 3 رو آموزش بدم.

اول برخی از اصول سیستم عامل و هسته لینوکس(از جمله Version های هسته، دانلود سورس، ساختمان دایرکتوری سورس، چگونگی نصب، Patch کردن، پیکربندی و Compile) رو معرفی می کنم و بعد به مباحث پیشرفته و برنامه نویسی(از قبیل تفاوت بین kernel-space و User-space، سازه های برنامه نویسی استفاده شده در هسته، Process ها، Systemcall ها، ساختمان داده هسته، Interrupt handler ها، همگاه سازی، مدیریت Time، مدیریت حافظه، سیستم فایل و خروجی/ورودی) می پردازم.

در این بین از کتابهای Advanced Linux programming، Linux Advanced Administration و Linux Kernel Development هم بهره ای می گیرم.

سیستم عامل
همینطور که می دونید سیستم عامل نرم افزاری هست که بعنوان رابطی بین کاربر و سخت افزار عمل می کنه. همچنین به عنوان یک تخصیص دهنده منابع از جمله حافظه، زمان پردازش، فضای ذخیره سازی، کنترلر دستگاه های I/O و غیره... بشمار میره.
هدف اصلی سیستم عامل، مدیریت منابع سخت افزاری و نرم افزاری (یا همان داده) و همچنین بعنوان یک ماشین توسعه یافته بوده که به مرور زمان به قدرت، انعطاف پذیری و کاراییش افزوده شده.

انواع ساختار سیستم عامل
1- نوع Monolitic: این نوع سیستم عامل ها که به no-structure ها هم معروفند، ساختار خاصی ندارند و از یکسری روتین(یا رویه) که هر کدوم وظیفه خاصی دارن تشکیل شده اند.
در این نوع سیستم عامل ها به علت یکپارچگی و پیوستگی کد، هر روتین قادره روتین دیگه رو براحتی Call کنه. البته از طرفی هم وجود یک باگ در هسته منجر به Down شدن کل سیستم میشه.
در این نوع سیستم عامل ها هیچ گونه طبقه بندی و اولویت بندی برای روتین ها وجود نداره و کل سیستم از یک Core و تعدادی Extension ماژولار(در قدیم) تشکیل شده. که امروزه به شکل ماژول تغییر یافته. مثل Unix - Linux - BSD - MsDOS و...
خود Core هم از تعدادی Subsystem که شامل شبکه، صوت، I/O، حافظه و غیره... هست تشکیل شده.
[عکس: Monolitic-kernel.png]
ساختار سیستم Monolitic

2- نوع Layered: این نوع سیستم عامل ها کلیتی از طرح Monolitic ها دارند بعلاوه روتین ها در لایه های مختلف و طبقه بندی شده قرار می گیرند و بر اساس اولویت به وظایفشون عمل می کنند.
مهمترین لایه در این نوع سیستم عامل ها هسته(Kernel) هستش که مستقیماً هم به منابع سخت افزاری دسترسی داره. مثل OS2.
همچنین روند توسعه و تکامل هسته در این نوع سیستم عامل ها راحتتر و سریعتر هستش.
منطق ارتباطیش هم برای لایه ها به صورت کلی به این شکله:
Operator->User programs->Input/output mgmt->Operator-process com->Memory mgmt->Processor allocation and multiprog

3- نوع Virtual Machine: در این ساختارکاربر نیازی به تطبیق خود با سیستم عامل رو نداره و فقط از طریق واسط نرم افزاری، با سیستم عامل و سخت افزار(شبیه سازی شده) ارتباط برقرار می کنه(در واقع سیستم رو روی منابع مجازی اجرا می کنه). مثل VMware

4- نوع Client/Server: این نوع عمدتاً به دو بخش اصلی Client که فرمان رو صادر میکنه و Server که فرامین رو اجرا می کنه تقسیم میشه. و معمولاً برای فعالیت های شبکه ای، میزبانی و غیره... ازش استفاده میشه. مثل Netware و Windows Server.

هسته
هسته یا Kernel مهمترین و حساس ترین بخش هر سیستمی هست که مستقیماً با منابع(یا سخت افزار) سروکار داره. که معمولاً هم حاوی تعدادی ماژول/کامپوننت، سیستم مدیریت حافظه، سیستم زمانبندی(Scheduler)، درایور های دستگاه ها، سیستم فایل، شبکه و غیره... میشه.
ابتدا در خواست های کاربر وارد Shell و سپس Buffer های ورودی(Input) توسط Shell پیمایش و برای هسته تفسیر میشه. در صورتی که درخواست ها/تفسیرات معتبر اعلام بشن، هسته روتین مورد نظر رو فراخوانی و اجرا می کنه. به این ترتیب سرویس مورد نظر در اختیار کاربر قرار می گیره(Output); و در صورت نامعتبر بودن درخواست کاربر، توسط Shell، پیام خطایی به خروجی فرستاده میشه.
از مزایای سیستم عامل های مبتنی بر یونیکس اینه که به یک مفسر/Shell وابسته نیستند، و از Shell های مختلفی پشتیبانی می کنند. مثل BASh – cSh – zSh – rSh - tSh و...

در تصویر زیر می ببینید که لایه های مختلف در یک سیستم(لینوکس) چگونه با هم ارتباط برقرار می کنن:
[عکس: linux-system.jpg]

انواع معماری هسته
نوع MonoliticKernel: این نوع هسته ها یکپارچه هستند، تمامی خدمات/تسهیلات سیستم عامل در مرکز هسته قرار دارند و بیشتر پردازش ها هم در محیط هسته(Kernel-space) صورت می گیره. نصب و پیاده سازی هسته بر روی سیستم های مختلف راحت و کارامد هستش(اگر خوب طراحی بشن) و البته بدلیل یکپارچگی و وابستگی بین اجزای سیستم، یک اشکال در یک Driver منجر به سقوط دیگر بخش های سیستم خواهد شد.
در این نوع هسته ها اغلب فعالیت ها توسط Systemcall ها صورت میگیره، ساختار این Systemcall ها در داخل برنامه ها تعبیه شده، بشکلی که یک نسخه از آن برای Caller جهت بررسی فرستاده بشه. که این یک دلیل پویا بودن هسته لینوکس در Load کردن ماژول های داخلیش شده.
یکی دیگر از معایب این نوع هسته ها اینه که برنامه نویسی در فضای هسته(Kernel-space) صورت می گیره، در نتیجه دسترسی به کتابخانه های کامل و همگانی(مثل LibC) امکانپذیر نیست و با محدودیت هایی روبرو هستید.
دیگر اینکه اشکال زدایی(Debuging) بسیار مشکل هست. بروز یک باگ در یک بخش، عوارض جدی در کل سیستم بوجود میاره: بدلیل اینکه هر تابع یا ساختمان داده در هسته اغلب Privilege ها و قوای سیستم رو در اختیار داره.
از جمله هسته های نوع Monolitic هم می توان Linux – BSD – Unix Solaris و DOS رو نام برد.

دو نوع اصلی دیگه هم وجود داره که MicroKernel و ExoKernel نام داره، ولی ما در این مقالات کاری باهاش نداریم. lol

ادامه دارد...


فایل‌های پیوست تصاویر بندانگشتی
       
وبلاگ: Yousha.Blog.ir


 کد کمتر => خطای کمتر => قابل فهمتر => خوانایی بالاتر => نگهداری بهتر

  پاسخ


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان