راهنمای معماری های x86 و x86_64 برای برنامه نویسان سیستمی - قسمت صفر
مدتی بود می خواستم یکسری مطلب آموزشی در مورد معماری پردازنده x86 و x86_64 اینجا قرار بدهم. با این هدف که این مطالب مورد استفاده برای برنامه نویس های سیستمی، برنامه نویس های ماژول های امنیتی، افرادی که بهینه سازی کد انجام می دهند، تحلیل گران نقاط ضعف سیستم عامل ها و بدافزارها، و البته افراد علاقه مند به این موضوعات قرار بگیرد. این آموزش ها را احتمالا در چند سری ارائه خواهم کرد. در این قسمت هدف فقط دادن یک پیش زمینه است و وارد هیچ جزئیاتی نمی شویم. ولی در آموزش هایی که در آینده قرار می دهم به بررسی مباحث اولیه مثل رجیستر های سیستمی، مدهال عملکرد، سطوح دسترسی ، و در ادامه مدیریت حافظه، مدیریت وقفه ها و احتمالا موضوعات دیگر خواهیم پرداخت.
مقدمه
پردازنده های ساخته شده بر پایه این معماری ها اکثرا در انحصار شرکت های Intel, AMD (و VIA) می باشد. هر کدام از این شرکت ها نام گذاری متفاوتی برای معماری های ذکر شده دارند. مثلا شرکت Intel معماری ها مذکور را به ترتیب IA 32 و IA 64 و AMD این معماری ها را x86 و AMD64 می نامند.
این شرکت ها مستندات مربوط به معماری های ذکر شده را بر اساس سطح و اهدافی که پوشش می دهند تقسیم و بصورت pdf در اختیار عموم (که متاسفانه فعلا ایران شاملش نیست) گذاشته اند. برای مثال این تقسیم بندی قالبا به صورت:
- راهنما برای برنامه نویس ها
- راهنما برای برنامه نویس های سیستمی
- راهنما در مورد دستوراتی که پردازنده پشتیبانی می کند
- و ...
از مستندات مربوطه ما فقط "راهنما برای برنامه نویس های سیستمی" را در این آموزش مورد بررسی قرار داده ایم.
صفحه مربوط به مستندات ارائه شده توسط:
Intel
PDF Title:
Intel® 64 and IA-32 architectures software developer's manual combined
volumes 3A, 3B, 3C, and 3D: System programming guide
Download Page:
http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html
AMD
PDF Title:
AMD64 Architecture Programmer’s Manual Volume 2: System Programming
Download Page:
http://developer.amd.com/resources/developer-guides-manuals/
اگر تجربه ای در خواندن این قبیل مستندات داشته باشید، احتمالا می دانید که این قبیل راهنماها خیلی خشک و کسل کننده هستند . به همین جهت به نظرم آمد برای کاهش خشکی مطلب جاهایی که امکانش است نمونه سورس قرار بدهم. به همین منظور در این آموزش از سورس سیستم عامل FreeBSD استفاده شده است. دلیل این انتخاب یکی به خاطر متن باز بودن این سیستم عامل بود، و دوم برای من زمان کمتری صرف شد تا بخش هایی که داخل کد می خواستم پیدا کنم (اگر پیشنهاد بهتری است نظرتان را بدهید). سورس از آدرس زیر قابل مشاهده (یا دریافت) است.
https://github.com/freebsd/freebsd
کاربردها
در این بخش توضیح کوتاهی داده ام در مورد اینکه این آموزش چه کاربردهایی برای افراد و گروه هایی که بالا اشاره کردم می تواند داشته باشد. در آینده برای برخی از این موضوعات ممکن است پستی جداگانه قرار بدهم.
برنامه نویسی سیستمی
برای یکسری پروژه های سیستمی داشتن دانش در این زمینه یک الزام است، این قبیل پروژه ها رنج گسترده ای دارند. ما اینجا به یکسری از این کاربردها اشاره می کنیم، برای مثال نوشتن درایور سطح کرنل برای اضافه کردن ویژگی های جدید به سیستم عامل با توجه به تکنولوژی های جدید سخت افزار مثل پردازنده، ، نوشتن یک سیستم عامل جدید، توسعه نرم افزارهای سطح Hypervior مثل Xen, Vmware vSphere، توسعه یا بهبود کد در سطح Firmware مثل BIOS, (U)EFI و خیلی مثال های دیگر. از طرفی هر چه قدر یک برنامه نویس سیستمی اطلاعات دقیقتر و جامع تری در مورد سیستمی که روی آن برنامه می نویسد داشته باشد کد بهتری و گاهی تصمیمات بهتری خواهد گرفت.
برنامه نویسی ماژول های امنیتی
امنیت جزء موضوعاتی است که همیشه از اهمیت بالایی برخودار بوده است. کافیه به تاریخچه امکاناتی که پردازنده ها در جهت افزایش امنیت سیستم ها ارائه کرده اند نگاهی انداخت تا به اهمیت این موضوع پی برد. برای نمونه یکسری از امکاناتی که توسط پردازنده ها ارائه شده پایین لیست کرده ام. برخی از این امکانات در سیستم عامل های فعلی پیاده سازی شده اند. و در صورت پشتیبانی نکردن سیستم عامل یا وجود نیازهای خاص با داشتن دانش در این زمینه می توان با نوشتن مثلا یک درایور این کمبود را جبران کرد. لازم به ذکر است که برخی از این قابلیت ها مربوط به مدیریت حافظه در این معماری ها می شود که در آموزش های بعدی به آن ها می پردازیم (اطلاعات بیشتر در لینک هایی که بالاتر اشاره کردم موجود است).
User/Supervisor (U/S) Bit
Read/Write (R/W) Bit
No Execure (NX) Bit
Write Protect (WP) Bit
Supervisor-Mode Access Prevention (SMAP)
Supervisor-Mode Execution Prevention (SMEP)
Protection Keys (PKE)
Memory Protection Extensions (MPX)
Software Gaurd Extensions (SGX)
Intel Processor Trace (PT)
Control-flow Enforcement Technology (CET)
بهینه سازی کد
کاربرد دیگر در نوشتن کدهای بهینه است خصوصا با زبان های C/C++
و Assembly
. داشتن دانش در مورد معماری پردازند ها به چند طریق می تواند به نوشتن کدهای بهتر و بهینه تر کمک کند.
- شناخت معماری پردازنده: مثل Alignment مربوط به حافظه (اینکه آدرس بر ۴، ۱۶و ۳۲و ... بخش پذیر باشد)، Alignment مربوط به داده ها (در واقع ترتیب قرار گرفتن متغییرها بر اساس بخش پذیری آدرسشان)، تعداد واحد های اجرایی در یک پردازنده برای عملیات محاسباتی اعداد صحیح و اعشاری (واحد های اجرایی می توانند به صورت همزمان اجرا شوند)، اطلاع داشتن از latency و throughput مربوط به دستورات (بر اساس وابستگی دستوراتی که کنار هم قرار گرفته اند) و حافظه های کش مثل L1, L2, L3, L4, TLB
- شناخت امکاناتی که مستقیم به بهینگی مرتبط هستند: مانند Branch Prediction, Out-of-order execution, Pipeline, Hyper Threading
- امکاناتی برای تحلیل کد: موارد یک و دو یکسری امکانات معرفی کردم در کنار این امکانات مجموعه رجیستر هایی در پردازنده وجود دارد (برای مثال در پردازنده Intel این رجیستر ها با نام
PCM (Performance Counter Monitor)
وجود دارند) که در هنگام اجرای کد از وضعیت امکانات ذکر شده گزارش تهیه می کند. مثلا اگر بخواهیم بدانیم کد ما از حافظه کش های L1 و L2 درست استفاده میکند باید از این رجیستر ها استفاده کرد. در این زمینه ابزارهایی وجود دارند که کمک میکنند تا این قبیل اطلاعات را از سیستم دریافت کنیم. مانند perf، Intrusments و VTune
پردازنده های Intel و AMD هر دو مستندات جامعی در مورد بهینه سازی (Optimization) کد دارند. از لینک هایی که بالا قرار داده ام می توانید این مستندات را دانلود کنید. در کنار این مستندات این لینک را هم بد ببینید. پیشنهاد می کنم اگر علاقه دارید هر چی در این لینک هست دانلود کنید و بخوانید
تحلیل نقاط ضعف سیستم عامل و تحلیل بدافزارها
یک استفاده دیگر این قبیل موضوعات برای متخصصان امنیتی است (یا بهتر بگیم هکر ها). خصوصا افرادی که کار تحلیل نقاط ضعف نرم افزار، نوشتن اکسپلویت و تحلیل بدافزارها (Rootkit ها و Bootkit ها) در سطح سیستم عامل و سطوح پایین تر VMM (Virtual Machine Monitor)
, SMM (System Management Mode)
, AMT (Active Management Technology)
انجام می دهند. که به نظرم خیلی واضح است که یک فرد که قرار است مثلا یک حفره امنیتی در سیستم عامل را تحلیل کند، باید از نحوه عملکرد سیستم عامل و پردازنده اطلاع داشته باشد.
پایان
منتظر آموزش های بعدی باشید...
مثل همیشه اگر نظر یا پیشنهادی است حتما مطرح کنید.