در فصل قبلی در مورد بوت لودر و وظیفه اون که راهاندازی اولیه سختافزار و لود کردن کرنل هست صحبت کردیم، حالا توی این فصل میخواهیم در مورد اینکه کرنل لینوکس (Linux Kernel) چهکارهایی میکند، چه جوری کرنل لینوکس رو انتخاب کنیم، چه جوری بیلدش کنیم و درنهایت دیوایس تری (Device Tree) چی هست صحبت کنیم.
کرنل لینوکس Linux Kernel
کرنل لینوکس سومین قسمت از امبدد لینوکس ما هست. وظیفه مدیریت منابع و ارتباط با سختافزار بر عهده کرنل لینوکس هست و یه جورایی همه کاره سیستم محسوب میشه. چون کرنل لینوکس با سختافزار مستقیم در ارتباط هست و مدیریت سختافزار با اون هست ممکنه فکر کنید کرنل لینوکس برای هر پردازنده و یا حتی هر برد باید متفاوت باشه، در حال حاضر اینجوری نیست ولی خیلی قدیمها اینجوری بوده.
الان شما میتوانید یه کرنل لینوکس عمومی داشته باشین و با کمک دیوایس تری اون رو برای بردها و یا حتی پردازندههای مختلف استفاده کنید و فقط دیوایس تری مربوط به هر برد رو بذارید کنار کرنل لینوکس و به بوتلودر بگین که این دیوایس تری رو همراه با کرنل لینوکس بارگذاری کن.
کرنل لینوکس Linux Kernel چه کارهایی میکنه
تولد سیستمعامل لینوکس به سال ۱۹۹۱ و زمانی که لینوس توروالدز نوشتن یک سیستمعامل رو برای برخی از کامپیوترهای شخصی اینتل شروع کرد برمیگرده.
لینوس توروالدز در حقیقت تنها کرنل لینوکس یا هسته لینوکس رونوشت و برای بقیهی قسمتهای این سیستمعامل از پروژه گنو استفاده کرد.
کرنل لینوکس سه تا کار مهم رو انجام میده: مدیریت منابع، برقراری ارتباط با سختافزار و فراهم کردن API برای برنامههای فضای کاربر. (در قسمت هفتم گفته بودیم API چی هست)
به این عکس دقت کنید تا بیشتر توضیح بدم:
به صورت خیلی ساده و غیر علمی: ما یک سختافزار داریم که کرنل لینوکس با اون در ارتباط هست.
کرنل لینوکسی داریم که به همه منابع سختافزار دسترسی داره و اونها رو مدیریت میکنه و یه سری کارهای دیگه هم توی فضای خودش انجام میده.
یه سری برنامهها هم هستن که ما مینویسیم و قرار هست اجرا بشن و یه سری کارها رو انجام بدن.
برنامههای ما منابع خیلی کمی در اختیار دارن و برای استفاده از منابع بیشتر و یا دسترسی به سختافزار باید با استفاده از کتابخانههای C از کرنل لینوکس بخوان واسشون اون کار رو انجام بده. واسه همین کرنل لینوکس خیلی خیلی خیلی مهمه و توی انتخابش خیلی باید دقت کنیم. پس با من بیاید تا باهم یاد بگیریم چه جوری کرنل لینوکس رو باید انتخاب کرد.
انتخاب کرنل لینوکس Linux Kernel
برای انتخاب کرنل لینوکس باید یه سبک سنگین کنیم بین، استفاده از به روزترین نسخه، امکانات و پشتیبانیهای سازنده SoC و پشتیبانی بلند مدت کرنل لینوکس.
چرخه توسعه لینوکس
کرنل لینوکس با سرعت نسبتاً زیادی توسعه پیدا میکنه و هر ۸ تا ۱۲ هفته یک بار یه نخسه جدید منتشر میشه.
تا قبل ازنسخه ۲.۶ نامگذاری کرنل لینوکس سه عددی بود مثل ۲.۶.۱۱. عدد وسط آگه زوج بود یعنی نسخه کاربر هست و آگه فرد بود یعنی نسخه توسعهدهندگان هست.
به خاطر اینکه این روش باعث میشد تغییرات و ویژگیهای جدید خیلی دیر به نسخه کاربر منتقل بشن دیگه از نسخه ۲.۶ به بعد کلاً کنار گذاشته شد.
در جولای ۲۰۱۱ نسخه بعد از ۲.۶.۳۹ نسخه ۳ نامگذاری شد، چرا؟ صرفاً چون لینوس حس میکرد دیگه خیلی عددا دارن طولانی میشن!
همینطور توی اپریل ۲۰۱۵ عدد اصلی از ۳ به ۴ و توی مارچ ۲۰۱۹ به ۵ تغییر کرد.
نسخههای پایدار Stable و پشتیبانی بلند مدت long-term support
گفتیم که هر نسخه جدید ۸ تا ۱۲ هفته یک بار منتشر میشه. این از جهت رفع باگ و بهروز شدن خوبه ولی خب در مقایسه با عمر پروژههای امبدد خیلی کم هست.
اگه یه سر به سایت کرنل لینوکس بزنیم این عکس رو میبینیم:
یه نسخه mainline داریم یه نسخه stable و چندین تا longterm
حالا اینا چی هستن؟
Mainline آخرین نسخه کرنل لینوکس هست.
Stable نسخه قبلی هست که الان پایدار شده و هنوز هم پشتیبانی و آپدیت میشه منتهی نه واسه مدت طولانی.
Longterm نسخههایی هستن که طولانیمدت پشتیبانی و آپدیت میشن مثلاً نسخه ۴.۹ از سال ۲۰۱۷ تا الان داره پشتیبانی و آپدیت میشه و به ۴.۹.۳۱۶ رسیده!
به این نسخهها بهاختصار LTS میگن.
معمولاً برای شروع یه پروژه امبدد لینوکس بهترین گزینه آخرین longterm هست.
حمایتهای فروشنده
قاعدتاً باید اینجوری باشه که ما آخرین کرنل لینوکس (Linux Kernel LTS) رو از خود سایت kernel.org دانلود کنیم یا گیت کنیم و برای برد یا SoC مون بیلدش کنیم و بدون مشکل استفاده کنیم.
در عمل برای اکثر پردازندهها و بردها این امکان وجود نداره و توسط mainline ساپورت نمیشن.
مثلاً عموم پردازندههای راک چیپ یا الوینر که توی پروژههای ما خیلی پرکاربرد هستن درایور GPU شون توسط mainline ساپورت نمیش.
توی این شرایط معمولاً باید از نسخهای از لینوکس استفاده کنیم که خود اون فروشنده برد یا سازنده SoC در اختیار ما میذاره.
در پرانتز بگویم که حتی این امر برای رسپبریپای هم صادق هست و بهتره کرنل لینوکس رو از سایت خود رسپبریپای بگیریم.
ساختن کرنل لینوکس Linux Kernel
خب من تصمیم داشتم آخرین نسخه LTS رو واسه رسپبریپای بیلد کنم ولی این کار اشتباه هست!
چرا؟ چون خودشون گفتن!
پس من هر دو روش رو میگم یکی از جایی که خودشون گفتن یکی هم آخرین LTS ولی درنهایت کرنل لینوکس خودشون رو بیلد میکنیم.
گرفتن سورس
در حال حاضر آخرین LTS نسخه ۵ هست. ممکنه زمانی که شما بخواین این کار رو انجام بدین نسخه جدید اومده باشه که باکمی تغییرات در دستورات زیر میتوانید اون رو استفاده کنید. با این دستور من میتونم اون رو دانلود کنم.
cd ~/EmbeddedLinux/RPI3BP/kernel/ wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.15.43.tar.xz
خب حالا که کرنل لینوکس رو گرفتیم بریم اکسترکتش کنیم.
tar xf linux-5.15.43.tar.xz
حالا کرنل خودشون رو هم دانلود میکنیم برای اینکار از لینک خود سایت استفاده میکنیم و توضیحاتش.
cd ~/EmbeddedLinux/RPI3BP/kernel/ git clone --depth=1 --branch stable https://github.com/raspberrypi/linux
حالا بریم یه سرک بکشیم توی فولدرهای کرنل لینوکس ببینیم چی داریم. بله سرک، اصلاً به فکر نگاه عمیق کردن بش نباشید بیشتر از ۵۷ هزارتا فایل هست و میلیونها خط کد! الان دو تا فولدر داریم که محتویات جفتشون یه ساختار داره:
cd linux-5.15.43 #or cd linux ls arch certs CREDITS Documentation fs init Kbuild kernel LICENSES Makefile net samples security tools virt block COPYING crypto drivers include ipc Kconfig lib MAINTAINERS mm README scripts sound usr
از این فولدرها یه سریهاش مهمتر هست. کریس بهمون گفته چی هستن این فولدرهای مهم:
یه سری هم به نظرات این پایین بندازید، نظرات رو بخونید و اگر شما هم نظری دارید، لطفا با ما به اشتراک بگذارید!
همه آموزش های امبدد لینوکس
منبع: سیسوگ