آشنایی با هستهی لینوکس - قسمت اول - سیستم های عامل، یونیکس و لینوکس(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
|