آیا میدانید کرنل لینوکس چیست؟ چه کاربردی در اندروید دارد، دلیل ضرورت وجود آن در اندروید چیست و چگونه میتواند باعث تقویت عملکرد گوشیهای اندرویدی شود؟ در این مطلب به این سؤالها پاسخ خواهیم داد و هر آنچه را که باید در مورد کرنل و انواع مختلف آن بدانید، بیان میکنیم.
آیا تاکنون واژه کرنل (Kernel) لینوکس را شنیدهاید؟ اندروید هم از کرنل لینوکس استفاده میکند. در حقیقت کرنل اندروید که به آن هسته اندروید هم گفته میشود، بخش مهمی از سیستمعامل لینوکس است و در عملکرد گوشی شما تأثیر بسیار مهمی دارد؛ اما کرنل چیست؟
فهم واژه لینوکس آسان است. در حقیقت واژه لینوکس ترکیبی از دو واژه لینوس (linus) و یونیکس (Unix) است. لینوس در حقیقت به نام لینوس توروالدز (Linus Torvalds)، مهندس نرمافزار اشاره میکند و یونیکس هم نام یک نرمافزار است. لینوس توروالدز نام مهندس سازنده نرمافزار شبه سیستمعامل یونیکس است؛ اما کرنل چیست؟ منظور از کرنل در کامپیوترها و سایر وسایل چیست؟ منظور از کرنل لینوکس چیست؟
کرنل یا هسته بخشهایی مثل منابع سیپییوی گوشی، حافظه سیستم، برخی سخت افزارهای آن و موارد دیگری مثل فایلهای سیستمی و فرآیندهای مربوط به شبکه را مدیریت میکند. در ضمن کرنل مسئولیت مدیریت تمام پردازشها و وظایف (تسکها) در حال اجرا در گوشیهای هوشمند را نیز برعهده دارد.
در حقیقت زمانی که اپلیکیشنی را اجرا میکنید، این بخش از اندروید اپلیکیشن موردنظر را در حافظه بارگذاری میکند، فعالیتهای پردازشی موردنیاز آن را انجام میدهد و درنهایت اپلیکیشن را اجرا میکند؛ به بیان دیگر زمانی که اپلیکیشن نیازمند فضایی از حافظه است، کرنل فضای موردنیاز را در اختیار آن قرار میدهد یا زمانی که اپلیکیشن نیازمند شبکه است، کرنل پردازشهای سطح پایین را برای این فرایند انجام میدهد.
هدایت و مدیریت دستگاههایی مثل بلوتوث گوشی نیز برعهده کرنل است و بهاصطلاح درایور این وسایل محسوب میشود. زمانی که اپلیکیشنی میخواهد وظایفی را در پسزمینه سیستمعامل انجام دهد، تمام رشتههای پسزمینه را مدیریت میکند (منظور از رشتههای پسزمینه، فعالیتهای پردازشی در حال انجام در پسزمینه سیستمعامل مثل عملیاتهای محاسباتی روی اطلاعات ورودی دریافتشده از سوی کاربر است).
در ضمن پس از اینکه کاربر اپلیکیشنی را میبندد، کرنل تمام اطلاعات ذخیره شده در حافظه و منابعی را که اپلیکیشن در حین اجرا از آنها استفاده میکرده است، پاک میکند. همانطور که میبینید، کرنل یکی از بخشهای اساسی اندروید به شمار میرود و با هدف فراهم کردن عملکردی بینقص برای سیستمعامل گوشی درست مطابق با انتظارات کاربر ایجاد شده است.
نگاهی دقیقتر به کرنل
تمام سیستمعاملهایی که از قابلیت مولتی تسکینگ پشتیبانی میکند و میتوانند چند کار را همزمان با یکدیگر انجام دهند، دارای یک شکل یا چند شکل متفاوت از کرنل هستند؛ بنابراین سیستمعاملهایی مثل ویندوز، OS X و iOS و البته اندروید دارای کرنل هستند؛ البته تنها اندروید از کرنل لینوکس استفاده میکند. ویندوز دارای کرنل دیگری تحت عنوان کرنل NT است و iOS نیز از کرنل داروین (Darwin) بهره میبرد.
البته کرنل انواع متنوع دیگری نیز دارد که از میان آنها میتوان به کرنلهای شبه یونیکس مثل کرنلهای مورد استفاده در پروژههای FreeBSD ،OpenBSD و NetBSD، کرنلهای زمان واقعی مثل پروژههای FreeRTOS، کرنلهای نهفته در پروژههایی مثل زفیر (Zephyr)، کرنلهای کمقدرت مثل کرنل mbed OS با معماری ARM اشاره کرد. در واقع تمام دستگاههای دارای قابلیت انجام فعالیتهای محاسباتی از کرنل استفاده میکنند؛ از وسایل اینترنت اشیاء و گجتهای پوشیدنی گرفته تا ابرکامپیوترها.
کرنل بخش پیچیدهای از سیستمعامل محسوب میشود که میلیونها خط کد منبع را در خود جای داده است. محتویات کرنل شامل تمام درایورها (بخش عمدهای از کد کرنل مربوط به درایورها است) و همچنین کدهای لازم برای پشتیبانی از معماریهای مختلف ازجمله ARM، x86 ،RISC-V ،PowerPC و غیره است.
لازم به ذکر است زمانی که کرنل برای وسیلهای مثل گوشی هوشمند ایجاد میشود، تمام کدهای موجود در آن، توسط وسیله موردنظر استفاده نمیشوند؛ البته حتی درصورتیکه آن دسته از کدهای غیرضروری را که استفاده نمیشوند نیز از کرنل جدا کنیم، باز هم بخش پیچیدهای محسوب میشود.
مقایسه کرنل مونولینیک (Monolithic) با میکروکرنل (microkernel)
طبیعتاً تمام سیستمهای پیچیده با رویکردهای متفاوت طراحی میشوند و کرنل هم از این قاعده مستثنا نیست. کرنل لینوکس معمولاً بهعنوان کرنل مونولیتیک شناخته میشود. در واقع کرنل مونولیتیک رویکردی محسوب میشود که بر اساس آن کرنل یک برنامه کامپیوتری به شمار میرود که از یک حافظه اختصاصی استفاده میکند. جایگزین اصلی رویکرد کرنل مونولیتیک رویکرد میکروکرنل است؛ که بر اساس آن بخشهای اصلی و اساسی کرنل در کوچکترین برنامه ممکن جای داده میشوند و با کرنلهای دیگر که برای اجرای سرویس یا سرویسهای مجزا به کار گرفته میشوند، تعامل برقرار میکنند.
در سال ۱۹۹۲ که لینوکس تازه ایجاد شده بود، لینوس توروالدز و پروفسور اندرو تاننبام (Andrew Tanenbaum) که به دلیل تألیف کرنلهای مرتبط با طراحی سیستمعاملها و شبکه مشهور شده بود، مباحثه آنلاین داغی (در حقیقت یک مبارزه) انجام دادند که موضوع آن مقایسه پارامترهای متفاوت طراحی کرنل مونولیتیک با پارامترهای میکروکرنل بود. اندرو میکرو کرنلها را ترجیح میداد؛ اما لینوس در حال نوشتن یک کرنل مونولیتیک بود. به همین دلیل لینوکس و همچنین کرنل مورد استفاده در اندروید یک کرنل مونولیتیک محسوب میشود و از ابتدا تاکنون تغییری نکرده است.
به دلیل اینکه لینوکس یک کرنل مونولیتیک محسوب میشود؛ بنابراین باید راهی وجود داشته باشد که با استفاده از آن بتوان بخشهای خاص کرنل را متناسب با نیازهای کاربر فعال یا غیرفعال کرد. انجام این کار در هنگام انجام فرآیند کامپایل توسط سیستمی که امکان تنظیم، حذف کدهای غیرضروری و پیکربندی را برای کرنل فراهم میکند، امکانپذیر میشود.
تغییرات ایجاد شده توسط برخی پیکربندیها فراتر از فعال یا غیرفعال کردن فعالیتها است و آنها توانایی تغییر رفتارهای کرنل را نیز دارد. چنین قابلیتی در زمان تغییر ویژگیهای سختافزاری گوشی هوشمند، قابلیتی مفید و کاربردی محسوب میشود. از آنجایی که لینوکس متنباز است و هسته اندروید نیز به لطف پروژه متنباز اندروید (AOSP)، چنین ماهیتی دارد، جامعهای از توسعهدهندگان و علاقهمندان به اندروید ایجاد شده است که در آن کرنلهای متفاوتی برای گوشیهای اندرویدی منتشر میشود؛ البته میزان محبوبیت و در دسترس بودن این کرنلهای منتشر شده به برند و مدل گوشیتان بستگی دارد.
نحوه استفاده اندروید از لینوکس
در ظاهر اندروید سیستمعاملی کاربردی با اپلیکیشنهای محبوب مثل گوگل کروم برای وبگردی، اپهای شبکههای اجتماعی و بازیهای جذاب است، اما این سیستمعامل ساختار پیچیدهای دارد و در پشتپرده آن سیستمهای زیرمجموعه، لایبرریها و فریمورکهای زیادی وجود دارد.
اندروید در هنگام اجرای اپلیکیشنها (چه مستقیماً از خود سیستمعامل و چه از ماشین جاوا) برای انجام کارهایی مثل نمایش نوتیفیکیشنها، ارائه سرویسهای موقعیتیابی، رندر شدن صفحات وب، ارائه SSL، مدیریت پنجرهها و سایر موارد، لایبرریها و فریمورکهای زیادی را فراهم میکند. در ضمن در سیستمعامل اندروید سرویس ویژهای تحت عنوان SurfaceFlinger وجود دارد که مسئولیت ایجاد و جمعآوری تمام موارد لازم برای نمایش گرافیک در نمایشگر گوشی را برعهده دارد.
در حقیقت کرنل سیستم زیرمجموعه فریمورکها و لایبرریهای مختص اندروید است و علاوه بر اینکه مدیریت پردازشها، حافظه و توان پردازشی را برعهده دارد، کدهای لازم برای معماریهای مختلف تراشه و درایورهای سختافزارهایی را که دستگاه اصلی از آنها پشتیبانی میکند، در خود جای داده است. این درایورها شامل درایورهای دوربینها، بلوتوث، وایفای، حافظه فلش، پورت USB و درایورهای صوتی میشود.
در مقابل اندروید هم ویژگیهایی به کرنل لینوکس میافزاید که باعث مناسبتر شدن آن برای گوشیهای اندرویدی میشود. یکی از این ویژگیها قابلیت Low Memory Killer است. این ویژگی بهمنظور بررسی وضعیت حافظه و پاک کردن بیاهمیتترین دادهها و پردازشها جهت تأمین فضای موردنیاز ایجاد شده است. ایجاد این ویژگی باعث میشود سیستم بدون هیچ مشکلی به کار خود ادامه دهد و در فرآیند Wake Lock مشکلی ایجاد نشود. Wake Lock در حقیقت روشی است که اپلیکیشنها با بهرهمندی از آن میتوانند به کرنل اطلاع دهند که کدام یک از سختافزارها باید فعال باقی بمانند.
در اندروید ۸ پروژه تربل (Project Treble) معرفی شد. این پروژه در حقیقت بازآفرینی معماری اندروید محسوب میشود که یک رابطه که بهخوبی تعریف شده است، بین فریمورک سیستمعامل و نرمافزارهای سطح پایین اختصاصی هر یک از دستگاهها ایجاد میکند. بر اساس مبانی این پروژه، سیستم روی تراشه (SoC) و درایورهای مختص برد دستگاه، با استفاده از ماژولهای کرنل لینوکس از کرنل اصلی جدا میشوند.
چنین قابلیتی به سازندگان گوشی کمک میکند بتوانند بدون نیاز به تغییر کرنل اصلی، روی ویژگیهای خاص کار کنند. در حقیقت پروژه تربل با هدف کمک به سازندگان گوشیهای برای آسانتر کردن آپدیت گوشیها بدون نگرانی در مورد کدهای سطح پایین ایجاد شده است.
نحوه ایجاد تغییر در کرنلها توسط گوشیهای اندرویدی
با توجه به وجود تنوع بسیار بالای گوشیهای اندرویدی، کرنل مورد استفاده در هر یک از گوشیهای اندرویدی دارای برند و مدل، متفاوت کمی متفاوت است. در هر گوشی برای بخشهایی مثل سیستم روی تراشه و همچنین ماژولهای دیگر مثل جیپیاس، صدا و سایر موارد، درایورهای اختصاصی وجود دارد.
تمام سازندگان گوشی برای پیکربندی کرنل جهت بهینهسازی آن به بهترین شکل ممکن برای یک گوشی با مدل خاص، با سازندگان تراشهها مثل کوالکام و مدیاتک مشارکت دارند. این موضوع به معنای این است که سازندگان گوشیها تغییراتی در پیکربندیهای متداول کرنل ایجاد میکنند و درایورهای جدیدی را به کرنل لینوکس اضافه میکند.
تغییر در زمانبند سیپییو (CPU scheduler) مثال خوبی در زمینه ایجاد تغییر در کرنل محسوب میشود. کرنل زمانی که باید تصمیم بگیرد تسک بعدی کدام تسک باشد و در کدام هسته اجرا شود، از زمانبند سیپییو استفاده میکند. بسیاری از گوشیهای اندرویدی سیستمهای چندپردازندهای ناهمگن (heterogeneous multi-processor یا HMP) محسوب میشوند؛ بهعبارتدیگر تمام هستههای مورد استفاده در پردازنده این گوشیها یکسان نیستند و برخی از آنها دارای عملکرد بالاتر و برخی دیگر کممصرفتر هستند. کرنل با استفاده از یک زمانبند انرژی آگاه (Energy-Aware Scheduler یا EAS) میتواند تأثیر نتیجهگیریهایش روی انرژی مصرفی سیپییوها و همچنین سطح عملکرد در دسترس را پیشبینی کند.
سازندگان گوشیها میتوانند با ایجاد تغییر در پارامترهای زمانبند انرژی آگاه عملکرد گوشی را با افزایش انرژی مصرفی آن، بهبود دهند یا بالعکس با کاهش سطح عملکرد، مصرف انرژی گوشی را کاهش و درنتیجه عمر باتری آن را افزایش دهند. در ضمن سازندگان گوشی میتوانند زمانبند موجود در سیستمعامل را با زمانبندی که خود آنها طراحی و ایجاد کردهاند، جایگزین کنند.
هر یک از سازندگان گوشی تلاش میکنند پیکربندی کرنل را به بهترین شکل ممکن بهینهسازی کنند تا امکان استفاده از تمام ویژگیهای موردنظر با بهترین عملکرد و کمترین مصرف انرژی ممکن، امکانپذیر شود. برخی از مهندسان شرکتهای سازنده گوشیها با مشارکت مهندسان فعال در شرکتهای تولید تراشه تلاش میکنند نرمافزار و سیستمعامل گوشی را طوری تنظیم کنند که بیشترین بهره را از سختافزار آن ببرد.
البته باید بگوییم که سازندگان گوشیها در مورد پیکربندی کرنل لینوکس اشتباه نمیکنند یا در مورد موضوع تصمیمات بدی نمیگیرند؛ اما آنها در برخی از مواقع برای حفظ عمر باتری گوشی یا حتی افزایش آن، اقدامات غیرقابلتوجیهی را انجام میدهند؛ بهعنوانمثال شرکت وان پلاس برای حفظ عمر باتری گوشی وان پلاس ۹ پرو، سطح عملکرد آن را کاهش و سرعت برخی از اپلیکیشنها را در آن عمداً به میزان قابلتوجهی کاهش داده است. برخی دیگر از شرکتها نیز به فریب دادن مشتریان خود شهرت دارند و در هنگام آزمایش گوشیهای خود با بنچمارکها، عملکرد سیپییوی آنها را بهصورت ساختگی افزایش میدهند.
آینده استفاده از کرنل لینوکس در اندروید
یکی از نکات منفی در رابطه با لینوکس، تغییر سریع آن است؛ البته برای ایجاد سطح مناسبی از پایداری میتوان از نسخههایی از کرنل با پشتیبانی بلندمدت (Long Term Support یا LTS) استفاده کرد که میتوان چندین سال از آنها پشتیبانی کرد. کرنلهای مشترک اندروید که با نام Android Common Kernels یا AKCs شناخته میشوند از کرنل اصلی لینوکس گرفته میشوند و شامل پچهای مختص اندروید هستند.
با انتشار اندروید ۱۱ استفاده از کرنلهای مشترک اندروید برای ایجاد ایمیجهای هسته عمومی (Generic Kernel Images یا GKIs شروع شد. این کرنلها در حقیقت کرنلهای ۶۴ بیتی با معماری ARM هستند که درصورتیکه ماژولهای گوشی قابلیت پشتیبانی از سیستم روی تراشه و درایورها را داشته باشند، میتوان در هر دستگاهی از آنها استفاده کرد.
هدف از استفاده از این کرنلها برطرف کردن مشکل فرگمنتیشن (fragmentation) کرنل با یکپارچه کردن کرنل اصلی و منتقل کردن بخشهای اصلی سیستم روی تراشه به خارج از کرنل آب و انتقال آنها به ماژولهای قابل بارگذاری است. اگرچه این کار باعث جدا شدن قطعات سختافزاری خاص از کرنل اصلی میشود، اما در مقابل فشار و بار ناشی از حفظ و نگهداری کرنل را برای سازندگان گوشی کاهش میدهد.
با انتشار اندروید ۱۲ عرضه تعدادی از دستگاهها با Generic Kernel Images شروع شد. گوگل نیز متعهد شده است ایمیجهای فایل بوت boot.img را بهصورت مرتب منتشر و مهمترین باگهای آنها را نیز برطرف کند. به دلیل اینکه ایمیجهای هسته عمومی دارای ثبات بالایی هستند، این ایمیجها میتوانند بدون هیچگونه تغییری در درایورهای مختص سختافزارها نصب شوند.
این کار میتواند زمینه تقویت انتشار کرنلهای جدیدتر لینوکس توسط گوگل برای استفادههای عمومی را فراهم کند. در ضمن چنین پیشرفتی بهنوبه خود میتواند باعث افزایش امنیت گوشیها و افزایش مدتزمان پشتیبانی از گوشی برای انتشار آپدیتهای جدید نرمافزاری و رفع باگهای آنها شود.