با قسمت نوزدهم از دوره ورود به دنیای امبدد لینوکس که دوره مقدماتی آموزش امبدد لینوکس می باشد همراه ما باشید.
در قسمت قبل به بررسی نحوه کانفیگ و کامپایل کرنل لینوکس برای رزبری پای پرداختیم و در این قسمت به سراغ device tree میریم و با آن بیشتر آشنا میشویم.
شاید برای شما مفید باشد: آموزش رزبری پای از 0 تا 100
تا حالا اسم این بزرگوار رو زیاد شنیدین، حالا ببینیم چی هست این درخت دستگاه!
ایده به خیلی قبلترها و PowerPC ها برمیگرده.
چرا باید برای هر برد جدا کرنل لینوکس رو build کنیم؟
نمیشه یه کرنل لینوکس باشه و روی خیلی از بردها قابلاستفاده باشه؟
توی فصل دوم یاد گرفتیم که معماری پردازنده مهم هست برای تولچین و با دانستن معماری میتوانیم برنامه اجرایی داشته باشیم که روی پردازندههایی که توسط شرکتهای مختلف ساختهشدن قابلاجرا باشه.
– حالا چرا این برنامه اجرایی خود کرنل لینوکس نباشه؟ چه مشکلی پیش میاد مگه؟
+ درایورها و سختافزارهای هر برد و پردازنده متفاوت هستن.
– خب اطلاعات مربوط به اونا رو جدا به کرنل لینوکس میدهیم
+ سلام دیوایس تری!
فایلهای دیوایس تری در حقیقت توضیحات استاتیک از سختافزار و وسایل جانبی کامیپوتر یا برد ما هستن که توسط کامپایلر خودشون کامپایل میشن و تبدیل به فایلی قابلفهم توسط لینوکس میشن.
دیوایس تری Device Tree معمولاً توسط بوت لودر توی رم لود میشه و آدرسش به کرنل لینوکس داده میشه ولی میتونه به خود کرنل لینوکس هم بچسبه.
سینتکس دیوایس تری از بوت لودر Open Boot مشتق شده و میتونید جزییات کاملش رو اینجا ببینید.
اگه یه سر به فولدر زیر بندازین فایلهای زیادی با پسوند dts و dtsi میبینید:
حتی بعضی از شرکتها توی این فولدر خودشون یه فولدر دارن و توی اون این فایلهای دیوایس تری هست.
فایلهایی با پسوند dts فایلهای سورس دیوایس تری هستن و فایلهایی با پسوند dtsi فایلهای سرایند یا همان هدر خودمون هستند که توی بقیه dts ها استفاده شدن.
ممکنه توی بعضی از این فایلها ببینید هدرهای C فراخوانی شده، توی بعضیها ببینید dts فراخوانی شده. مهم نیست همه رو میتونیم انجام بدیم و محدودیت نداریم.
برای فراخوانی فایل هم ممکنه این دو مدل syntax رو ببینید:
هر دوشون درست هستن و یه کار رو میکنن.
قبل از اینکه بریم و فایل dts برد خودمون رو ببینیم باید با ساختار include توی دیوایس تری Device Tree آشنا بشیم.
فرض کنیم فایل at00.dts رو باز کردیم و اینا توش هست:
توی هر کدوم از این سه تا فایل هم یک سری دستگاهها با یه سری ویژگی تعریف شدن که بینشون دستگاههای مشترک زیاد هست. حتی بعضیهاشون توی فایل at00.dts باز هستن با یه ویژگیهای جدید یا متفاوت با قبلیها.
ازنظر کرنل لینوکس و بعد از کامپیال شدن فایل دیوایس تری اون دستگاه تمام ویژگیهایی که توی این فایلها هست رو داره و آگه ویژگی توی چند تا فایل با مقادیر مختلف وجود داره اولویت با آخرین فایل هست.
بیاید فایل دیوایس تری Device Tree رسپبریپای رو بازکنیم ببینم چی توش هست:
بهبه چقدر زیبا! پر از خالی!
این یعنی ما باید بریم و این فایل رو باز کنیم:
که وجود نداره! ولی چون بچههای باهوشی هستیم میدونیم باید این فایل رو باز کنیم:
اولش یه سری فراخوانی داریم که یعنی خیلی از قسمتها توی فایلهای دیگر تعریف شدن. فایل دیوایس تری پر از نود هست و نود اصلی با اسلش مشخص میشه. هر نود یه سری زیرمجموعه داره و اون زیرمجموعهها یه سری پارامتر دارن که با فرمت name=”value” مشخص شدن.
نود اصلی (ریشه) یه متغیر داره به نام compatible، این متغیر رو ممکنه واسه خیلی نودها ببینید و خب خیلی مهم هست.
توی فایلهای درایور لینوکس یه استارکچر هست به نام of_device_id کرنل لینوکس با استفاده از این متغیر compatible توی درایورهای مختلف به دنبال سازگارترین درایور میگرده و همون رو استفاده میکنه.
یه متغیر دیگه که مهم هست reg هست. reg معمولاً دو تا مقدار داره مقدار اول آدرس فیزیکی اون نود هست و مقدار دوم سایزش:
نود cpus
این نود میگه ما یه cpu داریم که خودش چهارتا زیر مجموعه داره.
این دو متغیر در نود مادر مشخص میکنند که برای متغیر reg در نودهای فرزند وضعیت آدرس و سایز چه جوری هست.
آدرس میتونه ۳۲ یا ۶۴ بیتی باشه و سایز هم میتونه بدون مقدار، ۳۲ و یا ۶۴ بیتی باشه و مقادیر این دو متغیر ۰ و ۱ و ۲ میتونه باشه.
آگه جایی این دو متغیر نبودن مقدار پیش فرضشون ۱ هست.
مثلاً توی فایل قبل و نود memory:
ما یک حافظهداریم که از آدرس صفر شروع میشه و سایزش 0x40000000 بایت یا همون یک گیگ خودمون هست.
به این قسمت توجه کنید cpu0: cpu@0 به cpu0 لیبل میگن، لیبلها واسه این هستن که بعداً آگه جایی ما خواستیم رفرنس بدیم به این نود از اون لیبل استفاده کنیم.
@ هم آگه نودمون متغیر reg داشت حتماً باید باشه و عدد بعدش معمولاً آدرس اون متغیر هست.
متغیر مهم بعدی device_type هست که خیلی گزینهها میتونه داشته باشه که واسه ما سختافزاریها معمولاً قابلفهم هستن.
داستان دیوایس تریز خیلی مفصل هست ولی واسه ما تا همین حد کافیه.
من تابهحال کتابی واسش ندیدم جستهگریخته کتابهای امبددلینوکس و درایور لینوکس هر کدوم یه سری مطالب در موردش گفتن.
آگه علاقهمند بودین و سرچ کردین و کتابی رو پیدا کردین به من هم اطلاع بدین.
خیلی از بردها رو میتونیم با یوبوت و داشتن کرنل لینوکس و دیوایس تریز با یه روت سیستم ساده استفاده کنیم.
این کار رو توی فصل قبل انجام دادیم اینجا یکم ملموستر شد چون یه مرحله رفتیم جلو و البته که توی فصل بعد خیلی ملموس میشه.
توی فصل قبل گفتیم که رسپبریپای از بوت لودر خودش استفاده میکنه و خیلی با یوبوت سازگار نیست!
الان اینجا میخوایم با بوت لودر خودش کار رو کامل انجام بدیم.
خب اولش توی کارت حافظهای که داشتیم بوت لودرهای رسپبری رو میریزیم و بعدش کرنل لینوکس خودمون رو با فایل های همراهش البته.
با فرض اینکه آدرس کارت حافظه /dev/sdc هست.
اول بوت لودر رسپبری:
حالا بریم سراغ کرنل لینوکس خودمون و فایل هاش (فایل ها از داکیومنتهای خود رسپبری میاد و چیزی نیست که من علمش رو از قبل داشته بوده باشم):
و در نهایت دو فایل config.txt و cmdline.xtx رو میسازیم:
اگه واستون سؤال هست یا علاقهمندین که بدونین این خطوط از کجا اومده این لینک رو ببنید
کارت حافظه رو روی برد بذاریم و برد رو روشن کنیم.
توی فصل قبل هم ما یه اجرای لینوکس با رسپبری داشتیم منتهی با یوبوت و فایل کرنلی که من بهتون داده بودم.
اون فایل کرنل لینوکس ، مستقیم از سایت کرنل لینوکس گرفته شده بود و ساخته شده بود و فایل اضافه ای هم نداشت.
تفاوت اون کرنل لینوکس با این کرنل لینوکس و بوت لودر خود رسپبریپای توی این هست که اونجا از یوبوت به بعد روی سریال ما چیزی نداشتیم ولی اینجا همه اطلاعات رو به ما میده.
اون جا اگه LCD وصل میکردین اطلاعات رو داشتین روش ولی روی سریال نه.
بله این است تفاوت فایل های کانفیگ!
این جز معدود جاهایی هست که من دارم مفصل حرف میزنم و خودم مقایسه میکنم و نمیگم برید انجام بدین یا سرچ کنین.
و اما چرا؟
محتویات پورت سریال بعد از روشن کردن برد ایناست:
اگه دقت کنید مشخصه که کرنل لینوکس داره دنبال یه چیزی میگرده که نیست.
بله دنبال فایل سیستم روت میگرده.
کرنل پنیک Kernel Panic زمانی هست که کرنل لینوکس به خطایی میرسه که واسش غیرقابلبازیابی هست و نمیتونه کاریش کنه که اینجا پیدا نکردن فایل سیستم روت هست.
کرنل لینوکس توی هفت سطح پیغامهایی رو با استفاده از تابع printk به ما میده. (همونهایی که هنگام بوت شدن لینوکس روی اسکرین یا سریال میبنید، البته نه فقط همونا!)
توی پیکربندی کرنل یه متغیر هست به نام
که هر خطایی که مقدارش از اون پایینتر یا برابر باشه رو نشون میده. میتونید تنظیمات مربوطه رو ازاینجا ببینید و تغییر بدید:
توی فصل قبل گفتیم یکی از کارهای بوت لودر پاس دادن متغیرهای خط فرمان به کرنل لینوکس هست حالا این متغیرها که تا الان هم زیاد دیدینشون چیا هستن و به چه معنی هستن:
یه سری هم به نظرات این پایین بندازید، نظرات رو به خونید و اگر شما همنظری دارید، لطفاً با ما به اشتراک بگذارید!
امبدد لینوکس قسمت هجدهم: Kernel...
امبدد لینوکس قسمت بیستم: فایل...
طراحی، بهینه سازی و تولید محصولات الکترونیکی، درحوزه های تجاری،صنعتی و تجهیزات پزشکی، مجری سیستم های امبدد لینوکس *( مهندسی-بازرگانی آنی روت https://aniroot.com )
مقالات بیشتربسیار عالی. لذت بردم.
سلام پیمان جان
خوشحالیم که دنبال کننده مطالب هستید و به بچه ها انرژی می دهید
آقا بازم گل کاشتید که??
سلامت و شاد باشید همیشه
سپاسگزارم
سلام امیر جان
تشکر بسیار از حسن نظر شما
شاد باشید
نویسنده شو !
سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.