در رایانش ، یک ماژول هسته قابل بارگیری (LKM) یک ابجکت فایل است که حاوی کد برای گسترش هسته در حال اجرا یا اصطلاحاً پایه سیستم عامل است. LKM ها معمولاً برای پشتیبانی افزون تر از سخت افزار جدید (به عنوان مثال درایورهای دستگاه) و یا سیستم های فایل یا افزودن فراخوانی های سیستمی مورد استفاده قرار می گیرند. هنگامی که عملکرد ارائه شده توسط LKM دیگر مورد نیاز نباشد ، می توان آن را از اجرا خارج کرد تا حافظه و منابع دیگر آزاد شود.

اکثر سیستم های مشابه یونیکس و مایکروسافت ویندوز از ماژول های هسته قابل بارگذاری تحت نام های مختلف پشتیبانی می کنند ، مانند ماژول قابل بارگیری هسته (kld) در FreeBSD ، پسوند هسته (kext) در macOS (اکنون منسوخ شده است)  ماژول داخلی هسته در AIX ، درایور حالت هسته در Windows NT و ماژول هسته قابل بارگیری (DKM) در VxWorks. آنها همچنین به عنوان ماژول های قابل بارگذاری هسته (یا KLM) و به بیانی ساده تر به عنوان ماژول های هسته (KMOD) شناخته می شوند.

مزایا
-----

بدون ماژول های هسته قابل بارگذاری ، یک سیستم عامل باید کلیه قابلیت های پیش بینی شده کامپایل شده مستقیم در هسته پایه را شامل شود. بیشتر این قابلیت ها بدون استفاده در حافظه قرار دارند و به این ترتیب حافظه را هدر می دهند و نیاز است که کاربران هر بار که به قابلیت جدیدی نیاز دارند ، هسته پایه را بازسازی و راه اندازی مجدد کنند.

معایب
-----

یک انتقاد جزئی که به هسته مدولار درمقابل هسته ثابت وارد است ، تاوان و هزینه تکه تکه شدن وچندبخشی شدن است. هسته پایه همیشه با تنظیمات معمول در حافظه مجاور واقعی بسته بندی می شود. بنابراین ، کد هسته پایه هرگز تکه تکه نمی‌شود. هنگامی که سیستم در وضعیتی قرار گرفت که ممکن است ماژول ها وارد شوند ، به عنوان مثال هنگامی که سیستم های فایلی سوار شده اند که حاوی ماژول ها هستند ، احتمال دارد که هر درج کد جدید هسته باعث تکه تکه شدن هسته می شود ، در نتیجه با عملکردی با خطای جزئی با استفاده از ورودی های TLB بیشتر ، باعث از دست دادن بیشتر TLB می شود.

پیاده سازی در سیستم عامل های مختلف
----------------------------------

### لینوکس

ماژول های هسته قابل بارگیری در لینوکس توسط دستور modprobe بارگیری و بارگذاری می شوند. آنها در ماژول های / lib / قرار دارند و از نسخه 2.6 پسوند .ko ("شی هسته" kernel object) را دارند (نسخه های قبلی از پسوند .o استفاده می کردند). دستور lsmod ماژول های هسته بارگذاری شده را لیست می کند. در موارد اضطراری ،برای مثال هنگامی که سیستم به دلیل ماژول های ناقص نتواند بوت شود، ماژول های خاص را می توان با تغییر در لیست پارامترهای بوت هسته فعال یا غیرفعال کرد (به عنوان مثال ، در صورت استفاده از GRUB ، با فشار دادن "e" در فهرست شروع GRUB ، سپس ویرایش خط پارامتر هسته).

#### مشکلات مجوز

از نظر مسئولان و نگهدارندگان لینوکس ، LKM از کارهای هسته به دست آمده است. نگهدارندگان لینوکس ، توزیع ماژول های اختصاصی را مجاز می دانند ، اما اجازه علامت گذاری نمادها را فقط به مجوزهای عمومی GNU (GPL) می دهند. 

بارگذاری یک ماژول اختصاصی یا غیر سازگار با GPL پرچم taint را در هسته در حال اجرا تنظیم می کند - به این معنی که هرگونه مشکلی یا اشکال پیش آمده توسط نگهدارندگان کمتر مورد بررسی قرار می گیرد. LKM ها به طور موثر به بخشی از هسته در حال اجرا تبدیل می شوند ، بنابراین می توانند ساختار داده های هسته را خراب کرده و اشکالاتی تولید کنند که اگر واقعاً ماژول اختصاصی باشد ، نمی توان آنها را بررسی کرد.

##### جنجال Linuxant

در سال 2004 ، لینوکسانت ، یک شرکت مشاوره ای که درایورهای دستگاه اختصاصی را به عنوان ماژول های هسته قابل بارگیری توزیع می کند ، سعی در سو استفاده از یک خنثی کننده تهی در MODULE\_LICENSE آنها داشت ، همانطور که در متن کد زیر قابل مشاهده است:

```
MODULE\_LICENSE("GPL\0for files in the \"GPL\" directory; for others, only LICENSE file applies");

```
کد مقایسه رشته ای که در آن زمان توسط هسته استفاده شده بود ، سعی می کند تعیین کند ماژول با GPLed با رسیدن به یک کاراکتر null متوقف شده باشد ، بنابراین فریب می خورد که ماژول مجوز خود را فقط "GPL" اعلام کرده است .

### FreeBSD

ماژول های هسته برای FreeBSD در / boot / kernel / برای ماژول های توزیع شده با سیستم عامل ، یا معمولاً / boot / modules / برای ماژول های نصب شده از درگاه های FreeBSD یا بسته های FreeBSD ، یا برای ماژول های اختصاصی یا فقط باینری ذخیره می شوند. ماژول های هسته FreeBSD معمولاً پسوند .ko دارند. هنگامی که دستگاه بوت شد ، ممکن است با دستور kldload بارگذاری شوند ، با kldunload بارگیری شوند و با kldstat لیست شوند. ماژول ها را می توان قبل از شروع هسته ، به صورت خودکار (از طریق /boot/loader.conf) یا با دست از لودر بارگیری کرد.

### سیستم عامل مک

برخی از ماژول های هسته قابل بارگیری در macOS می توانند به طور خودکار بارگیری شوند. ماژول های هسته قابل بارگیری نیز توسط دستور kextload بارگیری می شوند. آنها را می توان با دستور kextstat لیست کرد. ماژول های هسته قابل بارگذاری در بسته های با پسوند .kext قرار دارند. ماژول های ارائه شده با سیستم عامل در فهرست / System / Library / Extensions ذخیره می شوند. ماژول های ارائه شده توسط اشخاص ثالث در فهرست های مختلف دیگری وجود دارد.

### NetWare

از ماژول هسته NetWare به عنوان ماژول قابل بارگیری NetWare (NLM) یاد می شود. NLM ها با استفاده از دستور LOAD وارد هسته NetWare می شوند و با استفاده از دستور UNLOAD حذف می شوند. دستور modules ماژول های هسته بارگیری شده را لیست می کند. NLM ها ممکن است در هر مسیر جستجوی معتبری که در سرور NetWare اختصاص داده شده باشد ، قرار بگیرند و از آنها .NLM به عنوان پسوند نام فایل استفاده شود.

### VxWorks

برای تولید یک پرونده ".out" می توان پروژه ای از نوع ماژول هسته قابل بارگیری (DKM) ایجاد کرد که می تواند با استفاده از دستور "ld" در فضای هسته بارگیری شود. این ماژول هسته قابل بارگیری با استفاده از دستور "unld" قابل بارگذاری است.

### سولاریس

Solaris دارای مسیر بارگیری ماژول هسته با قابلیت تنظیم است ، به طور پیش فرض به / platform / platform-name / kernel / kernel / usr / kernel می رود. بیشتر ماژول های هسته در زیرشاخه های زیرهسته قرار دارند، مواردی که برای راه اندازی سیستم تا جایی که init شروع می شود ضروری نیست ، اغلب (اما نه همیشه) در / usr / هسته یافت می شود. هنگام اجرای هسته DEBUG ، سیستم به طور فعال برای تخلیه ماژول ها تلاش می کند.

سازگاری دودویی
--------------

لینوکس API یا ABI پایدار برای ماژول های هسته ارائه نمی‌دهد. این بدان معنی است که در ساختار و عملکرد داخلی بین نسخه های مختلف هسته تفاوت وجود دارد ، که می تواند باعث مشکلات سازگاری شود. در تلاش برای مقابله با این مشکلات ، داده های نسخه سازی نماد در بخش .modinfo ماژول های ELF قابل بارگذاری قرار می گیرد. قبل از بارگذاری ماژول ، این اطلاعات نسخه را می توان با اطلاعات هسته در حال اجرا مقایسه کرد. اگر نسخه ها ناسازگار باشند ، ماژول بارگیری نمی‌شود.

سیستم عامل های دیگر مانند Solaris ، FreeBSD ، macOS و Windows هسته API و ABI را نسبتاً پایدار نگه می دارند ، بنابراین از این مشکل جلوگیری می کنند. به عنوان مثال ، ماژول های هسته FreeBSD که در برابر نسخه 6.0 هسته کامپایل شده‌اند ، بدون تجمیع مجدد نسخه های FreeBSD 6.x دیگر ، مانند مثال 6.4 کار می کنند. با این حال ، آنها با نسخه های اصلی دیگر سازگار نیستند و برای استفاده با FreeBSD 7.x باید دوباره کامپایل شوند ، زیرا سازگاری API و ABI فقط در یک شاخه حفظ می شود.

امنیت
-----

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

### لینوکس

Linux اجازه غیرفعال کردن بارگیری ماژول را از طریق گزینه sysctl / proc / sys / kernel / modules\_disabled می دهد. یک سیستم initramfs ممکن است ماژول های خاصی را که برای دستگاه در هنگام راه اندازی لازم است بارگیری کند و سپس بارگیری ماژول را غیرفعال کند. این امر امنیت را بسیار شبیه به هسته یکپارچه می کند. اگر یک مهاجم بتواند initramf ها را تغییر دهد ، می تواند باینری هسته را تغییر دهد.

### سیستم عامل مک

در OS X Yosemite و نسخه های بعدی ، یک پسوند هسته باید با یک گواهی توسعه دهنده که دارای "حق" خاصی برای این امر است ، کد شود. چنین گواهی توسعه دهنده ای فقط توسط اپل در صورت درخواست ارائه می شود و به طور خودکار به اعضای توسعه دهنده اپل داده نمی‌شود. این ویژگی که "امضای kext" نامیده می شود ، به طور پیش فرض فعال است و به هسته دستور می دهد در صورت وجود پسوندهای بدون امضا ، از راه اندازی جلوگیری کند. در OS X El Capitan و نسخه های بعدی ، این بخشی از محافظت از یکپارچگی سیستم است.

در نسخه های قدیمی macOS ، یا اگر امضای kext غیرفعال باشد ، اگر ویژگی OSBundleAllowUserLoad در لیست ویژگی های بسته ، True تنظیم شود ، می توان یک ماژول هسته قابل بارگذاری را در یک بسته نرم‌افزاری هسته بارگذاری کرد. با این حال ، اگر هیچ یک از فایل های موجود در بسته ، از جمله فایل های کد اجرایی ، متعلق به ریشه گروه نباشد ، یا توسط گروه یا "دیگری" قابل نوشتن باشد ، تلاش برای بارگیری ماژول قابل بارگذاری هسته با شکست مواجه می شود.

### سولاریس

ماژول های هسته می توانند به صورت اختیاری دارای یک بخش امضای رمزنگاری ELF باشند که بسته به تنظیمات سیاست Verified Boot تأیید می شود. هسته می تواند مجوزهایی را که به صورت رمزنگاری توسط مجموعه ای از گواهینامه های معتبر امضا شده‌اند ، اعمال کند. لیست گواهینامه های قابل اعتماد خارج از سیستم عامل در ILOM در برخی از سیستم عامل های مبتنی بر SPARC نگهداری می شود.بارگیری آغازین ماژول هسته توسط فضای کاربری فقط زمانی از مسیر قابل اعتماد امکان پذیر است که سیستم با ویژگی غیرقابل تغییر منطقه جهانی فعال باشد.

جستارهای وابسته
---------------

* NetWare ماژول قابل بارگیری

منابع
-----

1. ↑  «Deprecated Kernel Extensions and System Extension Alternatives - Support - Apple Developer». *developer.apple.com*. دریافت‌شده در ۲۰۲۱-۰۶-۲۱.
2. ↑  «Introduction». *developer.apple.com*. دریافت‌شده در ۲۰۲۱-۰۶-۲۱.
3. ↑  lorihollasch. «File system filter load order - Windows drivers». *docs.microsoft.com* (به انگلیسی). دریافت‌شده در ۲۰۲۱-۰۶-۲۱.
4. ↑  «Compiling Kernel Modules». *tldp.org*. دریافت‌شده در ۲۰۲۱-۰۶-۲۱.
5. ↑  «Public Git Hosting - linux-2.6.git/blob - Documentation/oops-tracing.txt». *repo.or.cz*. دریافت‌شده در ۲۰۲۱-۰۶-۲۱.
6. ↑  «Tainted kernels — The Linux Kernel documentation». *www.kernel.org*. دریافت‌شده در ۲۰۲۱-۰۶-۲۱.
7. ↑  «Tainting from user space [LWN.net]». *lwn.net*. دریافت‌شده در ۲۰۲۱-۰۶-۲۱.
8. ↑  «Tainted kernel | Support | SUSE». *www.suse.com*. دریافت‌شده در ۲۰۲۱-۰۶-۲۱.
9. ↑  «Being honest with MODULE\_LICENSE [LWN.net]». *lwn.net*. دریافت‌شده در ۲۰۲۱-۰۶-۲۱.
10. ↑  *www.ouah.org*. دریافت‌شده در ۲۰۲۱-۰۶-۲۱. پارامتر `|عنوان= یا |title=` ناموجود یا خالی (کمک)
11. ↑  «linux/kernel/git/torvalds/linux.git - Linux kernel source tree». *archive.ph*. ۲۰۱۳-۰۴-۱۵. بایگانی‌شده از اصلی در ۱۵ آوریل ۲۰۱۳. دریافت‌شده در ۲۰۲۱-۰۶-۲۱.
12. ↑  «clean module disabling « codeblog» (به انگلیسی). دریافت‌شده در ۲۰۲۱-۰۶-۲۱.
13. ↑  «Kernel Extensions». *developer.apple.com*. دریافت‌شده در ۲۰۲۱-۰۶-۲۱.
14. ↑  «Info.plist Properties for Kernel Extensions». *developer.apple.com*. دریافت‌شده در ۲۰۲۱-۰۶-۲۱.
15. ↑  "kextload(8) [mojave man page]". *www.unix.com* (به انگلیسی). Retrieved 2021-06-21.

1.