ورود/ایجاد حساب کاربری
   منوی اصلی
· خانه
· لیست کاربران
· جستجو
· آمار مشاهدات
· آرشیو مقالات


- شرح
· راهنمای نویسندگان
· درباره ما

   همکاری با نشریه
در صورتی که مایل به همکاری با نشریه هستید، می‌توانید در لیست پستی نشریه عضو شده و در جریان امور قرار گیرید. برای اطلاعات بیشتر، اینجا کلیک کنید.

   کاربران
سردبیر
هیچ مدیر کمکی حاضر
همکاران
هیچ مدیر کمکی حاضر
اعضا:
جدیدترین:جدید امروز:0
جدیدترین:جدید دیروز:0
جدیدترین:مجموع:2471
جدیدترین:جدیدترین:
ufumenarayu
اعضا:حاضر
اعضا:اعضا:0
مهمان‌ها:مهمان‌ها:4
مجموع:مجموع:4
کاربران حاضر
هیچ کاربر حاضری وجود ندارد

   ورود کاربران




 


 برای ورود مشکل دارید؟
 ثبت نام کاربران جدید

آشنایی با هسته‌ی لینوکس - قسمت اول - سیستم های عامل، یونیکس و لینوکس

(2949 مجموع کلمات موجود در متن)
(15488 بار مطالعه شده است)  نسخه چاپی


اولین قسمت از مجموعه مقالات آشنایی با هسته لینوکس را آغاز می کنیم. در این مجموعه مقالات که بر طبق برنامه ریزی‌های صورت گرفته ۱۶ تا ۲۰ مقاله خواهد بود به بررسی معماری و الگوریتم‌های موجود در هسته لینوکس خواهیم پرداخت و در هر قسمتی که بیش از حد وارد جزییات نشود به مسایل پیاده سازی و ملاحظات آن نیز خواهیم پرداخت. در قسمت اول این مجموعه که پیش روی شماست ابتدا بررسی تاریخچه ای از یونیکس را از نظر خواهیم گذراند. سپس مختصرا بعضی از جنبه‌های نظریه سیستم عامل ها را مورد مطالعه قرار خواهیم داد و در ادامه نیز بحث مان را معطوف به هسته لینوکس پی خواهیم گرفت. در این مجموعه هر جا صحبت از لینوکس است منظور هسته لینوکس می باشد.

مروری بر تاریخچه یونیکس


پس از گذشت سه دهه هنوز یونیکس (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 بودند. طراحی بسیار ماهرانه یونیکس با بهبود‌های فراوانی که در صول سال ها بر روی آن آنجام شده بود آن را به یک سیستم عامل قدرتمند, تنومند و پایدار تبدیل کرده بود. برخی از خصوصیاتی که سکوی پرتاب یونیکس شده بود عبارتند از:
۱- سادگی یونیکس: بعضی سیستم‌های عامل هزاران هزار تابع سیستمی (system call) را پیاده سازی می کنند و اهداف مشخصی ندارند اما یونیکس فقط نزدیک به صد تابع سیستمی داشت و طراحی کاملا هدفمندانه ای شده بود.
۲- در یونیکس همه چیز فایل است (به توضیح آنتهای پاراگراف رجوع شود). این سطح از تجرید(abstraction) کار با اطلاعات و دستگاه ها را در قالب کار با چند تابع سیستمی کار با فایل ها ساده می کند. توابع سیستمی چون ()open(), read(), write(), ioctl(), close .
۳- هسته یونیکس به زبان C توسعه داده شده بود. با این قابلیت یونیکس می توانست به اسانی قابل حمل و قابل پورت شدن باشد و به اسانی در اختیار خیل عظیمی از توسعه دهندگان قرار گیرد.
۴- یونیکس با تنها تابع سیستمی ()fork که در اختیار داشت سرعت بالایی در ایجاد پروسه ها داشت. با این امکان سیستم‌هایی که شدیدا تقسیم بندی شده بودند بدون هیچ مشکلی می توانستند بر روی یونیکس کار کنند.
۵- یونیکس توابع قدرتمندی در ارتباط بین پروسه ها یا InterProcess Communication) IPC) داشت که وقتی با امکان ایجاد سریع پروسه ها همراه می شد اجازه ایجاد ابزارهای مفیدی را می داد که می توانستند با ابزارهای دیگر کارهای بزرگی در سیستم آنجام دهند.
توضیح : البته همه چیز در یونیکس‌های امروزی فایل نیست. می توان گفت بخش اعظمی از آن با API فایل ها پیاده سازی شده است. اما API یونیکسی که در ازمایشگاه‌های بل ایجاد شده بود کاملا فایل بود.
امروزه یونیکس یک سیستم عامل مدرن است که امکاناتی چون چند کار موازی (multitasking), چند رشته موازی (multithreading), حافظه مجازی (virtual memory), تخصیص دینامیکی حافظه (demand paging), کتابخانه‌های دینامیکی (shared libraries) با بارگذاری دینامیک (demand loading) و شبکه TCP/IP را پشتیبانی می کند.
بعضی از شکل‌های یونیکس به صدها سخت افزار پورت شده آند و بعضی نیز تنها بر روی دستگاه‌های جاسازی شده (embedded devices) اجرا می شوند.

آشنایی با لینوکس


لینوکس در سال ۱۹۹۱ توسط لینوس بندیکت توروالدز ایجاد شد. در آن زمان یونیکس قدرتمندی که به صورت ازادانه در اختیار باشد وجود نداشت و تمام یونیکس ها مجوز اختصاصی و تجاری داشتند و این موضوع لینوس را به عنوان یک جوان ۲۱ ساله که در دانشگاه هلسینکی فنلاند درس می خواند خیلی رنج می داد. لینوس از مینیکس (Minix) که برای اهداف اموزشی ایجاد شده بود و کد آن در اختیار بود ولی حق تغییر نداشت) استفاده می کرد


در پاسخ به این وضع نامساعد لینوس کاری کرد که هر دانشجوی معقول اگر در شرایط او می بود آنجام می داد. او تصمیم گرفت که خودش سیستم عاملش را بنویسد. لینوس ابتدا شروع به نوشتن یک شبیه ساز ترمینال کرد که می توانست با آن به کامپیوتر بزرگ یونیکسی که در دانشگاه بود متصل شود. شبیه ساز ترمینالش رشد کرد و بهتر شد. مدتی بعد, لینوس یک سیستم یونیکس خیلی کوچک در اختیار داشت. او یونیکس خود را در سال ۱۹۹۱ بر روی شبکه اینترنت منتشر ساخت.


این یونیکس ازاد که نام لینوکس بر روی آن گذاشته شد به سرعت کاربرانی یافت. به دلیل مجوز ازاد GPL لینوکس که اجازه هر گونه تغییر و بررسی بر روی کدهای لینوکس را می داد توسعه دهندگان مشتاقی برای بررسی و تغییر لینوکس آن را دریافت کردند. مجوز لینوکس باعث شد که این سیستم عامل در زمان کوتاهی تبدیل به یک پروژه گروهی در سطح اینترنت شود که توسط افراد زیادی توسعه یابد.


اما امروزه لینوکس یک سستم عامل پرقدرت است که می تواند بر گستره وسیعی از معماری‌های سخت افزاری اجرا گردد. معماری‌هایی چون AMD x86-64, ARM, Compaq Alpha, CRIS, DEC VAX, H8/300, Hitachi SuperH, HP PA-RISC, IBM S/390, Intel IA-64, MIPS, Motorola 68000, PowerPC, SPARC, Ultra SPARC, v850 معماری‌هایی بوده آند که تاکنون لینوکس به آنها پورت شده است. لینوکس بر روی سیستم‌هایی به کوچکی یک ساعت مچی و به بزرگی ابرکامپیوترهایی که در ساختمان‌های بسیار بزرگ نگهداری می شوند اجرا می شوند. امروزه لینوکس میل تجاری بزرگی برای کمپانی‌های تجاری ایجاد کرده است. کمپانی‌های مشهوری چون Novell, IBM, RedHat, Montavista راه کارهای بر پایه لینوکس در سطوح مختلف ارایه می کنند.


لینوکس شبیه یونیکس یا اصطلاحا Unix Clone است ولی یونیکس نیست. به دلیل اینکه اگرچه لینوکس ایده‌های زیادی را از یونیکس قرض گرفته و Unix API که در استاندارد POSIX تعریف شده است پیاده سازی کرده است اما حتی یک خط از کد لینوکس از کد یونیکس قرض گرفته نشده است و به عبارتی همه چیز از ابتدا نوشته شده است با این حال برنامه‌های کامپایل شده یونیکس به خوبی در لینوکس اجرا می شوند و بالعکس. یکی از بزرگترین و مهمترین مزایای لینوکس این است که یک محصول تجاری نیست. یک پروژه گروهی است که در سطح اینترنت توسعه یافته است. اگرچه لینوس بنیان گذارو نگهدارنده اصلی لینوکس است اما پیشرفت و توسعه لینوکس توسط خیل عظیمی از توسعه دهندگان ادامه می یابد. به زبان ساده تر همه می توانند در لینوکس مشارکت کنند. مجوز GPL این اجازه را به همه داده است. فقط بایستی به یاد داشته باشیدهر تغییری را که در لینوکس می دهید و آن را بهتر می کنید بایستی به صورت ازادانه به لینوکس بازگردانید و این همان مفهوم تضمین ازادی است که GPL برای شما به ارمغان می اورد.

درآمدی بر سیستم‌های عامل و هسته ها


به دلیل وجود سیستم عامل‌های مدرن تجاری که طراحی اشتباهی دارند فکر کنم منظورم را متوجه شده باشید) مفهوم دقیق سیستم عامل دچار ابهام شده است. کاربران زیادی تصور می کنند هر آنچه که بر روی صفحه مانیتور خود می بینند سیستم عامل است. اگر بخواهیم بحث تکنیکی بکنیم سیستم عامل بخشی از سیستم است که مسئول رفع نیازهای اولیه و مدیریت سیستم است. سیستم عامل شامل هسته (kernel), راه آندازهای دستگاه ها (device drivers), بوت لودر (boot loader), پوسته فرمان (command shell) یا دیگر راه‌های ارتباطی و ابزارهای ابتدایی کار با فایل ها وسیستم است. مثلا مرورگر اینترنت یا پخش کننده موسیقی جزیی از سیستم عامل نیستند. در عوض واژه system به سیستم عامل و تمامی برنامه‌هایی که بر روی آن اجرا می شوند اطلاق می گرددلایه ظاهری کاربری (user interface) خارجی ترین بخش سیستم عامل و هسته داخلی ترین بخش آن می باشد. هسته سرویس‌های ابتدایی برای دیگر بخش‌های سیستم را فراهم می کند, سخت افزار را مدیریت می کند و منابع سیستم را توزیع می نماید. گاهی از هسته به عنوان مدیر یا قلب سیستم عامل یاد می شود. اجزای شاخص هسته عبارتند از: راه آنداز‌های وقفه (interrupt handlers), زمانبند پردازنده (CPU scheduler) که زمان پردازنده را بین پروسه ها تقسیم می کند, سیستم مدیریت حافظه (memory management system) که فضای آدرس پروسه ها را مدیریت می کند و سیستم و سرویس‌هایی مانند شبکه (networking) و ارتباط بین پروسه ها (IPC). در سیستم‌های مدرن با واحد محافظت شده مدیریت حافظه معمولا هسته در سطح بالاتری نسبت به برنامه‌های کاربران قرار داشته و اجرا می شوند

این مورد شامل دسترسی محافظت شده به حافظه و دسترسی مستقیم به سخت افزارها می باشد. از این فضا به فضای هسته (kernel space) و برعکس فضایی که برنامه‌های کاربران در آن قرار دارند فضای کاربر (user space) نامیده می شود. در فضای کاربر در دسترسی به منابع سیستم محدودیت وجود دارد, نمی توان مستقیم به سخت افزارها دسترسی داشت و یه طور کلی نمی توان بی ادبی کرد.

برنامه‌هایی که در سیستم در حال اجرا شدن هستند از طریق توابع سیستمی (system calls) با هسته ارتباط برقرار می کنند. یک برنامه معمولا یک تابع کتابخانه ای مثلا تابعی در کتابخانه استاندارد زبان C را صدا می کند و در عوض تابع سیستمی از میان آن تابع کتابخانه ای صدا زده می شود. شکل ۱.۱ ارتباط بین برنامه ها, هسته و سخت افزارها را نشان می دهد.



شکل ۱.۱ – ارتباط بین برنامه ها, هسته و سخت افزارها

بعضی توابع کتابخانه ای امکانات وسیعی را که در توابع سیستمی پیدا نمی شوند فراهم می کنند. بنابراین صدا کردن هسته در حقیقت رفتن به یک تابع بزرگتر است. به عنوان مثال تابع معروف ()printf را در نظر بگیرید. این تابع شکل دهی و ذخیره سازی داده ها را آنجام داده و در نهایت با صدا کردن تابع سیستمی ()write اطلاعات را بر روی ترمینال می نویسد. در عوض بعضی از توابع کتابخانه ای رابطه ای یک به یک با توابع سیستمی دارند. به عنوان مثال تابع کتابخانه ای ()open چیزی جز صدا کردن تابع سیستمی ()open نیست. بعضی از توابع کتابخانه ای زبان C مانند ()strcpy نیز اصلا از توابع سیستمی استفاده نمی کنند. هنگامی که یک برنامه تابع سیستمی را اجرا می کند در حقیقت هسته است که از طرف برنامه اجرا می گردد. لذا گفته می شود که برنامه تابع سیستمی را در فضای هسته اجرا می کند و هسته در متن (context) برنامه اجرا می شود.

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

برای فراهم کردن همزمانی, هسته می تواند تمام وقفه ها یا وقفه خاصی را غیر فعال نماید. در سیستم‌های عامل زیادی از جمله لینوکس راه آندازهای وقفه در متن پروسه ها اجرا نمی شوند. در عوض آنها در متن یا context ویژه ای که متعلق به هیچ پروسه ای نیست اجرا می شوند.
در حقیقت در لینوکس به طور عمومی می توان گفت که هر پردازنده یکی از سه کار زیر را در هر لحظه از زمان آنجام می دهد:
۱- در فضای هسته و متن پروسه است و یک پروسه خاص را اجرا می کند.
۲- در فضای هسته و متن وقفه است, پروسه ای را اجرا نمی کند و به وقفه ها پاسخ می دهد.
۳- در فضای کاربر است و یک پروسه خاص را اجرا می کند.

هسته لینوکس در برابر هسته یونیکس‌های کلاسیک

با داشتن یک ریشه و یک API هسته‌های یونیکس‌های مدرن ویژگی‌های طراحی تقریبا یکسانی دارند. یک هسته یونیکس یک فایل باینری استاتیک یکپارچه (monolithic) است. یک ایمیج اجرایی بزرگ که در یک آدرس مستقل قرار می گیرد. سیستم‌های یونیکسی معمولا به یک واحد مدیریت صفحه ای حافظه نیاز دارند. این مورد امکان حافظه محافظت شده را الزامی می دارد و فضای آدرس مجازی یکتا برای هر پروسه فراهم می کند.

در این قسمت برای اینکه بتوانیم طراحی هسته لینوکس را بهتر درک کنیم بحثی پیرامون هسته‌های یکپارچه (monolithic kernels) و طراحی ریز هسته (microkernel design) آنجام می دهیم:
طراحی هسته می تواند به دو نوع اصلی دسته بندی شود: یکپارچه (monolithic) و ریزهسته (microkernel). (البته روش سومی نیز به نام exokernel نیز وجود دارد که تاکنون بیشتر در تحقیقات مطرح شده است ولی در دنیای واقعی نیز در حال راه یابی است. روش ها و متدهای دیگری نیز هستند که کاربرد چندانی ندارند و از سه روش فوق مشتق شده آند.)
هسته‌های یکپارچه طراحی ساده تری دارند و تقریبا تمامی طراحی ها تا دهه ۱۹۸۰ بدین گونه بوده آند. هسته‌های یکپارچه به صورت یک ایمیج باینری بزرگ که در فضای آدرس معینی قرار می گیرد پیاده سازی می گردد. این هسته در دیسک به صورت یک فایل باینری استاتیک مستقل ذخیره می شود. تمامی سرویس‌های هسته وجود دارند و در فضای بزرگ هسته اجرا می شوند. ارتباطات ناچیزی در هسته وجود دارد چون تمام هسته در فضای آدرس مشخصی قابل دسترسی است و نیاز به هیچ گونه ارتباطی نمی باشد. در این نوع هسته می توان به طور مستقیم توابع را صدا زد. این نوع طراحی دارای سادگی و بازدهی بالا می باشد و تقریبا تمامی یونیکس ها از این نوع طراحی بهره می برند.
در آن سو, ریز هسته به صورت یک فایل باینری بزرگ پیاده سازی نمی شود. در عوض قابلیت‌های هسته در قالب پروسه‌های جداجدا که معمولا به آنها نام سرور (server) داده می شود خرد می گردد.

سرورهایی که به امکانات خاص نیاز دارند در فضای اجازه داده شده و بقیه در فضای کاربر اجرا می شوند. تمامی سرورها فضای آدرس جداگانه ای دارند لذا امکان صدا کردن مستقیم توابع یکدیگر را ندارند. در عوض ارتباطات در ریز هسته از طریق ارسال پیغام (message passing) صورت می گیرد. با پیاده سازی مکانیزم ارتباط بین پروسه ای (IPC) سریع این ارسال پیغام ها بین سرورها می تواند بر اساس مکانیزم IPC باشد. جداسازی سرورهای مختلف هنگامی که یکی از سرور ها دچار شکست شد از شکست کلی سیستم جلوگیری می کند. مساله ای که در طراحی یکپارچه وجود ندارد و با ناموفق بودن یک قسمت از هسته کل آن دچار شکست می شود. به علاوه ساختاریافتگی (modularity) طراحی ریز هسته به آن این امکان را می دهد که در حین اجرای هسته یک سرور با سرور دیگری جایگزین گردد. با توجه به هزینه ارتباط بین سرورها و تغییر رویه اجرایی (context switch) و آنتقال پیغام ها طراحی ریزهسته کمی نسبت به طراحی پکپارچه کندتر می باشد. برای جبران مساله سرعت کمتر و بهبود آن تقریبا تمامی سیستم عامل‌های امروزی که از این متد طراحی استفاده می کنند سرورها را در فضای هسته اجرا می کنند (جلوگیری از هزینه تغییر رویه اجرایی) و بالقوه امکان صداکردن مستقیم توابع سرورها را فراهم می سازند. سیستم عامل‌هایی چون windows NT و Mach ( که بعضی قسنت‌های Mac OS X بر مبنای آن است) این گونه هستند.

و اما طراحی لینوکس: لینوکس نکات مثبت هر دو متد ذکر شده را در خود جمع کرده است. لینوکس یک هسته یکپارچه دارد که در فضای آدرس مشخصی اجرا می گردد, لینوکس طراحی ای ساخت یافته (modular) با امکاناتی نظیر اعمال زور (preemption), رشته‌های سطح هسته (kernel threads) دارد و امکان بارگذاری فایل‌های فایل‌های باینری جدا در حین اجرا را نیز دارد (ماجول‌های هسته). با این امکانات لینوکس از یک سو سرعتی برابر با طراحی یکپارچه و از سوی دیگر کلیه امکانات ریزهسته را در خود جمع کرده است.

هنگامی که لینوس و دیگر توسعه دهندگان لینوکس در آن مشارکت می کنند بدون توجه به یونیکس ولی با رعایت API آن به پیاده سازی هسته می پردازند. بنابراین با توجه به اینکه لینوکس بر پایه هیچ یونیکسی نیست توسعه دهندگان لینوکس می توانند در هر لحظه بهترین تصمیمات را اتخاذ کنند و در لینوکس اعمال کنند. در زیر مقایسه ای بین هسته لینوکس و دیگر یونیکس ها صورت می پذیرد:
۱- لینوکس بارگذاری دینامیک ماجول‌های هسته را پشتیبانی می کند. اگر چه طراحی هسته لینوکس یکپارچه است ولی این امکان را دارد که در موقع لزوم بعضی از کدهای هسته به آن وارد شوند یا از آن خارج شوند.
۲- لینوکس چند پردازندگی متقارن (SMP) را پشتیبانی می کند. اگر چه نسخه‌های جدید یونیکس ها این امکان را پشتیبانی می کنند ولی این پشتیبانی در نسخه‌های قدیمی وجود نداشت.
۳- هسته لینوکس دارای اعمال زور است یا به اصطلاح preemptive است. یونیکس‌های قدیمی تر امکان اعمال زور را نداشتند.
۴- لینوکس روش جالبی در پیاده سازی رشته‌های اجرایی یا thread ها دارد. در لینوکس تقریبا فرقی مابین یک رشته و یک پروسه معمولی نیست. تنها فرقی که وجود دارد این است که بیت thread ها منابع به اشتراک گذاشته می شوند.
۵- لینوکس یک مدل شی گرا بر مدیریت دستگاه ها به همراه رخدادهای قطع و وصل و فایل سیستم دستگاه در فضای کاربر (sysfs) دارد.
۶- لینوکس از پیاده سازی بعضی امکانات یونیکس که طراحی خوبی ندارند و به کار نمی روند چشم پوشی کرده است مانند STREAMS که تقریبا مرده است.
۷- و در نهایت لینوکس بر خلاف یونیکس‌های دیگر به معنای واقعی کلمه ازاد است.

نسخه‌های هسته لینوکس

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

نسخه هسته لینوکس به وسیله سه عدد مشخص می شود. مثلا 2.6.20 . عدد اول (۲) که عدد اصلی (major version) نامیده می شود زمانی تغییر می کند که تغییرات بسیار عمده و بنیادی در هسته اتفاق بیفتد. عدد دوم (۶) عدد فرعی (minor version) نامیده می شود. اگر این عدد زوج باشد هسته پایدار و اگر فرد باشد هسته توسعه است. دو عدد اول سری هسته را نیز نشان می دهند مثلا هسته مثال مذکور سری 2.6 است. عدد سوم نیز patchlevel نامیده می شود.

هسته‌های توسعه یک سری فاز توسعه دارند. در ابتدا توسعه دهندگان هسته بر روی امکانات جدید کار و تحقیق و بحث می کنند. بعد از آن مرحله ثبت امکانات یا feature freeze می باشد. پس از این مرحله هیچ امکان جدیدی به لیست امکانات موردنظر برای پیاده سازی اضافه نخواهد شد. توسعه کدها شروع شده و پس از مدتی که هسته به مرحله ای برسد که بتوان آن را به عنوان پایدار معرفی کرد مرحله ثبت کد یا code freeze اغاز می شود. پس از این مرحله فقط رفع اشکال ها قبول می شوند. پس از پایان این مرحله می توان امید داشت نسخه پایداری از هسته منتشر شود.

اجتماع توسعه هسته لینوکس

هنگامی که شما توسعه کد برای هسته لینوکس را اغاز می کنید جزیی از اجتماع عمومی توسعه هسته لینوکس خواهید بود. تالار اصلی توسعه دهندگان هسته لینوکس لیست پستی هسته می باشد. اطلاعات عضویت را می توانید در سایت http://vger.kernel.org مشاهده کنید. لیست پستی شلوغ با بیش از ۳۰۰ نامه الکترونیکی در روز.

در قسمت اینده به مقدمات مباحث هسته لینوکس خواهیم پرداخت. مروری بر کد منبع هسته, کامپایل هسته و مروری بر بوت لودرها مهمترین مباحث قسمت اینده خواهند بود




نویسنده: سعید تقوی taghavi@ece.ut.ac.ir
پانویس‌ها:

1. The Kernel Source Code ( http://www.kernerl.org )
2. The Linux Kernel Documentations (inside the source tree).
3. D.P. Bovet,“Understanding the Linux Kernel”, 2nd ed, O'Reilly, 2002.
4. R.Love,“Linux Kernel Development”, 2nd ed, Sams, 2005.
5. J.Corbert and others,“Linux Device Drivers”, 3rd ed, O'Reilly, 2005.
6. A.Silberchatz and others,“Operating System Concepts”, 7th ed, John Wiley, 2006.
7. http://www.tldp.org/LDP/lkmpg/2.6/html

PDF Version


تمامی مطالب و مقالات این سایت تحت مجوز GNU FDL قرار دارند. بنابراین کپی و ایجاد تغییر در آنها مطابق شرایط این مجوز آزاد می‌باشد.