۲- بله فایل هستند. توی مسیر زیر ذخیره میشن:
/lib/modules/KERNEL_RELEASE
به جای KERNEL_RELEASE اسم انتشار کرنل قرار میگیره. مثلا اینها:
5.17.0-1-amd64
5.17.9-arch1-1
ماژولها همونجا نیستند، بلکه توی یه سری زیر دایرکتوری قرار دارند. معمولا پسوند ماژولها ko. هست. ممکنه ماژولهای کرنل فشرده شده باشند تا جای کمتری بگیرند، کرنل آرچ که اینجوریه و ماژولهاش با xz فشرده شدند. در اینصورت پسوند فشردهسازی هم به پسوند ماژول اضافه میشه. مثلا ko.xz.
ماژولها قسمتی از خود کرنل هستند که میتونند داخل کرنل بارگذاری بیشن. در اصل وقتی یه ماژول رو توی کرنل بارگذاری میکنید، یه سری کد به کدهای کرنل اضافه میشه.
میشه ماژولها رو داخل خود کرنل هم کار گذاشت. همینطور که بعضی از ماژولهای کوچک داخل خود کرنل قرار دارند. هر چند فایل اونها همچنان توی /lib/modules/ پیدا میشه.
ماژولهایی که داخل خود کرنل قرار دارند، نمیتونند unload بشن. کرنل همیشه به اونها دسترسی داره و متغیرها و توابع اونها همیشه مقداری از رم رو اشغال میکنند.
میشه همهی ماژولها رو داخل کرنل کار گذاشت تا به فایل جدا نیاز نشده ولی اینجوری حجم کرنل خیلی زیاد میشه. موقع اجرا هم رم زیادی توسط اونها اشغال میشه بدون اینکه نیازی به اون ماژولها داشته باشید. بعیده که بخواهید چند گیگابایت از رم شما توسط درایورهایی اشغال بشه که حتی سختافزار مرتبط با اونها رو ندارید.
ماژولهای کرنل جزیی از خود کرنل هستند که هر موقع لازم بشه توی کرنل بارگذاری و استفاده میشن. این ماژولها به کل کرنل در حال اجرا دسترسی دارند. توی فضای کرنل اجرا میشن، نه فضای کاربر یا فضای دیگهای.
به همین خاطر توسعه ماژول برای کرنل سخته و باید با دقت کد نوشت.
یه اشارهگر اشتباه توی کد میتونه کل فایلسیستم رو از بین ببره.
ماژول نباید دچار segmentation fault بشه چون در اینصورت خود کرنل دچار segmentaion fault و غیرقابل استفاده میشه.
ماژول نباید تعداد چیزهایی که از اون استفاده میکنند رو گم کنه وگرنه هیچجوری نمیشه به صورت ایمن اون رو unload کرد.
برای نوشتن ماژولها دسترسی به خیلی از توابعی که معمولا توی c بهشون دسترسی دارید وجود نداره. مثلا اونجا نمیتونید از printf استفاده کنید. برای کار با فایلها، * FILE وجود نداره. فقط به توابع کرنل و اونهایی که مال خود ماژول هست دسترسی دارید. تا جایی که میدونم، به توابع بقیه ماژولها هم دسترسی ندارید چون معمولا توابع ماژولها به صورت static هست، فقط خود ماژول بهش دسترسی داره. فکر کنم به system call ها هم دسترسی دارید، مطمئن نیستم.
نمیتونید ماژول یه کرنل رو روی یه کرنل دیگه استفاده کنید. حتی اگه دوتا ماژول برای یه کار باشند.
ماژولها باید برای همون کرنل و با توجه به header هاش کامپایل بشن.
اگه یه کرنل رو کامپایل کنید و بعد حتی به مقدار کوچک سورس یا config اون رو تغییر بدید، بعیده که ماژولهای قبلی باهاش کار کنند. باید ماژولها دوباره براش کامپایل بشن.
هر بار سخت افزار جدیدی متصل میشه قطعا درایورش هست که استفاده بشه درسته ؟
نه. ممکنه درایورهاش باشن، ممکن هم هست نباشند. مثلا بعضی چیپهای وایفای درایور همراه کرنل ندارند و به همین خاطر جدا از طریق dkms کامپایل و نصب میشن.
سختافزارهای انحصاری که تولید کننده اونها با توسعهدهندههای کرنل همکاری نکردند و مستندات کافی هم بیرون ندادند معمولا درایورشون همراه کرنل نیست.
سختافزارهای خیلی جدید که معمولا کمتر از ۱ ماه معرفی شدند، ممکنه درایورهاشون همراه کرنل نباشه.
البته در مورد پردازندههای intel و amd اینجوری نیست. معمولا خود شرکت قبل از اینکه پردازنده واقعا بیاد توی بازار، درایورها و تغییرات لازم رو به توسعهدهندههای کرنل میده و وقتی پردازنده واقعا میاد توی بازار، چیزهای لازم از چند ماه قبل همراه کرنل بوده.
پس یعنی همه درایور های همه سخت افزار های جهان رو جمع کرده ، صحیح ؟
نه. ولی تعداد خیلی زیادی از اونها رو داره. کم پیش میاد که یه سختافزار داشته باشید و کرنل درایور اون رو نداشته باشه و نتونید ازش استفاده کنید.
یعنی اینا روی هم چقد فضا گرفتن ؟
با df ببینید چقدر جا گرفتن. برای کرنل در حال اجرا اینجوری:
df -hs /lib/modules/"$(uname -r)"
البته این بالایی ممکنه توی chroot کار نده.