مدتی بود می خواستم یکسری مطلب آموزشی در مورد معماری پردازنده 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
در این بخش توضیح کوتاهی در مورد اینکه این آموزش چه کاربردهایی برای افراد و گروه هایی که بالا اشاره کردم می تواند داشته باشد. مطالب و اصطلاحات این بخش ممکن برایتان نا آشنا باشد از آنجایی که هدف فقط مطرح کردن یکسری مثال و کاربرد است. با اینکه در آینده برای برخی از این موضوعات ممکن پستی جداگانه قرار بدهم.
برای یکسری پروژه های سیستمی داشتن دانش در این زمینه یک الزام است، این قبیل پروژه ها رنج گسترده ای دارند. ما اینجا به یکسری از این کاربردها اشاره می کنیم، برای مثال نوشتن درایور سطح کرنل برای اضافه کردن ویژگی های جدید به سیستم عامل با توجه به تکنولوژی های جدید سخت افزار مثل پردازنده، ، نوشته یک سیستم عامل جدید، توسعه نرم افزارهای سطح Hypervor مثل Xen, Vmware vSphere، توسعه یا بهبود کد در سطح Firmware مثل BIOS, (U)EFI و خیلی مثال های دیگر. از طرفی هر چه قدر یک برنامه نویس سیستمی اطلاعات دقیقتر و جامع تری در مورد سیستمی که روی آن برنامه می نویسد، کد بهتری خواهد نوشت و گاهی تصمیمات بهتری خواهد گرفت.
امنیت جزء موضوعاتی است که همیشه از اهمیت بالایی برخودار بوده است. کافیه به تاریخچه امکاناتی که پردازنده ها در جهت افزایش امنیت سیستم ها ارائه کرده اند نگاهی انداخت تا به اهمیت این موضوع پی برد. برای نمونه یکسری از امکاناتی که توسط پردازنده ها اراه شده پایین لیست کرده ام. برخی از این امکانات در سیستم عامل های فعلی پیاده سازی شده اند. و در صورت پشتیبانی نکردن سیستم عامل یا وجود نیازهای خاص با داشتن دانش در این زمینه می توان با نوشتن مثلا یک درایور این کمبود را جبران کرد. لازم به ذکر است که برخی از این قابلیت ها مربوط به مدیریت حافظه در این معماری ها می شود که در آموزش بعدی به آن ها می پردازیم (اطلاعات بیشتر در لینک هایی که بالاتر اشاره کردم موجود است).
User/Supervisor (U/S) BitRead/Write (R/W) BitNo Execure (NX) BitWrite Protect (WP) BitSupervisor-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. داشتن دانش در مورد معماری پردازند ها به چند طریق می تواند به نوشتن کدهای بهتر و بهینه تر کمک کند.
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) انجام می دهند. که به نظرم خیلی واضح است که یک فرد که قرار است مثلا یک حفره امنیتی در سیستم عامل را تحلیل کند، باید از نحوه عملکرد سیستم عامل و پردازنده اطلاع داشته باشد.
منتظر آموزش های بعدی باشید...
مثل همیشه اگر نظر یا پیشنهادی است حتما مطرح کنید.
برچسب: آموزش های معماری,راهنمای نقشه های معماری,
نویسنده: آریا مرادی