:هرد یا لینوکس

    
همه ما اسم گنو لینوکس را شنیده ایم، پروژه ی دانشجوی فنلاندی لینوس توروالدز که امروزه در تمام دیوایس های مین فریم ها، سروها، کامپیوترهای شخصی،موبایل ها، نوت بوک ها و مینی کامیپوتر ها مانند رزپری پای، کوبی برد و بردهای امبدد و انواع میکروپروسسور های معروف از اینتل x86 تا آرم و … حضوری فعال پیدا کرده است. حداقل یکی از اپشن های شما در هر حیطه کاری گنو لینوکس و ابزارهای قدرتمند آن می باشد. کار لینوس نوشتن کرنل بود، که در کنار ابزارهای گنو، به گنو لینوکس معروف شد،اما بحث این پست بنده در مورد کرنل ها خواهد بود،کرنل چیست؟ اهمیت و تفاوت کرنل ها در چیست؟

کرنل چیست:

هر کامپیوتر از یک سری واحدهای سخت افزاری تشکیل شده است. مانیتور، حافظه، سی پی یو، پورت ها ی ورودی و خروجی و غیره . روزی که یک سخت افزار را خریداری می کنیم، کار زیادی با آن سخت افزار نمی توانیم، انجام دهیم، مگر در حد بالا آوردن بایوس و یک سری اپشن های خاص، ما باید یک سیستم عامل را روی سخت افزار خود نصب کنیم، تا کامپیتور ما لذت تکنولوژی را به ما انتقال دهد. خود سیستم عامل یک بستر (اصطلاحا پلتفورم)است، که  اینترفیس ها و اپلیکشن های زیادی را ارایه می کند. یک بخش از سیستم عامل که به عنوان یک واسط با قسمت های سخت افزاری کار می کند، کرنل (kernel) یا هسته(nucleus) خوانده می شود. در سمت کرنل شما فقط با سخت افزار کار دارید و بس. اصلا از وجود زبان های برنامه  نویسی سط بالا خبری نیست، فقط همان سی و اسمبلی باید کد بزنیم. لازم است ذکر کنم برنامه نویس های سی و اسمبلی (برنامه نویسان سیستمی) تعدادشون خیلی کمتر از زبان های سطح بالا است، که یک روال طبیعی است، چون کرنل نوشتن کار هر کس و هر شرکت نیست. تعداد شرکت هایی که روی کرنل کار می کنند، خوب قاعدتا خیلی کمتر است. همان داستان تقاضا و عرضه.
خوب فکر می کنیم تا حدودی متوجه شدید هدف  کرنل چیست، کرنل اولین لایه مدیریت واحدهای سخت افزاری ما می باشد. حالا یک سوال دارم، فرض کنید، که شما زبان سی را در حد متوسط و قابل قبولی می دانید. یک خورده هم دانش اسمبلی را ۸۰۸۶ ها را در دانشگاه مطالعه کرده اید، رود مپ خود برای مدیریت واحدهای سخت افزاری بیان کنید؟
این واحدهای سخت افزاری تاحدودی شبیه همان برد های امبدد میکروکنترلرهای  ای آر ام(َARM) می باشد، با این تفاوت که واحد های سخت افزاری پی سی  بیشتر و قوی تر می باشد. به خاطر این اسم میکروهای ارم را ذکر کردم، کسانی که تا حدودی با امبدد آشنایی دارند، راحت تر سخت افزارهای پی سی را می توانند درک کنند.
مروری بر کرنل:
روندی که برای طراحی سیستم عامل سال های دهه ۱۹۶۰ در شرکت آزمایش گاهای بل توسط دنیس ریچی و کن تامسون پیش گرفته شد، سیستم های یونیکسی را به ارمغان آورد. بعد از آن انواع سیستم های یونیکسی توسط شرکت های مختلف توسعه داده شد، که اکثر آنها تجاری بودند.روزی که لینوس به علت نبود یک سیستم یونیکس اپن سورس و مناسب تصمیم به نوشتن کرنل خود کرد، سعی کرد تا استانداردهای لینوکس را در کرنل خود پیاده کند و به اختراع دوباره چرخ نپردازد. نمونه بارز اختراع چرخ ویندوز که سعی کرد استانداردهای خودش را تحمیل کند، که موفقیت چندانی بدست نیاورده است، هرچند که این روزها از حضور بش اوبنتو در ویندوز ۱۰ خبر می دهند که این خود گواه این است مایکروسافت مجبور به عقب نشینی شده است. در یک سیستم عامل فضای آن را به دوسته تقسیم می کنند.

  • یوزر اسپیس:

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

  • کرنل اسپیس:

بخشی از سیستم عامل که با کالها و فراخوان های سیستمی سروکار دارد، مثل خواندن دیتا از ماژول وایرلس لب تاپ، خواندن دیتا از سی دی رم، خواندن دیتای رم، کالهای اینترپت ها و … کرنل اسپیس خوانده میشود. قاعدتا مهارت برنامه نویس سطح بالا در این بخش به شما کمکی زیادی نخواهد کرد، شما باید بر سخت افزار مسلط باشید.
 
شکل ۲: تقسیم بندی محیط سیستم عامل به یوزراسپیس و کرنل اسپیس
 انواع کرنل ها:

  • مونولیتیک کرنل ها:

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

  • میکروکرنل ها:

میکروکرنل ها نقطه مقابل مونولیتیک کرنل ها می باشند، به جای اینکه کل کرنل را در یک جای حافظه به صورت یکپارچه لود کنیم، و دسترسی مستقیم به حافظه را به کاربر روت دهیم،روش جدیدی را پیشنهاد می کنند.
کرنل خود را به بخشهای مجزایی تبدیل کرده، وآنها را در واحدهای جداگانه ای از حافظه لود کنیم. یعنی طراحی ماژولار را پیش بگیریم. این واحدهای مجزا از طریق یک پروتکل مبتنی بر پیغام کهIPC (inter process communication)خوانده می شود باهم ارتباط برقرا می کنند،که طبیعتا در پیغام های زیاد بارپردازشی یا اورهد زیادی را باید متحمل شود. پس کاربر روت به حافظه دسترسی مستقیم نخواهد داشت، یک رابط یا اینترفیس ماژولار با کاربر ارتباط دارد.

  • اگزوکرنلها:

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


:References
linux kernel development 3rd edition  Robert Love

Sharing is caring!

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *