سلام . ببخشید که اینقدر سوال می کنم . میخواستم بدونم که سی پی یو از کجا می دونه که پروسه فعلی چه مجوز هایی (رینگ 0 ... 3) داره ؟؟
سلام . ببخشید که اینقدر سوال می کنم . میخواستم بدونم که سی پی یو از کجا می دونه که پروسه فعلی چه مجوز هایی (رینگ 0 ... 3) داره ؟؟
CPU چیزی رو نمیدونه در کل . چون یه ماشین هست .
سیستم عامل بر اساس معماری اش تشخیص میده که هر پروسه چه مجوزی داره و چه دسترسی هائی و بر اساس اون ، وضعیت پردازنده تغییر داده میشه . مثلا روی ویندوز در هدر فایلهای PE نوع Subsystem ای که باید اجرا بشه مشخص شده . Loader ویندوز اصلا فایلهائی که کد کرنل دارن رو اجرا نمیکنه و تکلیفش روشنه . روتینهائی که برای فراخوانی درایورها در نظر گرفته شدن هم طبیعتا در فضای یک پروسه درایور رو فراخوانی میکنند و در بدنه درایور کدهای با مجوز سطح0 میتونن اجرا بشن که بدیهی است قبل از اجرای کدهای کرنل CPU به رینگ صفر برده میشه ( استثناء هائی هم هست که چون کلیت بحث رو بیخود خراب میکنند لازم نبود ذکر بشن )
UNIX is simple. It just takes a genius to understand its simplicity
-- Dennis Ritchie
خوب با تشکر . قسمت اول فهمیده شد . حالا میریم سراغ اینکه برای تغییر حالت پردازنده چه چیزی رو باید تغییر داد ؟ ( کد نمی خوام . توضیح لطفا .) . و در نهایت اینکه پس میشه حتی مجوز های یک برنامه رینگ 3 رو به رینگ 0 تغییر داد ( خوب در این صورت که با نوشتن چند خط کد ساده این نظم رینگ ها به هم می خوره ؟؟) ؟؟؟؟
چیزی تغییر نمیکنه . باید به پردازنده دستور بدی در حالت Ring0 عمل کنه یا از این حالت بیرون بیاد . بسته به معماری ؛ مثلا روی اینتل از زوج دستورات SYSENTER/SYSEXIT استفاده میشه .برای تغییر حالت پردازنده چه چیزی رو باید تغییر داد ؟
مجوز چیه ؟در نهایت اینکه پس میشه حتی مجوز های یک برنامه رینگ 3 رو به رینگ 0 تغییر داد
دستور ماشین رو گذاشتن که صدا کنی و ازش استفاده کنی . بقیه اش بر عهده سیستم عامل است .با نوشتن چند خط کد ساده این نظم رینگ ها به هم می خوره ؟
UNIX is simple. It just takes a genius to understand its simplicity
-- Dennis Ritchie
یعنی اجازه اجرا نمی ده دیگه نه؟دستور ماشین رو گذاشتن که صدا کنی و ازش استفاده کنی . بقیه اش بر عهده سیستم عامل است
یک Mode خاصی ماکرواسمبلر داشت ؟ تو اون mode هم نمیشه ؟
منظورم اینه که میشه قبل از اجرای یک برنامه رینگ 3 پردازنده با درایور ما به رینگ 0 تنظیم بشه . پس در این صورت این برنامه به راحتی می تونه هر کاری بکنه ؟؟مجوز چیه ؟
در ضمن SYSENTER و SYSEXIT روی کدام نوع پردازنده ها جواب می ده ؟؟ (مال اینتل)
راهنمای اینتل رو ببین .در ضمن SYSENTER و SYSEXIT روی کدام نوع پردازنده ها جواب می ده ؟؟ (مال اینتل)
تئوری ؟ آره . ولی مدل دسترسی به حافظه و فراخوانی توابع و ...کاملا متفاوت هست بنابراین کد Ring 3 رو نباید وقتی پردازنده روی Ring 0 است اجرا کنی . البته اگر کدت جمع کردن محتوای دو تا رجیستر باشه اجرا میشه ، اما همینکه به حافظه دست بزنی یا بخواهی چیزی رو فراخوانی کنی متوقف میشی .میشه قبل از اجرای یک برنامه رینگ 3 پردازنده با درایور ما به رینگ 0 تنظیم بشه
هر کاری یعنی دقیقا چه کاری ؟در این صورت این برنامه به راحتی می تونه هر کاری بکنه ؟؟
من حس میکنم تصور میکنی که Ring 0 یک مکان رویائی است که اگر کدی آنجا اجرا بشه اجرا کننده رو به سمت الدورادو میبره ؟ Ring 0 کدها رو با دسترسی متفاوت برای اهداف متفاوت اجرا میکنه ، همین . مثلا اگر بخواهی مستقیما روی پورت مانیتور نقاشی کنی Ring 0 محل خوبی است اما باید باز هم از توابع فراهم شده توسط سیستم عامل استفاده کنی ، یعنی کدی که برای Ring 3 نوشته شده چون به توابع کرنل دسترسی نداره بی معنی است که منتظر باشه اگر دسترسی به Ring 0 فراهم شد کار خارق العاده ای انجام بده . اصولا در هر دو محیط مدل مدیریت حافظه متفاوت ، و توابع متفاوتی برای کار کردن وجود دارن . کسی که مدیر سیستم است یا مجوز فراخوانی درایور داره طبیعتا بسادگی کد کرنل اجرا میکنه . اگر کدی برای کرنل نوشته نشده باشه انتقال پردازنده به Ring 0 خدمت خاصی به اون کد نمیکنه .
UNIX is simple. It just takes a genius to understand its simplicity
-- Dennis Ritchie