بعد از دانلود کردن و اکسترکت کردن سورس کد هسته سیستم عامل لینوکس که از آدرس kernel.org قابل دانلود است، با تعداد بسیار زیادی از دایرکتوریها مواجه میشویم.
در ریشه کد منبع دانلود شده، فایلهای زیر وجود دارد:
- COPYING: اطلاعات درباره مجوزها و اجازهها. لینوکس بر اساس مجوز دسترسی GPLv3 است. این مجوز اجازه استفاده، تغییر، توزیع و اشتراک گذاری کد منبع را به صورت رایگان به هر فردی میدهد، اما آن فرد نباید کد منبع را بفروشد.
- CREDITS: لیست افراد همکاری کننده.
- Kbuild: این اسکریپت بعضی تنظیمات را برای ساختن هسته مقداردهی میکند. برای مثال این اسکریپت متغیر ARCH را مقداردهی میکند که این متغیر مشخص کننده معماری پردازنده ای است که باید بر روی آن کامپایل انجام شود.
- Kconfig: این اسکریپت برای مشخص کردن پارامترهای تنظیم هسته استفاده میشود.
- MAINTAINERS: این فایل مشخص کننده لیست نگهداری کنندگان، ایمیل آنها و وب سایتهای مرتبط با آنها است. این فایل زمانی استفاده میشود که یک توسعه دهنده یک باگ در فایلی پیدا میکند و قصد دارد تا آن را به افراد مرتبط با آن فایل گزارش دهد.
- Makefile: اسکریپت اصلی مورد نیاز برای کامپایل هسته کرنل. این فایل پارامترهای مورد نیاز برای کامپایل و همچنین لیست فایلها و هر چیز مورد نیاز دیگری را ارسال میکند.
- README: این فایل متنی اطلاعات مورد نیاز برای توسعه دهندگان که میخواهند با نحوه کامپایل کرنل آشنا شوند، را فراهم میکند.
- REPORTING-BUG: این فایل متنی اطلاعات مورد نیاز برای گذارش دهی باگ را فراهم میکند.
در ریشه کد منبع، لیست شاخه های زیر وجود دارد:
- arch: در این شاخه یک فایل Kconfig وجود دارد که تنظیمات مورد نیاز را برای کامپایل کدهای این منبع مشخص میکند. هر پردازنده که توسط هسته پشتیبانی میشود، یک شاخه مشخص در این شاخه دارد. برای مثال، کد برای کرنل alpha در شاخه ای با این اسم قرار دارد.
- block: در این شاخه، کد مربوط به ابزارهای بلاکی قرار دارد. ابزارهای بلاکی، دستگاههایی هستند که ارسال و دریافت داده در آنها به صورت بلاکی انجام میشود. بلاک داده به جای یک جریان (stream) از دادهها، تکه ای (chunk) از دادهها است.
- crypto: شامل کد بسیاری از الگوریتمهای رمز نگاری. برای مثال “sha1_generic.c” فایلی است که کد مربوط به الگوریتم رمزنگاری sha1 را پیاده سازی کرده است.
- Documentation: مستندات مربوط به هسته و فایلهای دیگر.
- drivers: شامل کدهای مربوط به راه اندازهای سخت افزارهای مختلف است. راه انداز یک نرمافزار است که سخت افزار مشخص را کنترل میکند. دایرکتوریهای زیادی در این شاخه وجود دارد. برای هر نوع سخت افزار به صورت کلی یک پرونده اصلی وجود دارد که شامل زیر نوعهای دیگری است. برای مثال شاخه bluetooth دربردارنده کد راه انداز برای سخت افزار bluetooth است. البته برای بعضی از سخت افزارها این اصل رعایت نشده است و شاید بتوان گفت یک سطح دسته بندی اضافی نیز درنظر گرفته شده است، مانند joystick که در شاخه input/joystick قرار دارد.
- firmware: این شاخه شامل کدهایی است که سیستم کامپیوتری را قادر به فهمیدن سیگنالهای دریافتی از ابزارها میکند. برای مثال یک وبکم، سیستمی برای مدیریت سخت افزار خودش دارد، اما باید سیستم کامپیوتری سیگنالهای دریافتی از آن را بتواند بفهمد. این کدها همچنین برای ارسال سیگنال به ابزارها نیز استفاده میشود.
- fs: این شاخه همان filesystem است. تمام کدهای مورد نیاز برای درک و استفاده از فایل سیستمها در این شاخه قرار دارد. برای هر فایل سیستم یک شاخه جداگانه درون آن وجود دارد. برای مثال کد مربوط به ext4 درون شاخه هم نام خود قرار دارد. بعضی از فایلها درون شاخه خاصی نیستند، این فایلها برای مدیریت کلی فایل سیستم مورد نیاز است. برای مثال mount.h که مورد نیاز برای عمل mounting یک سیستم فایل است. یک فایل سیستم روشی ساختارمند برای ذخیره سازی و مدیریت اطلاعات در ابزارهای ذخیره سازی فراهم میکند. هر فایل سیستم محدودیتها و برتریهای خاص خودش را دارد (در این مورد مطلب جامعی بعداً مینویسم).
- include: این شاخه شامل فایلهای سرآیندی است که کرنل از آن استفاده میکند.
- init: فایلهای مرتبط با راهاندازی کرنل در این شاخه قرار دارد. فایل main.c فایل اصلی کرنل است. این فایل سور اصلی است که قسمتهای دیگر را به هم مرتبط میکند.
- ipc: کلمه ipc مخفف Inter Process Communication است. این شاخه شامل کدهایی لایه ارتباطی است، که این لایه ارتباط بین کرنل و پردازشها لازم است. در سیستم عامل لینوکس، تنها مسیر ارتباطی با سخت افزار از طریق کرنل است و یک برنامه برای انجام یک وظیفه باید از کرنل درخواست بکند. برای مثال فرض کنید که یک برنامه میخواهد با سخت افزار کنترل dvd ارتباط برقرار کند و مثلاً در آن را باز کند، باید این درخواست را از طریق رابط برنامه نویسی مشخص به کرنل بدهد و کرنل خود آن کار را انجام دهد.
- kernel: کدهای این بخش خود کرنل را مدیریت میکند. برای مثال یک شاخه با نام power مدیریت کننده نحوه خاموش کردن است.
- lib: شامل فایلهایی است که کرنل به آن ارجاع داده است.
- mm: مدیریت حافظه.
- net: شامل کدهایی برای پروتکلهای مختلف شبکه است.
- samples
- scripts:شامل کدهای مورد نیاز برای کامپایل کردن کرنل است.
- security
- sound: شامل راه انداز کارتهای صوتی است.
- tool: شامل ابزارهای برای ارتباط با کرنل است.