Embedded linux
یه چند وقته درگیر اینم که چجوری لینوکس خودم رو روی یه برد کاستوم شده پیاده کنم و بسازم.
برد کاستوم شده که خب ندارم ولی با orangepi zero3 کار رو یه مقدار جلو بردم و میخوام تجربم رو به اشتراک بذارم.
اول از همه باید ببینیم چه مواردی لازمه تا اینکه یه کرنل بوت شه که خب بسته به پردازنده مدلهای بوت مختلفی داریم ولی یه بخشیش مشترکه.
اگه سیستممون intel based باشه، معمولا اولین کدی که بعد از زدن دکمه پاور اجرا میشه، کد BIOS/UEFI هست که از یه چیپ BIOS/UEFI میاد. این کد با بهش کد ROM میگن، چندان read only نیست و قابل تغییره ولی اگه بریم توی محیط غیر اینتلی و مثلا یه میکروی آرم allwinner داشته باشیم، دیگه واقعا کد ROM توی یه حافظه read only تو خود سی پی یو قرار داره و اولین کدی که اجرا میشه اونه.
این کد توی سیستم امبددمون، تقریبا تنها کاری که میکنه اینه که از یه جایی(معمولا sd card یا eMMC) یه کدی رو برمیداره و میریزه توی SRAM که باز یه حافظست داخل خود چیپ SoC و اون رو اجرا میکنه.
اینجا نکتهای که وجود داره اینه که SRAM فضای خیلی محدودیه پس باید حجم این کد خیلی کم باشه.
شاید بپرسین چرا اصلا توی SRAM لود میشه و چرا مستقیم نمیریم توی DRAM مثل سیستمهای اینتلی؟
جواب اینه که چیپ کنترلر DRAM باید اول initialize بشه.
کاری که توی دسکتاپ های اینتلی، همون چیپ UEFI زحمتش رو قبل از لود کردن بوت لودر میکشه ولی اینجا این چیپ وجود خارجی نداره!
البته توی سیستم های امبدد هم چیزی شبیه به اینتل داریم ولی مرسوم نیست. درواقع در فضای امبدد استاندارد مشخصی برای این قضیه که چه ROM کدی اجرا بشه و چه کدی رو لود کنه نداریم.
بگذریم.
به هرحال اول ROM code و بعد کدی که ROM code توی SRAM لود میکنه اجرا میشه. حداقل کاری که این کد دومی انجام میده، اینه که DRAM رو initialize میکنه و بعد بوت لودر اصلیمون رو توش لود میکنه و اجرا میکنه.
البته این روش قدیمیتریه که الان دیگه جواب نمیده و درست نیست.
درستش اینه که کد دومی DRAM رو initialize میکنه و یه فرموری به اسم TF-A رو به همراه بوت لودرمون توی DRAM لود میکنه.
درواقع TF-A یک Trusted Firmware اپن سورس هست که آرم ما رو مجبور کرده داشته باشیمش. البته به جز TF-A مدلهای دیگه ای از Trusted Firmware ها هم وجود دارن ولی معروف ترینشون اینه.
این TF-A به عنوان سومین کدی که داره اجرا میشه، توی secure world آرم اجرا میشه. Secure world توی آرم، یه چیزی خیلی شبیه به real mode توی اینتل هست.
نهایتا TF-A، بوت لودرمون رو که قبلا توسط کد مرحله دوممون توی DRAM لود شده رو اجرا میکنه و به این ترتیب به بوت لودر واقعی میرسیم.
بوت لودر معروف برای سیستمهای امبدد، UBoot هست که توی پست بعد درموردش صحبت میکنم
#Linux
#EmbeddedLinux
یه چند وقته درگیر اینم که چجوری لینوکس خودم رو روی یه برد کاستوم شده پیاده کنم و بسازم.
برد کاستوم شده که خب ندارم ولی با orangepi zero3 کار رو یه مقدار جلو بردم و میخوام تجربم رو به اشتراک بذارم.
اول از همه باید ببینیم چه مواردی لازمه تا اینکه یه کرنل بوت شه که خب بسته به پردازنده مدلهای بوت مختلفی داریم ولی یه بخشیش مشترکه.
اگه سیستممون intel based باشه، معمولا اولین کدی که بعد از زدن دکمه پاور اجرا میشه، کد BIOS/UEFI هست که از یه چیپ BIOS/UEFI میاد. این کد با بهش کد ROM میگن، چندان read only نیست و قابل تغییره ولی اگه بریم توی محیط غیر اینتلی و مثلا یه میکروی آرم allwinner داشته باشیم، دیگه واقعا کد ROM توی یه حافظه read only تو خود سی پی یو قرار داره و اولین کدی که اجرا میشه اونه.
این کد توی سیستم امبددمون، تقریبا تنها کاری که میکنه اینه که از یه جایی(معمولا sd card یا eMMC) یه کدی رو برمیداره و میریزه توی SRAM که باز یه حافظست داخل خود چیپ SoC و اون رو اجرا میکنه.
اینجا نکتهای که وجود داره اینه که SRAM فضای خیلی محدودیه پس باید حجم این کد خیلی کم باشه.
شاید بپرسین چرا اصلا توی SRAM لود میشه و چرا مستقیم نمیریم توی DRAM مثل سیستمهای اینتلی؟
جواب اینه که چیپ کنترلر DRAM باید اول initialize بشه.
کاری که توی دسکتاپ های اینتلی، همون چیپ UEFI زحمتش رو قبل از لود کردن بوت لودر میکشه ولی اینجا این چیپ وجود خارجی نداره!
البته توی سیستم های امبدد هم چیزی شبیه به اینتل داریم ولی مرسوم نیست. درواقع در فضای امبدد استاندارد مشخصی برای این قضیه که چه ROM کدی اجرا بشه و چه کدی رو لود کنه نداریم.
بگذریم.
به هرحال اول ROM code و بعد کدی که ROM code توی SRAM لود میکنه اجرا میشه. حداقل کاری که این کد دومی انجام میده، اینه که DRAM رو initialize میکنه و بعد بوت لودر اصلیمون رو توش لود میکنه و اجرا میکنه.
البته این روش قدیمیتریه که الان دیگه جواب نمیده و درست نیست.
درستش اینه که کد دومی DRAM رو initialize میکنه و یه فرموری به اسم TF-A رو به همراه بوت لودرمون توی DRAM لود میکنه.
درواقع TF-A یک Trusted Firmware اپن سورس هست که آرم ما رو مجبور کرده داشته باشیمش. البته به جز TF-A مدلهای دیگه ای از Trusted Firmware ها هم وجود دارن ولی معروف ترینشون اینه.
این TF-A به عنوان سومین کدی که داره اجرا میشه، توی secure world آرم اجرا میشه. Secure world توی آرم، یه چیزی خیلی شبیه به real mode توی اینتل هست.
نهایتا TF-A، بوت لودرمون رو که قبلا توسط کد مرحله دوممون توی DRAM لود شده رو اجرا میکنه و به این ترتیب به بوت لودر واقعی میرسیم.
بوت لودر معروف برای سیستمهای امبدد، UBoot هست که توی پست بعد درموردش صحبت میکنم
#Linux
#EmbeddedLinux