مروری بر تاریخچه یونیکس |
پس از گذشت سه دهه هنوز یونیکس (Unix) یکی از قدرتمندترین و زیباترین سیستمهای عامل به شمار می رود. از زمان پیدایش یونیکس در سال ۱۹۶۹ تاکنون افکار دنیس ریچی (Dennis Ritchie) و کن تامپسون (Ken Thompson) به موجودی افسانه ای بدل شده است یونیکس از مالتیکس (Multics) که یک پروژه سیستم عامل چند کاربره شکست خورده بود که در ازمایشگاههای بل توسعه داده شده بود زاییده شد. هنگامی که پروژه مالتیکس با شکست به اتمام رسید, اعضای مرکز تحقیقات علوم کامپیوتر ازمایشگاههای بل بدون یک سیستم عامل موفق با قابلیت باقی مانده بودند. در تابستان سال ۱۹۶۹ توسعه دهندگان ازمایشگاه بل طرحی بسیار ساده از یک فایل سیستم را ارایه کردند که بعدها زمینه ساز ایجاد یونیکس شد. آن ها سیستم جدید خود را بر روی دستگاههای PDP-7 آن زمان تست می کردند. در سال ۱۹۷۱ این سیستم نو به دستگاههای PDP-11 پورت و روی آنها امتحان شد. در آن روزها دیگر این مخلوق جدید که بر اساس کدهای سیستم شکست خورده مالتیکس بود یونیکس نامیده می شد. در سال ۱۹۷۳ سیستم عامل یونیکس با زبان C بازنویسی شد. قدمی بسیار بزرگ که موجب شد یونیکس در سالهای بعد به سیستمهای زیادی پورت شود. اولین یونیکسی که در بیرون از ازمایشگاههای بل مورد استفاده قرار گرفت یونیکس نسخه ۶ یا به اختصار V6 بود. کمپانیهای دیگری یونیکس را به ماشینهای جدید پورت کردند. با این پورتهای زیاد یونیکسهای مختلفی شکل گرفتند. در سال ۱۹۷۷ ازمایشگاههای بل ترکیبی از این یونیکس ها را در قالب یک سیستم به نام یونیکس سیستم ۳ (Unix System III) منتشر کرد و در سال ۱۹۸۲, AT&T نسخه System V را منتشر ساخت. طراحی ساده یونیکس, همراه با در اختیار بودن سورس کد آن موجب توسعه فوق العاده آن در سازمانهای دیگر شد. یکی از بزرگترین این سازمان ها دانشگاه برکلی کالیفرنیا بود. نسخه ای از یونیکس که در برکلی توسعه داده شده بود نام BSD که مخفف عبارت Berkeley Software Distribution است گرفت. اولین نسخه BSD در سال ۱۹۷۹ منتشر شد. سریهای 4.3BSD , 4.2BSD , 4.1BSD , 4.0BSD , 4BSD بعد از 3BSD منتشر شدند. در این نسخه ها امکاناتی چون حافظه مجازی, تخصیص دینامیک حافظه, TCP/IP اضافه شدند. در سال ۱۹۹۳ اخرین نسخه رسمی یونیکس برکلی که حافظه مجازی در آن بازنویسی شده بود تحت عنوان 4.4BSD منتشر شد. امروزه توسعه BSD در قالب پروژههایی چون OpenBSD, NetBSD, FreeBSD, DragonflyBSD, Darwin ادامه می یابد. در دهه ۱۹۸۰ و ۱۹۹۰ کمپانیهای مختلفی نسخههای تجاری از یونیکس خود را منتشر کردند. این سیستم ها که معمولا بر مبنای یونیکس AT&T یا BSD بودند برای پشتیبانی از قابلیتهای معماری سخت افزارهای خاص تغییر می یافتند. معروف ترین این سیستم ها True 64, HP-UX, IBM's AIX, DUNIX/ptx, SGI's IRIX, Sun's Solaris بودند. طراحی بسیار ماهرانه یونیکس با بهبودهای فراوانی که در طول سال ها بر روی آن آنجام شده بود آن را به یک سیستم عامل قدرتمند, تنومند و پایدار تبدیل کرده بود. برخی از خصوصیاتی که سکوی پرتاب یونیکس دارد عبارتند از: آشنایی با لینوکس
درآمدی بر سیستمهای عامل و هسته ها
این مورد شامل دسترسی محافظت شده به حافظه و دسترسی مستقیم به سخت افزارها می باشد. از این فضا به فضای هسته (kernel space) و برعکس فضایی که برنامههای کاربران در آن قرار دارند فضای کاربر (user space) نامیده می شود. در فضای کاربر در دسترسی به منابع سیستم محدودیت وجود دارد, نمی توان مستقیم به سخت افزارها دسترسی داشت و یه طور کلی نمی توان بی ادبی کرد. برنامههایی که در سیستم در حال اجرا شدن هستند از طریق توابع سیستمی (system calls) با هسته ارتباط برقرار می کنند. یک برنامه معمولا یک تابع کتابخانه ای مثلا تابعی در کتابخانه استاندارد زبان C را صدا می کند و در عوض تابع سیستمی از میان آن تابع کتابخانه ای صدا زده می شود.
بعضی توابع کتابخانه ای امکانات وسیعی را که در توابع سیستمی پیدا نمی شوند فراهم می کنند. بنابراین صدا کردن هسته در حقیقت رفتن به یک تابع بزرگتر است. به عنوان مثال تابع معروف ()printf را در نظر بگیرید. این تابع شکل دهی و ذخیره سازی داده ها را آنجام داده و در نهایت با صدا کردن تابع سیستمی ()write اطلاعات را بر روی ترمینال می نویسد. در عوض بعضی از توابع کتابخانه ای رابطه ای یک به یک با توابع سیستمی دارند. به عنوان مثال تابع کتابخانه ای ()open چیزی جز صدا کردن تابع سیستمی ()open نیست. بعضی از توابع کتابخانه ای زبان C مانند ()strcpy نیز اصلا از توابع سیستمی استفاده نمی کنند. هنگامی که یک برنامه تابع سیستمی را اجرا می کند در حقیقت هسته است که از طرف برنامه اجرا می گردد. لذا گفته می شود که برنامه تابع سیستمی را در فضای هسته اجرا می کند و هسته در متن (context) برنامه اجرا می شود. هسته همچنین سخت افزار سیستم را مدیریت می کند. تقریبا تمامی معماریهای سخت افزاری و آنچه لینوکس پشتیبانی می کند مفهوم وقفه ها (interrupts) راپشتیبانی و فراهم می کنند. هنگامی که سخت افزار می خواهد با سیستم ارتباط برقرار کند یک وقفه ایجاد می کند که به طور اسنکرون یا غیرهمزمان هسته را دچار وقفه می کند. وقفه ها با یک شماره مشخص می شوند. هسته این شماره را برای اجرای تابع مشخصی که وظیفه پردازش و پاسخ به وقفه را دارد به کار می برد. به عنوان مثال هنگامی که شما تایپ می کنید کنترلر صفحه کلید وقفه ای ایجاد می کند که به سیستم می فهماند که اطلاعات جدیدی در بافر صفحه کلید وجود دارد. هسته با توجه به شماره وقفه تابع راه آنداز وقفه صحیح را اجرا می کند. تابع راه آنداز وقفه اطلاعات صفحه کلید را پردازش کرده و به صفحه کلید اجازه دریافت اطلاعات بیشتر را می دهد. برای فراهم کردن همزمانی, هسته می تواند تمام وقفه ها یا وقفه خاصی را غیر فعال نماید. در سیستمهای عامل زیادی از جمله لینوکس راه آندازهای وقفه در متن پروسه ها اجرا نمی شوند. در عوض آنها در متن یا context ویژه ای که متعلق به هیچ پروسه ای نیست اجرا می شوند. هسته لینوکس در برابر هسته یونیکسهای کلاسیک با داشتن یک ریشه و یک API هستههای یونیکسهای مدرن ویژگیهای طراحی تقریبا یکسانی دارند. یک هسته یونیکس یک فایل باینری استاتیک یکپارچه (monolithic) است. یک ایمیج اجرایی بزرگ که در یک آدرس مستقل قرار می گیرد. سیستمهای یونیکسی معمولا به یک واحد مدیریت صفحه ای حافظه نیاز دارند. این مورد امکان حافظه محافظت شده را الزامی می دارد و فضای آدرس مجازی یکتا برای هر پروسه فراهم می کند. در این قسمت برای اینکه بتوانیم طراحی هسته لینوکس را بهتر درک کنیم بحثی پیرامون هستههای یکپارچه (monolithic kernels) و طراحی ریز هسته (microkernel design) آنجام می دهیم: سرورهایی که به امکانات خاص نیاز دارند در فضای اجازه داده شده و بقیه در فضای کاربر اجرا می شوند. تمامی سرورها فضای آدرس جداگانه ای دارند لذا امکان صدا کردن مستقیم توابع یکدیگر را ندارند. در عوض ارتباطات در ریز هسته از طریق ارسال پیغام (message passing) صورت می گیرد. با پیاده سازی مکانیزم ارتباط بین پروسه ای (IPC) سریع این ارسال پیغام ها بین سرورها می تواند بر اساس مکانیزم IPC باشد. جداسازی سرورهای مختلف هنگامی که یکی از سرور ها دچار شکست شد از شکست کلی سیستم جلوگیری می کند. مساله ای که در طراحی یکپارچه وجود ندارد و با ناموفق بودن یک قسمت از هسته کل آن دچار شکست می شود. به علاوه ساختاریافتگی (modularity) طراحی ریز هسته به آن این امکان را می دهد که در حین اجرای هسته یک سرور با سرور دیگری جایگزین گردد. با توجه به هزینه ارتباط بین سرورها و تغییر رویه اجرایی (context switch) و آنتقال پیغام ها طراحی ریزهسته کمی نسبت به طراحی پکپارچه کندتر می باشد. برای جبران مساله سرعت کمتر و بهبود آن تقریبا تمامی سیستم عاملهای امروزی که از این متد طراحی استفاده می کنند سرورها را در فضای هسته اجرا می کنند (جلوگیری از هزینه تغییر رویه اجرایی) و بالقوه امکان صداکردن مستقیم توابع سرورها را فراهم می سازند. سیستم عاملهایی چون windows NT و Mach ( که بعضی قسنتهای Mac OS X بر مبنای آن است) این گونه هستند. و اما طراحی لینوکس: لینوکس نکات مثبت هر دو متد ذکر شده را در خود جمع کرده است. لینوکس یک هسته یکپارچه دارد که در فضای آدرس مشخصی اجرا می گردد, لینوکس طراحی ای ساخت یافته (modular) با امکاناتی نظیر اعمال زور (preemption), رشتههای سطح هسته (kernel threads) دارد و امکان بارگذاری فایلهای فایلهای باینری جدا در حین اجرا را نیز دارد (ماجولهای هسته). با این امکانات لینوکس از یک سو سرعتی برابر با طراحی یکپارچه و از سوی دیگر کلیه امکانات ریزهسته را در خود جمع کرده است. هنگامی که لینوس و دیگر توسعه دهندگان لینوکس در آن مشارکت می کنند بدون توجه به یونیکس ولی با رعایت API آن به پیاده سازی هسته می پردازند. بنابراین با توجه به اینکه لینوکس بر پایه هیچ یونیکسی نیست توسعه دهندگان لینوکس می توانند در هر لحظه بهترین تصمیمات را اتخاذ کنند و در لینوکس اعمال کنند. در زیر مقایسه ای بین هسته لینوکس و دیگر یونیکس ها صورت می پذیرد: نسخههای هسته لینوکس هسته لینوکس در دو نوع نسخه منتشر می شود. پایدار و توسعه. هستههای پایدار نسخههایی هستند که می توانند در محیط کاربری به کار روند. نسخههای پایدار جدید تنها برای رفع اشکالات و راه آندازهای جدید منتشر می شوند. در سوی دیگر هستههای سری توسعه در هر نسخه تغییرات زیادی می کنند و به حد قابل قبولی برای استفاده واقعی نرسیده آند و مناسب نیستند نسخه هسته لینوکس به وسیله سه عدد مشخص می شود. مثلا 2.6.20 . عدد اول (۲) که عدد اصلی (major version) نامیده می شود زمانی تغییر می کند که تغییرات بسیار عمده و بنیادی در هسته اتفاق بیفتد. عدد دوم (۶) عدد فرعی (minor version) نامیده می شود. اگر این عدد زوج باشد هسته پایدار و اگر فرد باشد هسته توسعه است. دو عدد اول سری هسته را نیز نشان می دهند مثلا هسته مثال مذکور سری 2.6 است. عدد سوم نیز patchlevel نامیده می شود. هستههای توسعه یک سری فاز توسعه دارند. در ابتدا توسعه دهندگان هسته بر روی امکانات جدید کار و تحقیق و بحث می کنند. بعد از آن مرحله ثبت امکانات یا feature freeze می باشد. پس از این مرحله هیچ امکان جدیدی به لیست امکانات موردنظر برای پیاده سازی اضافه نخواهد شد. توسعه کدها شروع شده و پس از مدتی که هسته به مرحله ای برسد که بتوان آن را به عنوان پایدار معرفی کرد مرحله ثبت کد یا code freeze اغاز می شود. پس از این مرحله فقط رفع اشکال ها قبول می شوند. پس از پایان این مرحله می توان امید داشت نسخه پایداری از هسته منتشر شود. اجتماع توسعه هسته لینوکس هنگامی که شما توسعه کد برای هسته لینوکس را اغاز می کنید جزیی از اجتماع عمومی توسعه هسته لینوکس خواهید بود. تالار اصلی توسعه دهندگان هسته لینوکس لیست پستی هسته می باشد. اطلاعات عضویت را می توانید در سایت http://vger.kernel.org مشاهده کنید. لیست پستی شلوغ با بیش از ۳۰۰ نامه الکترونیکی در روز.
|