حلقههای حفاظتی[۱] (به انگلیسی: protection rings) یا دامنههای حفاظتی سلسلهمراتبی[۲][۳] در علوم رایانه، سازوکارهایی برای حفاظت از داده و عملکرد از خطا (با افزایش عیبتابی) و رفتارهای بدخواهانه (با ایجاد امنیت رایانهای) است. این دیدگاه از نظر قطری، برخلاف امنیت مبتنی بر توانمندی است.
سیستمعاملهای رایانهای، مراحل مختلفی از دسترسی به منابع را فراهم میکنند. یک حلقه حفاظتی یکی از دو یا بیشتر مرحله یا لایه سلسلهمراتبی از مجوزدهی (حقویژه) در معماری یک سیستم رایانهای است. این موضوع معمولاً به صورت سختافزاری، توسط بعضی از معماریهای CPU اعمال میشود، این معماریها حالتهای CPU مختلفی را در لایه سختافزار یا بهصورت میکروکد تهیه میبینند. این حلقهها به صورت سلسلهمراتبی، یعنی از مجوزدارترین (مورد اعتمادترین، که معمولاً شماره صفر دارد) تا کم مجوزترین (کماعتمادترین، معمولاً با بالاترین شماره حلقه) مرتب میشوند. در بیشتر سیستمعاملها، «حلقه ۰» مرحلهٔ با بیشترین مجوز (حقویژه) است و به صورت مستقیم با سختافزار فیزیکی مثل CPU و حافظه سروکار دارد.
دروازههای خاصی بین حلقهها تهیه دیده شدهاست، که به حلقه بیرونی اجازه میدهد تا به منابع حلقه درونی به صورت از قبل تعریف شده دسترسی یابد، و این متضاد با اجازه دادن به هر استفاده دلخواه است. دسترسی دروازهای صحیح بین حلقهها میتواند امنیت را بهبود دهد، این کار، از طریق جلوگیری برنامههای یک حلقه یا مرحله مجوزدهی از سوءاستفاده از منابعی که برای برنامههای حلقه دیگر درنظرگرفته شدهاند، انجام میشود. برای مثال، جاسوسافزاری که به صورت یک برنامهکاربری در حلقه ۳ اجرا میشود، باید از روشنکردن دوربین وب، بدون اطلاعدادن به کاربر، منع شود، زیرا دسترسی به سختافزار باید یک تابع حلقه ۱ باشد، که این حلقه به افزارهران دستگاه اختصاص دادهشدهاست. برنامههایی مثل مرورگر وب که در حلقههای سطح بالاتر اجرا میشوند، باید دسترسی به شبکه را «درخواست» بدهند، که شبکه یک منبع است که به آن شماره حلقه پایینتری اختصاص دادهشدهاست.
حلقههای چندگانه حفاظت در میان مفاهیم انقلابی معرفی شده توسط سیستم عامل Multics بود، یک پیشگام بسیار امن از خانواده سیستم عاملهای یونیکس امروزی است. رایانه GE 645 دارای کنترل دسترسی سختافزاری بود، اما برای پشتیبانی کامل از حلقهها در سختافزار کافی نبود، به همین دلیل Multics آنها را با گیر انداختن درخواستهای انتقال حلقهها در نرمافزار کامل کرد.[۴] جانشین آن، Honeywell 6180، آنها را در سختافزار، با پشتیبانی از هشت حلقه اجرا کرد.[۵] با این حال، اکثر سیستمها از دو حلقه استفاده میکنند، حتی اگر سختافزارهایی که در آنها اجرا میشوند، حالتهای CPU بیشتری را از آن ارائه میدهند. به عنوان مثال، ویندوز ۷ و ویندوز سرور ۲۰۰۸ (و پیشینیان آنها) تنها از دو حلقه استفاده میکنند، حلقه ۰ مربوط به حالت هسته و حلقه ۳ به حالت کاربر[۶] زیرا نسخههای قبلی ویندوز در پردازندههایی که فقط دو سطح حفاظت را پشتیبانی میکردند اجرا میشد.[۷]
بسیاری از معماریهای مدرن CPU (از قبیل معماری معماری محبوب اینتل x86) شامل نوعی حفاظت از نوع حلقههای محافظتی هستند، گرچه سیستم عامل ویندوز NT، مانند یونیکس، بهطور کامل از این ویژگی استفاده نمیکند. OS / 2 تا حدودی از سه حلقه استفاده میکرد:[۸] حلقه ۰ برای کد کرنل و درایورها، حلقه ۲ برای کدهای با دسترسی (برنامههای کاربر با مجوزهای دسترسی I / O) و حلقه ۳ برای کد غیرمجاز (تقریباً تمام برنامهها). در DOS، تمام برنامهها (کرنل و درایورها و برنامههای سطح کاربر) در حلقه ۳ اجرا میشوند (با این حال، این منحصر به مواردی است که در آن درایورهای حالت محافظت شده یا افزونههای DOS استفاده میشود؛ به عنوان یک سیستم عامل که از آدرس دهی real mode استفاده میکرد، سیستم حفاظت نشدهای بود)، در حالی که ۳۸۶ مموری منیجرهایی مانند EMM386 در حلقه ۰ کار میکنند. علاوه بر این، EMM386 3.xx DR-DOS میتواند به صورت اختیاری برخی از ماژولها (مانند DPMS) را روی حلقه ۱ اجرا کند.
سیستم Multics اصلی دارای هشت حلقه بود، اما بسیاری از سیستمهای مدرن تعداد حلقههای کمتری دارند. سختافزار به کمک ثباتها از حلقه ای که یک رشته پردازش باید در ان اجرا شود آگاه است. در بعضی از سیستمها، قسمتهایی از حافظه مجازی به حلقههای مختلف اختصاص داده شدهاند. یک مثال Data General Eclipse MV / 8000 است که در آن سه بیت بالا رجیستر شمارنده برنامه (PC) به عنوان رجیستر حلقه استفاده میشود. به عنوان مثال، برنامه ای که رجیستر PC ان مقدار 0xE200000 را دارد، به صورت خودکار در حلقه ۷ قرار میگیرد و فراخوانی یک تابع در بخشهای مختلف حافظه بهطور خودکار باعث انتقال حلقه میشود.
سختافزار به شدت راههایی که موجب انتقال کنترل از حلقه ای به حلقه دیگر میشود را محدود میکند و همچنین محدودیتهایی را برای نوع دسترسی به حافظه ای که میتوانند در حلقهها انجام شوند، ایجاد میکند. به عنوان مثال، در x86، یک خاصیت وجود دارد [نیازمند شفافسازی] که توسط دستورالعمل call کنترل را به شیوه ای امن از حلقه ای به حلقه دیگر انتقال میدهد [نیازمند شفافسازی]؛ این عمل به عنوان یک سرپرست در بسیاری از سیستم عاملهای که از حلقههای حفاظت استفاده میکنند پیادهسازی شدهاست. محدودیتهای سختافزاری برای محافظت در مقابل رفتارهای خطرناک مفید طراحی شدهاند. علاوه بر این، حلقههای ممنوعه ممکن است دارای قابلیتهای خاصی باشند (مانند استفاده از آدرس دهی real mode که حافظه مجازی را دور میزند).
ARM معماری V7 دارای سه سطح امتیاز: برنامه، سیستم عامل، و Hypervisor. که برخلاف معمول، سطح 0 (PL0) حداقل سطح امتیاز، در حالی که سطح 2 (PL2) بالاترین سطح امتیاز است.[۹]
حلقههای محافظت در برخی از سیستمها میتواند با حالتهای پردازنده (master / kernel / privileged / supervisor mode vs. slave / unprivileged / user mode) ترکیب شوند. سیستم عاملها در حال اجرا بر روی سختافزاری که از هر دو حالت پشتیبانی میکنند میتوانند از هر دو نوع حفاظت یا تنها یک استفاده کنند.
استفاده مؤثر از معماری حلقهها نیاز به همکاری نزدیک بین سختافزار و سیستم عامل دارد. سیستم عاملهای طراحی شده برای کار بر روی چندین سختافزار ممکن است استفاده محدودی از حلقهها داشته باشند، اگر آنها در همه پلتفرم (سختافزارها) پشتیبانی نمیشوند. اغلب مدل امنیتی حلقهها به «هسته» و «کاربر» ساده شدهاست، حتی اگر سختافزار حلقههای بیشتری را پشتیبانی کند.
در زمینه کامپیوتر، حالت سرپرست یک flag سختافزاری است که میتواند توسط کدهایی که در سطح سیستم اجرا میشوند تغییر کند. برنامههای در حال اجرا در سطح سیستم از این flag استفاده میکنند، در حالی که برنامههای سطح کاربر (مرورگر وب) توانایی استفاده از این flag را ندارند. این پرچم تعیین میکند که آیا میتوان کدهای ماشینی که کارهایی مانند اصلاح ثباتها برای اصلاح descriptor tableها، یا انجام عملیات مانند قطع interruptها ممکن است یا خیر. ایده داشتن دو حالت مختلف برای اجرا برنامهها از جمله " کنترل بیشتر مسئولیت بیشتر میآورد " یک برنامه که درsupervisor mode اجرا میشود هرگز نباید اشتباه کند، زیرا یک اشتباه میتواند موجب سقوط کل سیستم شود.
حالت supervisor mode "یک حالت اجرای در برخی از پردازندهها است که امکان اجرای تمام دستورالعملها، از جمله دستورالعملهای با دسترسیها خاص را فراهم میکند. همچنین ممکن است اجازه دسترسی به یک address space متفاوت را بدهد. در این حالت معمولاً سیستم عاملها اجرا میشود. "[۱۰]
در یک کرنل یکپارچه، سیستم عامل در حالت سرپرست اجرا میشود و برنامهها در حالت کاربر اجرا میشوند. انواع دیگر از سیستم عاملها، مانند سیستم عاملهایی که از کرنل نوع exokernel یا میکروکرنل استفاده میکنند، لزوماً این رفتار را به اشتراک نمیگزارند.
اکثر پردازندهها حداقل دو حالت متفاوت دارند. پردازنده x86 دارای چهار حالت مختلف است. برنامههایی که در حلقه ۰ اجرا میشوند میتوانند با سیستم هر کاری انجام دهند و برنامه ای که در حلقه ۳ اجرا میشود باید بتواند در هر زمان بدون تأثیر بر بقیه سیستم کامپیوتر کرش کند. حلقه ۱ و حلقه ۲ به ندرت استفاده میشود، اما میتوانند با سطوح مختلف دسترسی پیکربندی شود.
در اکثر سیستم عاملها جابجایی میان user space و kernel space کار سنگینی است برا مثال برای در خواست getpid این فرایند چیزی حدود ۱۰۰۰–۱۵۰۰ کلاک سایکل زمان میبرد.
موریس ویلکس نوشت:[۱۱]
… در نهایت مشخص شد که حفاظت سلسله مراتبی که ارائه شده حلقهها را با شرایط برنامهنویسی سیستم مقایسه نمیکند و تنها در سیستم ساده ای که تنها دو حالت دارد بهبودی پیدا کرده یا بهبودی نداشتهاست. حلقههای حفاظتی خود را به اجرای سختافزاری سختافزاری سپردند، اما برای آنها چیزی کم نیاورده بود. [. . .] جذابیت محافظت از ریزهها حتی پس از اینکه متوجه شد که حلقههای محافظت جواب نمیدهد، باقی ماندهاست. . . این دوباره یک کوچه کوچه را ثابت کرد. . .
The reason Windows uses only two levels is that some hardware architectures that were supported in the past (such as Compaq Alpha and Silicon Graphics MIPS) implemented only two privilege levels.
مشارکتکنندگان ویکیپدیا. «Protection ring». در دانشنامهٔ ویکیپدیای انگلیسی، بازبینیشده در ۲ دی ۱۳۹۹.