সিপিইউ রিংগুলি সবচেয়ে স্পষ্ট পার্থক্য
X86 সুরক্ষিত মোডে, সিপিইউ সর্বদা 4 টি রিংয়ের মধ্যে থাকে। লিনাক্স কার্নেলটি কেবল 0 এবং 3 ব্যবহার করে:
- কার্নেলের জন্য 0
- 3 ব্যবহারকারীদের জন্য
এটি কার্নেল বনাম ব্যবহারকারীল্যান্ডের সর্বাধিক শক্ত এবং দ্রুত সংজ্ঞা।
কেন লিনাক্স 1 এবং 2 রিং ব্যবহার করে না: https://stackoverflow.com/questions/6710040/cpu-privilege-rings-why-rings-1-and-2- পেরেন্ট- ইউজড
বর্তমান রিংটি কীভাবে নির্ধারিত হয়?
বর্তমান রিং এর সংমিশ্রণ দ্বারা নির্বাচিত হয়েছে:
গ্লোবাল বর্ণনাকারী টেবিল: জিডিটি এন্ট্রিগুলির একটি মেমরি টেবিল এবং প্রতিটি প্রবেশের একটি ক্ষেত্র রয়েছে Privl
যা রিংকে এনকোড করে।
LGDT নির্দেশিকা বর্তমান বর্ণনাকারী সারণিতে ঠিকানাটি সেট করে।
আরও দেখুন: http://wiki.osdev.org/ গ্লোবাল_ডেস্কিটার_আপনযোগ্য
বিভাগটি সিএস, ডিএস ইত্যাদি রেজিস্ট্রেশন করে, যা জিডিটিতে প্রবেশের সূচকে নির্দেশ করে।
উদাহরণস্বরূপ, CS = 0
জিডিটি-র প্রথম এন্ট্রি কার্যকরকারী কোডের জন্য বর্তমানে সক্রিয়।
প্রতিটি রিং কী করতে পারে?
সিপিইউ চিপটি শারীরিকভাবে তৈরি করা হয়েছে যাতে:
কীভাবে প্রোগ্রামগুলি এবং অপারেটিং সিস্টেমগুলি রিংগুলির মধ্যে রূপান্তর করে?
সিপিইউ চালু করা হলে এটি প্রাথমিক প্রোগ্রামটি রিং 0-তে চালানো শুরু করে (ভাল ধরণের, তবে এটি একটি ভাল অনুমান)। আপনি এই প্রাথমিক প্রোগ্রামটিকে কার্নেল হিসাবে ভাবতে পারেন (তবে এটি সাধারণত বুটলোডার হয় যা কার্নেলটিকে এখনও রিং 0-এ কল করে)।
যখন একটি userland প্রক্রিয়া কার্নেল একটি ফাইলে লেখা মত জন্য কিছু করতে চায়, এটা একটি নির্দেশ যে যেমন একটি ইন্টারাপ্ট জেনারেট করে ব্যবহার int 0x80
বাsyscall
কার্নেল সংকেত। x86-64 লিনাক্স সিস্কেল হ্যালো বিশ্বের উদাহরণ:
.data
hello_world:
.ascii "hello world\n"
hello_world_len = . - hello_world
.text
.global _start
_start:
/* write */
mov $1, %rax
mov $1, %rdi
mov $hello_world, %rsi
mov $hello_world_len, %rdx
syscall
/* exit */
mov $60, %rax
mov $0, %rdi
syscall
সংকলন এবং চালনা:
as -o hello_world.o hello_world.S
ld -o hello_world.out hello_world.o
./hello_world.out
গিটহাব উজানের দিকে ।
যখন এটি ঘটে, সিপিইউ একটি বাধা কলব্যাক হ্যান্ডলার কল করে যা কার্নেল বুটের সময় নিবন্ধিত হয়েছিল। এখানে একটি কংক্রিট খোলামেলা উদাহরণ যা কোনও হ্যান্ডলারের নিবন্ধন করে এবং এটি ব্যবহার করে ।
এই হ্যান্ডলারটি 0 রিংয়ে চলেছে, যা কার্নেলটি এই ক্রিয়াটিকে অনুমতি দেবে, ক্রিয়াটি করবে এবং ইউজারল্যান্ড প্রোগ্রামটি রিং 3-এ পুনরায় চালু করবে কিনা তা স্থির করে x x_
যখন exec
সিস্টেম কল ব্যবহৃত হয় (বা যখন কার্নেলটি শুরু হবে/init
), কার্নেলটি নতুন ইউজারল্যান্ড প্রক্রিয়াটির রেজিস্টার এবং মেমরি প্রস্তুত করে , তখন এটি প্রবেশের পয়েন্টে লাফিয়ে যায় এবং সিপিইউ 3 বাজায় পরিবর্তিত হয়
প্রোগ্রামটি যদি কোনও নিষিদ্ধ রেজিস্টার বা মেমরির ঠিকানায় (পেজিংয়ের কারণে) দুষ্টু কিছু করার চেষ্টা করে তবে সিপিইউ রিং 0-তে কিছু কার্নেল কলব্যাক হ্যান্ডলারকে কল করে।
তবে যেহেতু ইউজারল্যান্ড দুষ্টু ছিল, তাই কার্নেলটি এবার প্রক্রিয়াটি মেরে ফেলবে বা সিগন্যাল দিয়ে এটিকে একটি সতর্কতা দেবে।
যখন কার্নেল বুট হয়, এটি কিছু স্থির ফ্রিকোয়েন্সি সহ একটি হার্ডওয়্যার ঘড়ি সেটআপ করে, যা সময়ে সময়ে বিঘ্ন সৃষ্টি করে।
এই হার্ডওয়্যার ক্লকটি রিং 0 চালিত করে এমন বিঘ্ন সৃষ্টি করে এবং কোন ইউজারল্যান্ড জেগে উঠার প্রক্রিয়াটি নির্ধারণ করার অনুমতি দেয়।
প্রক্রিয়াগুলি কোনও সিস্টেম কল না করলেও এই সময়সূচিটি ঘটতে পারে।
একাধিক রিং থাকার মানে কী?
কার্নেল এবং ইউজারল্যান্ড পৃথক করার দুটি বড় সুবিধা রয়েছে:
- প্রোগ্রামগুলি তৈরি করা সহজ কারণ আপনি আরও নির্দিষ্ট একজনের সাথে অন্যের মধ্যে হস্তক্ষেপ করবে না। উদাহরণস্বরূপ, এক ব্যবহারকারীল্যান্ড প্রক্রিয়াটি পেজিংয়ের কারণে অন্য প্রোগ্রামের মেমরির ওভাররাইট করার বিষয়ে চিন্তা করতে হবে না, বা অন্য প্রক্রিয়াটির জন্য একটি অকার্যকর অবস্থায় হার্ডওয়্যার স্থাপনের বিষয়ে নয়।
- এটি আরও সুরক্ষিত। যেমন ফাইলের অনুমতি এবং মেমরি পৃথকীকরণ হ্যাকিং অ্যাপটিকে আপনার ব্যাঙ্কের ডেটা পড়তে বাধা দিতে পারে। এটি অবশ্যই ধরে নেওয়া যায় যে আপনি কার্নেলকে বিশ্বাস করেন।
এর সাথে কীভাবে খেলা হবে?
আমি একটি বেয়ার মেটাল সেটআপ তৈরি করেছি যা রিংগুলি সরাসরি পরিচালনা করার জন্য ভাল উপায় হওয়া উচিত: https://github.com/cirosantilli/x86-bare-metal- উদাহরণ
দুর্ভাগ্যক্রমে কোনও ইউজারল্যান্ডের উদাহরণ তৈরি করার ধৈর্য আমার ছিল না, তবে আমি পেজিং সেটআপ হিসাবে এগিয়ে গিয়েছি, তাই ইউজারল্যান্ডটি সম্ভব হবে। আমি একটি টান অনুরোধ দেখতে চাই।
বিকল্পভাবে, লিনাক্স কার্নেল মডিউলগুলি 0 রিংয়ে চলেছে, তাই আপনি সুবিধাপ্রাপ্ত অপারেশনগুলি চেষ্টা করে দেখতে পারেন, উদাহরণস্বরূপ কন্ট্রোল রেজিস্টারগুলি পড়ুন: https://stackoverflow.com/questions/7415515/how-to-access-the-control-register -cr0-CR2-Cr3-থেকে-এ-প্রোগ্রাম-পেয়ে-segmenta / 7419306 # 7419306
আপনার হোস্টকে হত্যা না করে এটি চেষ্টা করার জন্য এখানে একটি সুবিধাজনক কিউইউ + বিল্ড্রুট সেটআপ রয়েছে ।
কার্নেল মডিউলগুলির সর্বনিম্নতাটি হ'ল অন্যান্য কাঁথ্রেডগুলি চলছে এবং আপনার পরীক্ষায় হস্তক্ষেপ করতে পারে। তবে তত্ত্ব অনুসারে আপনি আপনার কার্নেল মডিউল সহ সমস্ত বাধাপ্রাপ্ত হ্যান্ডলারগুলি নিতে পারেন এবং সিস্টেমটির মালিক হতে পারেন, এটি আসলে একটি আকর্ষণীয় প্রকল্প হবে।
নেতিবাচক রিং
নেতিবাচক রিংগুলি আসলে ইন্টেল ম্যানুয়ালটিতে উল্লেখ করা হয়নি, তবে আসলে সিপিইউ মোড রয়েছে যা রিং 0 এর চেয়ে আরও বেশি ক্ষমতা সম্পন্ন এবং "নেগেটিভ রিং" নামের জন্য এটি বেশ উপযুক্ত।
একটি উদাহরণ হ'ল ভার্চুয়ালাইজেশনে ব্যবহৃত হাইপারভাইজার মোড।
আরও তথ্যের জন্য দেখুন: https://security.stackexchange.com/questions/129098/ কি-is- সুরক্ষার-আরআর-1
এআরএম
এআরএম-এ, রিংগুলিকে পরিবর্তে ব্যতিক্রমী স্তর বলা হয়, তবে মূল ধারণাটি একই থাকে।
এআরএমভি 8 এ 4 টি ব্যতিক্রম স্তর রয়েছে যা সাধারণত:
EL0: ইউজারল্যান্ড
EL1: কার্নেল (এআরএম পরিভাষায় "সুপারভাইজার")।
svc
ইন্সট্রাকশন (সুপারভাইজার কল) দিয়ে প্রবেশ করা হয়েছে , পূর্বে swi
ইউনিফাইড সমাবেশ হিসাবে পরিচিত , যা লিনাক্স সিস্টেম কল করার জন্য ব্যবহৃত নির্দেশ। হ্যালো ওয়ার্ল্ড এআরএমভি 8 উদাহরণ:
.text
.global _start
_start:
/* write */
mov x0, 1
ldr x1, =msg
ldr x2, =len
mov x8, 64
svc 0
/* exit */
mov x0, 0
mov x8, 93
svc 0
msg:
.ascii "hello syscall v8\n"
len = . - msg
গিটহাব উজানের দিকে ।
উবুন্টু 16.04 এ কিউইএমইউ দিয়ে এটি পরীক্ষা করে দেখুন:
sudo apt-get install qemu-user gcc-arm-linux-gnueabihf
arm-linux-gnueabihf-as -o hello.o hello.S
arm-linux-gnueabihf-ld -o hello hello.o
qemu-arm hello
এখানে একটি কংক্রিট খোলামেলা উদাহরণ যা একটি এসভিসি হ্যান্ডলারটিকে নিবন্ধিত করে এবং এসভিসি কল করে ।
EL2: হাইপারভাইজারস , উদাহরণস্বরূপ জেন ।
hvc
নির্দেশের মাধ্যমে প্রবেশ (হাইপারভাইজার কল)।
হাইপারভাইজার একটি ওএসের কাছে হয়, ইউএসল্যান্ডের মধ্যে একটি ওএস কী।
উদাহরণস্বরূপ, জেন আপনাকে একই সময়ে একই সিস্টেমে লিনাক্স বা উইন্ডোজের মতো একাধিক ওএস চালানোর অনুমতি দেয় এবং লিনাক্স যেমন ইউজারল্যান্ড প্রোগ্রামগুলির জন্য সুরক্ষা এবং ডিবাগ স্বাচ্ছন্দ্যের জন্য এটি একে অপরের থেকে পৃথক করে।
হাইপারভাইজারগুলি আজকের মেঘ অবকাঠামোর একটি মূল অঙ্গ: তারা হার্ডওয়্যার ব্যবহারকে সর্বদা 100% এর কাছাকাছি রেখে এবং প্রচুর অর্থ সাশ্রয় করে একাধিক সার্ভারকে একটি একক হার্ডওয়্যারের উপর চালানোর অনুমতি দেয়।
এডাব্লুএস উদাহরণস্বরূপ জেনকে 2017 পর্যন্ত ব্যবহার করা হয়েছিল যখন কেভিএম-তে এটি সরানো খবরটি তৈরি করে ।
EL3: আরও একটি স্তর। TODO উদাহরণ।
smc
নির্দেশের মাধ্যমে প্রবেশ করা (সিকিউর মোড কল)
ARMv8 আর্কিটেকচার রেফারেন্স মডেল DDI 0487C.a - অধ্যায় D1 - AArch64 সিস্টেম লেভেলে প্রোগ্রামার এর মডেল - চিত্র D1-1 সুন্দর এই প্রকাশ:
নোটার স্তরের প্রয়োজন ছাড়াই কীভাবে এআরএম, সম্ভবত হ্যান্ডসাইটের সুবিধার কারণে, এক্সভিটিভেশন স্তরের জন্য নামকরণের আরও ভাল কনভেনশন করেছে তা নোট করুন: 0 নিম্ন এবং 3 সর্বোচ্চ। নিম্ন স্তরের তুলনায় উচ্চতর স্তরগুলি প্রায়শই তৈরি হতে থাকে।
বর্তমান EL MRS
নির্দেশের সাথে অনুসন্ধান করা যেতে পারে : https://stackoverflow.com/questions/31787617/ কি-is-the-current-execution-mode-exception-level-etc
চিপ অঞ্চলটি সংরক্ষণ করার জন্য বৈশিষ্ট্যটির প্রয়োজন নেই এমন বাস্তবায়নগুলির জন্য মঞ্জুরি দেওয়ার জন্য এআরএম সমস্ত ব্যতিক্রম স্তর উপস্থিত থাকার প্রয়োজন হয় না। এআরএমভি 8 "ব্যতিক্রম স্তরগুলি" বলেছেন:
কোনও প্রয়োগে ব্যতিক্রমের সমস্ত স্তরের অন্তর্ভুক্ত নাও হতে পারে। সমস্ত বাস্তবায়নে অবশ্যই EL0 এবং EL1 অন্তর্ভুক্ত থাকতে হবে। EL2 এবং EL3 alচ্ছিক।
উদাহরণস্বরূপ কিউইএমইউ EL1 এর ডিফল্ট, তবে EL2 এবং EL3 কমান্ড লাইন বিকল্পের সাহায্যে সক্ষম করা যেতে পারে: https://stackoverflow.com
উবুন্টু 18.10 এ কোড স্নিপেট পরীক্ষা করা হয়েছে।