tgindex

Stuff for Geeks

описание

Admin: @the_mhbr

240
подписчиков
Охват к подписчикам
56,7%
ERR
Реакции к просмотрам
0,34%
23 на 43 постов
Пересылки к просмотрам
2,16%
146
Постов в день
0,1
всего 43

Где отзываются чаще

доля реакций к просмотрам
  • 18 июл.نحوه تعریف آرگومان خط فرمان برای درایورهای لینوکسی اطلاعات بیش‌تر: https://devarea.com/linux-kernel-development-kernel-module-parameters/ #linux2,38%
  • 23 июл. 2024 г.без подписи2,12%
  • 7 авг.An analysis of Ext4 for digital forensics https://www.sciencedirect.com/science/article/pii/S17422876120003571,82%
  • 21 мая 2024 г.без подписи1,36%
  • 25 июн.pinctrl and gpio subsystems in kernel توی سخت‌افزار ما به کنترل کردن و کانفیگ کردن پایه‌های یه SoC نیاز داریم. مثلا اینکه یه پایه GPIO باشه یا مثلا DAC باشه. یا اگه GPIO هست خروجی باشه یا ورودی، pull up و pull downاش چجوری باشه و... برای تنظیم کردن این موارد، در کرنل بخشی داریم به اسم PINCTRL subsystem که وظیفه pin enumeration, pin configuration و pin muxing رو به عهده داره. اینجا منظور از pin configuration تنظیمات غیر pin muxing یه پین هست. مثلا pull up و pull down بودنش. احتمالا می‌دونید که SoCهای مختلف رجیسترهای مختلف و روش‌های مختلفی برای تنظیم GPIO ها و... دارن و به همین خاطر درایور pinctrl رو شرکت‌های سازنده SoC خودشون میدن. توی PINCTRL subsystem دوتا ابسترکشن مهم داریم: - pin controller - client device ابسترکشن اول عنصرهایی هست که میشه باهشون پین‌ها رو کانفیگ کرد. مثلا رجیسترهای مربوط به تنظیمات GPIO Muxing. ابسترکشن دوم عنصرهایی هستند که به تغییر کانفیگ پین‌ها نیاز دارند. مثلا یه UART قبل از اینکه استفاده بشه باید pin muxing براش تنظیم شده باشه و یه client device به حساب میاد. حالا ما برای اینکه یه پین رو مثلا برای یه SPI کنترل و کانفیگ کنیم، دوتا کار انجام می‌دیم. اول توی دیوایس‌تری برای نود SPI پین رو تعریف و کانفیگ می‌کنیم و دوم، توی درایور پین مربوطه رو کنترل می‌کنیم. مثلا توی دیوایس‌تری میگیم که spi1 از فلان پین با کانفیگ pull down برای سیگنال CSN استفاده می‌کنه(سیگنال CSN هم یه gpio سادست که صرفا صفر و یک میشه) و توی درایور این پین رو فعال می‌کنیم. اینکه یه پین GPIO صفر یا یک بشه یا مقدارش خونده بشه، توسط بخشی به اسم GPIO Subsystem صورت می‌گیره. درواقع توی هدر gpio/consumer.h دوتا تابع داریم: gpiod_set_value(); gpiod_get_value(); که این کارها رو برامون انجام میدن #EmbeddedLinux1,12%
  • 5 июл.یک مثال از Pinctrl توی پست قبل گفتیم که pinctrl چی هست تو این پست میخوایم یه تیکه device tree برد ارنچ پای zero3 رو ببینیم و یه باگی که توی SPIاش وجود داره رفع کنیم فرض کنید می‌خوایم یه پریفرالی رو به SPI ارنج پایمون وصل کنیم و شروع کنیم به تبادل داده. مثلا من می‌خواستم ماژول nRF24L01 رو بهش وصل کنم و دیتا ارسال کنم تراشه استفاده شده توی این برد(h618) اگه اشتباه نکنم 4 تا SPI داره ولی باتوجه به بردمون فقط دوتاش قابل استفاده هست. درواقع SPI0اش به یه حافظه Flash وصل شده و SPI1اش هم به یپن‌هدر روی برد سیم‌کشی شده و در دسترس ما هست. مشکلی که وجود داره اینه که ایمیج armbian موجود برای این برد، SPI1 رو کلا فعال نکرده بطور پیش‌فرض و حتی با دستور armbian-config و فعال کردن device tree overlayاش باز هم کار نمی‌کنه. با یه مقدار سرچ توی نت به این نتیجه می‌رسیم که pinctrl برای SPI1 توی دیوایس‌تری درست تعریف نمیشه. توی عکسای بالا دوتا SPIای که گفتیم رو نشون دادیم. دقت کنید که spi0 همون spi@5010000 و spi1 هم spi@5011000 میشه. توی دوتا از عکس‌های بالا مقادیر پیش‌فرض SPIها نشون داده شدن و توی عکس سوم هم overlayای که روی spi1 اعمال میشه و عملا spi1 رو جایگزین می‌کنه. آورده شده. همونطور که می‌بینید توی spi1 هیچ‌وقت pinctl تعریف نشده و مشکل دقیقا همینجاست. اما pinctrl توی spi0 دوتا عددن اینا چین؟ این دوتا عدد phandle یا ساده‌تر بگیم پوینتر هستن. کافیه دنبال آیدی 0x1f و 0x20 بگردیم تا به نودهای زیر برسیم: spi0-pins { pins = "PC0\0PC2\0PC4\0"; function = "spi0"; phandle=<0x1f>; }; spi0-cs-pin { pins = "PC3"; function = "spi0"; phandle = <0x20>; }; خب پس می‌بنیم که باید اولین عدد توی pinctrl-0 پوینتر به نود spi1-pins و دومین عدد هم پوینتر به نود spi1-cs1-pin باشه. حالا میتونیم به سادگی overlay یا حتی خود دیوایس‌تری اصلی رو patch کنیم و برد رو ریبوت کنیم. اینجوری spi1 راه میوفته! #EmbeddedLinux1,09%
  • 13 июл.راه‌اندازی RAM در سیستم‌های x86-64 وقتی پردازنده ریست میشه، رجیستر CS و IP طوری مقداردهی میشن که به یه آدرس مشخص روی SPI Flash اشاره کنن که حاوی UEFI/BIOS فریموره. پردازنده دستورات رو مستقیماً از همون Flash می‌خونه، بدون این‌که چیزی رو کپی کنه داخل رم به این روش Execute-In-Place میگن. دلیلش اینه که تو این استیج، DRAM هنوز پیکربندی نشده، و برخلاف خیلی از سیستم‌های embedded که یه بلوک SRAM داخلی دارن ، تو اکثر پلتفرم‌های x86 همچین چیزی در دسترس فریمور نیست. پس تا اینجا هیچ حافظه‌ی read/write نداریم، در نتیجه stack هم نداریم. و بدون stack، اجرای کد C عملاً غیرممکنه، چون هر فراخوانی تابع و هر متغیر محلی به یه جای read/write نیاز داره. راه‌حلی که این‌جا استفاده میشه اینه که به‌جای رم، به کش خود پردازنده تکیه کنیم. یعنی یه بازه از کش رو طوری پیکربندی کنیم که به‌جای این‌که فقط نسخه‌ی موقتی داده‌های رم باشه، خودش مستقل عمل کنه و بشه توش خوند و نوشت به این تکنیک هم Cache-as-RAM یا CAR میگن. راه‌اندازی خود CAR با چند دستور اسمبلی انجام میشه. اولین فاز UEFI، فاز SEC هست. تو همین فاز، کش وارد حالت CAR میشه تا یه stack موقت داشته باشیم. از این لحظه به بعد، فریمور یه محیط اجرایی کامل‌تر داره بعد از SEC، وارد فاز PEI میشیم. این فاز از یه سری ماژول به اسم PEIM تشکیل شده که به ترتیب وابستگی اجرا میشن. تو همین فاز DRAM راه‌اندازی میشه. تا وقتی PEIM حافظه کارش تموم نشده، هیچ ماژول دیگه‌ای حق نداره فرض کنه RAM واقعی در دسترسه. مادربرد از قبل نمی‌دونه کاربر چه ماژول رمی نصب کرده. داخل DIMM که شامل تراشه‌های DRAM هست، یه EEPROM کوچیک وجود داره که بهش SPD میگن. PEIM حافظه، تو همین مرحله محتوای این EEPROM رو معمولاً از طریق SMBus می‌خونه. داخل این EEPROM اطلاعاتی مثل نوع رم، ظرفیت، تعداد رنک، و تایمینگ‌های استاندارد ذخیره شده. حالا که فریمور فهمید دقیقاً چه رمی داره، نوبت میرسه به بخش پیکربندی رم. این بخش با توجه به اطلاعاتی که از SPD خونده، فرکانس، تایمینگ و ولتاژ درست رو روی کنترلر حافظه تنظیم می‌کنه، و بعدش یه سری کالیبراسیون و تست سیگنالی (memory training) انجام میشه تا مطمئن بشه رم به‌صورت پایدار کار می‌کنه. وقتی این مرحله موفق تموم شد، فریمور یه سرویس رو صدا می‌زنه که اساساً به بقیه‌ی سیستم اعلام می‌کنه از الان این بازه از DRAM واقعی قابل‌اعتماده. همراه این اعلام، هرچی که تا حالا روی CAR نگه داشته می‌شد منتقل میشه به DRAM واقعی. بعد از این انتقال، CAR دیگه لازم نیست و باید غیرفعال بشه. بعد از فاز PEI، کنترل میره به فاز بعدی UEFI به اسم DXE. برخلاف همه‌ی مراحل قبلی که یا از Flash یا از CAR اجرا می‌شدن، این فاز روی DRAM واقعی که آماده کردیم اجرا میشه. تو این فاز، درایورهای کامل‌تر سیستم مثل دیسک، شبکه و USB لود میشن، و در نهایت کنترل تحویل داده میشه به بوت‌لودر سیستم‌عامل. Abbreviation XIP — Execute-In-Place CAR — Cache-as-RAM SEC — Security Phase PEI — Pre-EFI Initialization PEIM — PEI Module DIMM — Dual Inline Memory Module SPD — Serial Presence Detect DXE — Driver Execution Environment0,88%
  • 13 июл.راه‌اندازی RAM در سیستم‌های x86-64 وقتی پردازنده ریست میشه، رجیستر CS و IP طوری مقداردهی میشن که به یه آدرس مشخص روی SPI Flash اشاره کنن که حاوی UEFI/BIOS فریموره. پردازنده دستورات رو مستقیماً از همون Flash می‌خونه، بدون این‌که چیزی رو کپی کنه داخل رم به…0,73%
  • 16 окт. 2025 г.без подписи0,65%
  • 2 июл. 2024 г.без подписи0,57%
  • 14 авг.без подписи0,00%
  • 7 авг.گاهی اوقات سریع‌تر اجرا کردن، یعنی لو دادن اطلاعات محرمانه رویکردهای مختلفی برای تسریع کار سی پی یو وجود داره. یکیش بالا بردن فرکانسه، ولی همیشه ایده‌ی خوبی نیست، چون هرچی فرکانس رو بیشتر کنیم به گرما و مصرف توان غیرقابل قبول میرسیم. یه رویکرد دیگه که خیلی…0,00%