কার্নেল স্পেস এবং ব্যবহারকারীর স্থানের মধ্যে পার্থক্য কী? কার্নেল স্পেস, কার্নেল থ্রেড, কার্নেল প্রসেস এবং কার্নেল স্ট্যাকের অর্থ কি একই জিনিস? এছাড়াও, কেন আমাদের এই পার্থক্য প্রয়োজন?
কার্নেল স্পেস এবং ব্যবহারকারীর স্থানের মধ্যে পার্থক্য কী? কার্নেল স্পেস, কার্নেল থ্রেড, কার্নেল প্রসেস এবং কার্নেল স্ট্যাকের অর্থ কি একই জিনিস? এছাড়াও, কেন আমাদের এই পার্থক্য প্রয়োজন?
উত্তর:
সত্যিই সরলীকৃত উত্তর যে কার্নেল কার্নেল স্থান রান, এবং স্বাভাবিক প্রোগ্রাম ব্যবহারকারী স্থান চালানো। ব্যবহারকারীর স্থানটি মূলত বালি-বক্সিংয়ের একটি রূপ - এটি ব্যবহারকারীর প্রোগ্রামগুলিকে সীমাবদ্ধ করে যাতে তারা অন্য প্রোগ্রামগুলির দ্বারা বা ওএস কার্নেলের মালিকানাধীন মেমরি (এবং অন্যান্য সংস্থানগুলি) নিয়ে গণ্ডগোল করতে না পারে। এই মেশিনটি ক্রাশ করার মতো খারাপ কাজ করার ক্ষমতা তাদের সীমাবদ্ধ করে (তবে সাধারণত সম্পূর্ণরূপে সম্পূর্ণভাবে মুছে ফেলা হয় না)।
কার্নেল অপারেটিং সিস্টেমের মূল। এটিতে সাধারণত সমস্ত মেমরি এবং মেশিন হার্ডওয়্যার (এবং মেশিনের সমস্ত কিছুর) সম্পূর্ণ অ্যাক্সেস থাকে। মেশিনটিকে যতটা সম্ভব স্থিতিশীল রাখতে, আপনি সাধারণত কার্নেল মোড / কার্নেল স্পেসে চালানোর জন্য কেবলমাত্র সবচেয়ে নির্ভরযোগ্য, ভাল-পরীক্ষিত কোডটি চান।
স্ট্যাকটি মেমোরির আরও একটি অংশ, তাই স্বাভাবিকভাবেই এটি বাকী মেমরির সাথে ডানদিকে আলাদা।
রেণ্ডম এক্সেস মেমোরি (র্যাম) কথাটি যথা দুটি স্বতন্ত্র অঞ্চলে বিভক্ত করা যায় -। কার্নেল স্থান এবং ব্যবহারকারী স্থান ( শারীর ঠিকানা RAM এর আসলে বিভক্ত করা হয় না শুধুমাত্র ভার্চুয়াল অ্যাড্রেস , সমস্ত এই দ্বারা বাস্তবায়িত MMU )
কার্নেল এটির মেমরির অংশে চালিত হয়। মেমরির এই অংশটি সাধারণ ব্যবহারকারীদের প্রক্রিয়া দ্বারা সরাসরি অ্যাক্সেস করা যায় না, যখন কার্নেল হিসাবে মেমরির সমস্ত অংশ অ্যাক্সেস করতে পারে। কার্নেল কিছু অংশ অ্যাক্সেস করতে, ব্যবহারকারী প্রসেস পূর্বনির্ধারিত সিস্টেম কল অর্থাৎ ব্যবহার করতে হবে open
, read
, write
ইত্যাদি এছাড়াও, C
মত লাইব্রেরি ফাংশন printf
কল সিস্টেম কল write
ঘুরে।
সিস্টেম কলগুলি ব্যবহারকারী প্রসেস এবং কার্নেল প্রক্রিয়াগুলির মধ্যে একটি ইন্টারফেস হিসাবে কাজ করে। অজান্তে কার্নেলের সাথে ব্যবহারকারীদের জগাখিচু করা বন্ধ করতে যাতে অ্যাক্সেসের অধিকারগুলি কার্নেল স্পেসে রাখা হয়।
সুতরাং, যখন কোনও সিস্টেম কল আসে, একটি সফ্টওয়্যার ইন্টারপেট কার্নেলের কাছে প্রেরণ করা হয়। সিপিইউ সাময়িকভাবে সম্পর্কিত বিঘ্নিত হ্যান্ডলার রুটিনের কাছে নিয়ন্ত্রণ হস্তান্তর করতে পারে। বাধা হ্যান্ডলারের রুটিন কাজ শেষ করার পরে বাধা দিয়ে পুনরায় শুরু হওয়া কার্নেল প্রক্রিয়াটি পুনরায় শুরু হয়।
কার্নেল স্পেস এবং ভার্চুয়াল স্পেস ভার্চুয়াল মেমরির ধারণাগুলি .... এর অর্থ এই নয় যে রাম (আপনার আসল মেমরি) কার্নেল এবং ব্যবহারকারীর স্পেসে বিভক্ত। প্রতিটি প্রক্রিয়া ভার্চুয়াল মেমরি দেওয়া হয় যা কার্নেল এবং ব্যবহারকারীর স্পেসে বিভক্ত।
সুতরাং "এলোমেলো অ্যাক্সেস মেমোরি (র্যাম) দুটি পৃথক অঞ্চলে ভাগ করা যেতে পারে - কার্নেল স্পেস এবং ব্যবহারকারীর স্থান"। ভূল.
"কার্নেল স্পেস বনাম ব্যবহারকারীর স্থান" জিনিস সম্পর্কিত
যখন একটি প্রক্রিয়া তৈরি হয় এবং এর ভার্চুয়াল মেমরিটি ব্যবহারকারী-স্থান এবং কার্নেল-স্পেসে বিভক্ত হয়, যেখানে ব্যবহারকারীর স্পেস অঞ্চলে ডেটা, কোড, স্ট্যাক, প্রক্রিয়াটির হিপ থাকে এবং কার্নেল-স্পেসে প্রক্রিয়াটির জন্য পৃষ্ঠা সারণীর মতো জিনিস থাকে কার্নেল ডেটা স্ট্রাকচার এবং কার্নেল কোড ইত্যাদির জন্য কার্নেল স্পেস কোড চালনার জন্য, নিয়ন্ত্রণটি কার্নেল মোডে স্থানান্তরিত হওয়া উচিত (সিস্টেম কলের জন্য 0x80 সফ্টওয়্যার বিঘ্নিত ব্যবহার করে) এবং কার্নেল স্ট্যাকটি বর্তমানে কার্নেল স্পেসে সঞ্চালিত সমস্ত প্রক্রিয়ার মধ্যে মূলত ভাগ করা আছে।
সিপিইউ রিংগুলি সবচেয়ে স্পষ্ট পার্থক্য
X86 সুরক্ষিত মোডে, সিপিইউ সর্বদা 4 টি রিংয়ের মধ্যে থাকে। লিনাক্স কার্নেলটি কেবল 0 এবং 3 ব্যবহার করে:
এটি কার্নেল বনাম ব্যবহারকারীল্যান্ডের সর্বাধিক শক্ত এবং দ্রুত সংজ্ঞা।
কেন লিনাক্স 1 এবং 2 রিং ব্যবহার করে না: সিপিইউ প্রিভিলেজ রিং: 1 এবং 2 এর রিংগুলি কেন ব্যবহার করা হয় না?
বর্তমান রিংটি কীভাবে নির্ধারিত হয়?
বর্তমান রিং এর সমন্বয়ে নির্বাচন করা হয়েছে:
গ্লোবাল বর্ণনাকারী টেবিল: জিডিটি এন্ট্রিগুলির একটি মেমরি টেবিল এবং প্রতিটি প্রবেশের একটি ক্ষেত্র রয়েছে Privl
যা রিংকে এনকোড করে।
LGDT নির্দেশিকা বর্তমান বর্ণনাকারী সারণিতে ঠিকানাটি সেট করে।
বিভাগটি সিএস, ডিএস ইত্যাদি রেজিস্ট্রেশন করে, যা জিডিটিতে প্রবেশের সূচকে নির্দেশ করে।
উদাহরণস্বরূপ, CS = 0
জিডিটি-র প্রথম এন্ট্রি কার্যকরকারী কোডের জন্য বর্তমানে সক্রিয়।
প্রতিটি রিং কী করতে পারে?
সিপিইউ চিপটি শারীরিকভাবে তৈরি করা হয়েছে যাতে:
রিং 0 কিছু করতে পারে
3 রিং বেশ কয়েকটি নির্দেশনা চালাতে এবং কয়েকটি নিবন্ধগুলিতে লিখতে পারে না, উল্লেখযোগ্য:
নিজের আংটি বদলাতে পারে না! অন্যথায়, এটি নিজেকে 0 বেজে উঠতে পারে এবং রিংগুলি অকেজো হবে।
অন্য কথায়, বর্তমান বিভাগটি বর্ণনাকারী সংশোধন করতে পারে না , যা বর্তমান রিংটি নির্ধারণ করে।
পৃষ্ঠার সারণিগুলি সংশোধন করতে পারে না: x86 পেজিং কীভাবে কাজ করে?
অন্য কথায়, সিআর 3 রেজিস্টারটি সংশোধন করতে পারে না এবং নিজেই পেজিং পৃষ্ঠার সারণিগুলির সংশোধন প্রতিরোধ করে।
সুরক্ষা / প্রোগ্রামিং কারণে স্বাচ্ছন্দ্যের জন্য এটি অন্য প্রক্রিয়াগুলির স্মৃতি দেখতে এক প্রক্রিয়াটিকে বাধা দেয়।
বাধা হ্যান্ডলারদের নিবন্ধন করতে পারবেন না। এগুলি মেমোরি অবস্থানগুলিতে লিখে কনফিগার করা হয়, যা পেজিংয়ের মাধ্যমেও প্রতিরোধ করা হয়।
হ্যান্ডলারগুলি 0 রিংয়ে চলে এবং সুরক্ষা মডেলটি ভেঙে দেয়।
অন্য কথায়, LGDT এবং LIDT নির্দেশাবলী ব্যবহার করতে পারবেন না।
আইও নির্দেশাবলী পছন্দ করতে পারে না in
এবং এর মতো এবং out
ইচ্ছামত হার্ডওয়্যার অ্যাক্সেস থাকতে পারে।
অন্যথায়, উদাহরণস্বরূপ, কোনও প্রোগ্রাম সরাসরি ডিস্ক থেকে পড়তে পারলে ফাইল অনুমতিগুলি অকেজো হবে।
মাইকেল পেচকে আরও স্পষ্টভাবে ধন্যবাদ : ওএসের পক্ষে 3 টি রিংয়ের আইও নির্দেশনা মঞ্জুরি দেওয়া সম্ভব, এটি আসলে টাস্ক রাষ্ট্র বিভাগ দ্বারা নিয়ন্ত্রণ করা হয় ।
3 টি রিংয়ের পক্ষে যা সম্ভব নয় তা যদি এটির প্রথম স্থানে না থাকে তবে তা করার অনুমতি দেয়।
লিনাক্স সর্বদা এটি অস্বীকার করে। আরও দেখুন: কেন লিনাক্স টিএসএসের মাধ্যমে হার্ডওয়্যার প্রসঙ্গটি স্যুইচ ব্যবহার করে না?
কীভাবে প্রোগ্রামগুলি এবং অপারেটিং সিস্টেমগুলি রিংগুলির মধ্যে রূপান্তর করে?
যখন সিপিইউ চালু হয়, তখন এটি 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-এ পুনরায় চালু করবে কিনা তা স্থির করে দেয়। x86_64
যখন exec
সিস্টেম কল ব্যবহৃত হয় (বা যখন কার্নেলটি শুরু হবে/init
), কার্নেলটি নতুন ইউজারল্যান্ড প্রক্রিয়াটির রেজিস্টার এবং মেমরি প্রস্তুত করে , তখন এটি প্রবেশের পয়েন্টে লাফিয়ে যায় এবং সিপিইউ 3 বাজায় sw
প্রোগ্রামটি যদি কোনও নিষিদ্ধ রেজিস্টার বা মেমরির ঠিকানায় (পেজিংয়ের কারণে) দুষ্টু কিছু করার চেষ্টা করে তবে সিপিইউ রিং 0-তে কিছু কার্নেল কলব্যাক হ্যান্ডলারকে কল করে।
তবে যেহেতু ইউজারল্যান্ড দুষ্টু ছিল, তাই কার্নেলটি এবার প্রক্রিয়াটি মেরে ফেলবে বা সিগন্যাল দিয়ে এটিকে একটি সতর্কতা দেবে।
যখন কার্নেল বুট হয়, এটি কিছু স্থির ফ্রিকোয়েন্সি সহ একটি হার্ডওয়্যার ঘড়ি সেটআপ করে, যা সময়ে সময়ে বিঘ্ন সৃষ্টি করে।
এই হার্ডওয়্যার ক্লকটি রিং 0 চালিত করে এমন বিঘ্ন সৃষ্টি করে এবং কোন ইউজারল্যান্ড জাগবে তা নির্ধারণ করার অনুমতি দেয়।
প্রক্রিয়াগুলি কোনও সিস্টেম কল না করলেও এই সময়সূচিটি ঘটতে পারে।
একাধিক রিং থাকার মানে কী?
কার্নেল এবং ইউজারল্যান্ড পৃথক করার দুটি বড় সুবিধা রয়েছে:
এর সাথে কীভাবে খেলা হবে?
আমি একটি বেয়ার মেটাল সেটআপ তৈরি করেছি যা রিংগুলি সরাসরি পরিচালনা করার জন্য ভাল উপায় হওয়া উচিত: https://github.com/cirosantilli/x86-bare-metal- উদাহরণ
দুর্ভাগ্যক্রমে কোনও ইউজারল্যান্ডের উদাহরণ তৈরি করার ধৈর্য আমার ছিল না, তবে আমি পেজিং সেটআপ হিসাবে এগিয়ে গিয়েছি, তাই ইউজারল্যান্ডটি সম্ভব হবে। আমি একটি টান অনুরোধ দেখতে চাই।
বিকল্পভাবে, লিনাক্স কার্নেল মডিউলগুলি 0 রিংয়ে চলে, সুতরাং আপনি সেগুলি সুবিধাপ্রাপ্ত ক্রিয়াকলাপ চেষ্টা করে দেখতে পারেন, উদাহরণস্বরূপ নিয়ন্ত্রণ রেজিস্টারগুলি পড়ুন: কিভাবে প্রোগ্রাম থেকে নিয়ন্ত্রণ রেজিস্টার cr0, cr2, cr3 অ্যাক্সেস করবেন? বিভাগকরণের ত্রুটি পাওয়া
আপনার হোস্টকে হত্যা না করে এটি চেষ্টা করার জন্য এখানে একটি সুবিধাজনক কিউইউ + বিল্ড্রুট সেটআপ রয়েছে ।
কার্নেল মডিউলগুলির সর্বনিম্নতাটি হ'ল অন্যান্য কাঁথ্রেডগুলি চলছে এবং আপনার পরীক্ষায় হস্তক্ষেপ করতে পারে। তবে তত্ত্ব অনুসারে আপনি আপনার কার্নেল মডিউল সহ সমস্ত বাধাপ্রাপ্ত হ্যান্ডলারগুলি নিতে এবং সিস্টেমটির মালিক হতে পারেন, এটি আসলে একটি আকর্ষণীয় প্রকল্প হবে be
নেতিবাচক রিং
নেতিবাচক রিংগুলি আসলে ইন্টেল ম্যানুয়ালটিতে রেফারেন্স করা হয় নি, আসলে সিপিইউ মোডগুলি রয়েছে যার রিং 0 এর চেয়ে আরও ক্ষমতা রয়েছে এবং "নেতিবাচক রিং" নামের জন্য এটি বেশ উপযুক্ত।
একটি উদাহরণ হ'ল ভার্চুয়ালাইজেশনে ব্যবহৃত হাইপারভাইজার মোড।
আরও তথ্যের জন্য দেখুন:
এআরএম
এআরএম-এ, রিংগুলি পরিবর্তে ব্যাতিক্রমের স্তর বলা হয়, তবে মূল ধারণাগুলি একই থাকে।
এআরএমভি 8-তে 4 টি ব্যতিক্রম স্তর রয়েছে যা সাধারণত:
EL0: ইউজারল্যান্ড
EL1: কার্নেল (এআরএম পরিভাষায় "সুপারভাইজার")।
svc
ইন্সট্রাকশন (সুপারভাইজার কল) দিয়ে প্রবেশ করা হয়েছে , পূর্বে swi
ইউনিফাইড সমাবেশ হিসাবে পরিচিত , এটি লিনাক্স সিস্টেম কল করার জন্য ব্যবহৃত নির্দেশ is হ্যালো ওয়ার্ল্ড এআরএমভি 8 উদাহরণ:
hello.s
.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 এই beautifully ব্যাখ্যা করে:
এআরএম পরিস্থিতি এআরএমভি 8.1 ভার্চুয়ালাইজেশন হোস্ট এক্সটেনশানস (ভিএইচই) এর আবির্ভাবের সাথে কিছুটা পরিবর্তন হয়েছিল । এই এক্সটেনশনটি কার্নেলটিকে EL2 এ দক্ষতার সাথে চালানোর অনুমতি দেয়:
ভিএইচই তৈরি করা হয়েছিল কারণ ইন-লিনাক্স-কার্নেল ভার্চুয়ালাইজেশন সমাধান যেমন কেভিএম জেনের উপরে ভিত্তি অর্জন করেছে (উদাহরণস্বরূপ এডাব্লুএস'র উপরে উল্লিখিত কেভিএম-তে স্থানান্তর দেখুন), কারণ বেশিরভাগ ক্লায়েন্টকে কেবল লিনাক্স ভিএম প্রয়োজন হয়, এবং আপনি যেমন কল্পনা করতে পারেন, সমস্তই এককভাবে রয়েছে প্রকল্প, কেভিএম জেনের চেয়ে সহজ এবং সম্ভাব্যতর দক্ষ। সুতরাং এখন হোস্ট লিনাক্স কার্নেল সেই ক্ষেত্রে হাইপারভাইজার হিসাবে কাজ করে।
নোটার স্তরের প্রয়োজন ছাড়াই কীভাবে এআরএম, পূর্ববর্তী দৃষ্টির সুবিধার কারণে, x86 এর চেয়ে সুবিধাগুলি স্তরের জন্য আরও ভাল নামকরণের সম্মেলন রয়েছে তা নোট করুন: 0 নিম্ন এবং 3 সর্বোচ্চ highest নিম্ন স্তরের তুলনায় উচ্চতর স্তরগুলি প্রায়শই তৈরি হতে থাকে।
বর্তমান EL MRS
নির্দেশাবলী জিজ্ঞাসা করা যেতে পারে : বর্তমান এক্সিকিউশন মোড / ব্যতিক্রম স্তর কি, ইত্যাদি?
চিপ অঞ্চলটি সংরক্ষণ করার জন্য বৈশিষ্ট্যের প্রয়োজন নেই এমন বাস্তবায়নগুলির জন্য মঞ্জুরি দেওয়ার জন্য এআরএম সমস্ত ব্যতিক্রম স্তর উপস্থিত থাকার প্রয়োজন হয় না। এআরএমভি 8 "ব্যতিক্রম স্তরগুলি" বলেছেন:
কোনও প্রয়োগে ব্যতিক্রমের সমস্ত স্তরের অন্তর্ভুক্ত নাও হতে পারে। সমস্ত বাস্তবায়নে অবশ্যই EL0 এবং EL1 অন্তর্ভুক্ত থাকতে হবে। EL2 এবং EL3 alচ্ছিক।
উদাহরণস্বরূপ কিউইএমইউ EL1 এর ডিফল্ট, তবে EL2 এবং EL3 কমান্ড লাইন বিকল্পের সাহায্যে সক্ষম হতে পারে: a53 পাওয়ার আপ অনুকরণ করার সময় qemu-system-aarch64 এলএতে প্রবেশ করে
উবুন্টু 18.10 এ কোড স্নিপেট পরীক্ষা করা হয়েছে।
কার্নেল স্পেস এবং ব্যবহারকারীর স্থান হ'ল সুবিধাযুক্ত অপারেটিং সিস্টেম ফাংশন এবং সীমাবদ্ধ ব্যবহারকারীর অ্যাপ্লিকেশনগুলির পৃথকীকরণ। ব্যবহারকারী অ্যাপ্লিকেশনগুলিকে আপনার কম্পিউটারটি ছড়িয়ে দেওয়া থেকে বিরত রাখতে এই বিচ্ছেদটি প্রয়োজনীয়। এটি কোনও খারাপ বিষয় হবে যদি কোনও পুরানো ব্যবহারকারী প্রোগ্রাম আপনার হার্ড ড্রাইভে র্যান্ডম ডেটা লেখা শুরু করতে পারে বা অন্য ব্যবহারকারীর প্রোগ্রামের মেমরি স্পেস থেকে মেমরি পড়তে পারে।
ব্যবহারকারীর স্পেস প্রোগ্রামগুলি সিস্টেমের সংস্থানগুলিতে সরাসরি অ্যাক্সেস করতে পারে না তাই অপারেটিং সিস্টেম কার্নেল দ্বারা প্রোগ্রামের পক্ষ থেকে অ্যাক্সেস পরিচালনা করা হয়। ব্যবহারকারী স্পেস প্রোগ্রামগুলি সাধারণত সিস্টেম কলগুলির মাধ্যমে অপারেটিং সিস্টেমের জন্য অনুরোধ করে।
কার্নেল থ্রেড, প্রক্রিয়া, স্ট্যাকের অর্থ একই জিনিস নয়। এগুলি কার্নেল স্পেসের জন্য ব্যবহারকারীর স্থানের সমতুল্য হিসাবে অনুরূপ কাঠামো।
প্রতিটি প্রক্রিয়াটির নিজস্ব 4 গিগাবাইট ভার্চুয়াল মেমরি রয়েছে যা পৃষ্ঠার টেবিলগুলির মাধ্যমে শারীরিক স্মৃতিতে মানচিত্র করে। ভার্চুয়াল মেমরিটি বেশিরভাগ ক্ষেত্রে দুটি ভাগে বিভক্ত হয়: প্রক্রিয়াটি ব্যবহারের জন্য 3 জিবি এবং কার্নেল ব্যবহারের জন্য 1 জিবি। বেশিরভাগ ভেরিয়েবল আপনি ঠিকানার জায়গার প্রথম অংশে মিথ্যা তৈরি করেন। সেই অংশটিকে ইউজার স্পেস বলা হয়। শেষ অংশটি যেখানে কার্নেলটি বাস করে এবং সমস্ত প্রক্রিয়াগুলির জন্য সাধারণ। এটিকে কার্নেল স্পেস বলা হয় এবং এই স্পেসের বেশিরভাগ অংশ শারীরিক মেমরির শুরুতে ম্যাপ করা হয় যেখানে বুট করার সময় কার্নেল চিত্রটি লোড করা হয়।
ঠিকানা জায়গার সর্বাধিক আকার সিপিইউতে ঠিকানা নিবন্ধকের দৈর্ঘ্যের উপর নির্ভর করে।
32-বিট ঠিকানা নিবন্ধকারী সিস্টেমগুলিতে, ঠিকানা জায়গার সর্বাধিক আকার 2 32 বাইট বা 4 জিবিবি হয়। একইভাবে, -৪-বিট সিস্টেমে 2 64৪ বাইট সম্বোধন করা যেতে পারে।
এই জাতীয় ঠিকানা স্থানটিকে ভার্চুয়াল মেমরি বা ভার্চুয়াল অ্যাড্রেস স্পেস বলে । এটি আসলে শারীরিক র্যাম আকারের সাথে সম্পর্কিত নয়।
লিনাক্স প্ল্যাটফর্মগুলিতে, ভার্চুয়াল ঠিকানা স্থানটি কার্নেল স্থান এবং ব্যবহারকারীর স্পেসে বিভক্ত।
একটি আর্কিটেকচার-নির্দিষ্ট ধ্রুবককে বলা হয় টাস্ক সাইজের সীমা , বা TASK_SIZE
, যেখানে বিভাজন ঘটে সেখানে চিহ্নিত করে:
ঠিকানার পরিধি 0 থেকে TASK_SIZE
-1 পর্যন্ত ব্যবহারকারীর স্পেসে বরাদ্দ করা হয়;
232 -1 (বা 2-64 -1) TASK_SIZE
অবধি অবশিষ্ট কার্নেল স্পেসে বরাদ্দ করা হয়।
উদাহরণস্বরূপ একটি নির্দিষ্ট 32-বিট সিস্টেমে ব্যবহারকারীর স্পেসের জন্য 3 GiB এবং কার্নেল স্পেসের জন্য 1 GiB দখল করা যেতে পারে।
ইউনিক্সের মতো অপারেটিং সিস্টেমের প্রতিটি অ্যাপ্লিকেশন / প্রোগ্রাম একটি প্রক্রিয়া; তাদের প্রত্যেকের প্রসেস আইডেন্টিফায়ার (বা কেবল প্রসেস আইডি , পিআইডি) নামে একটি অনন্য সনাক্তকারী রয়েছে । লিনাক্স একটি প্রক্রিয়া তৈরির জন্য দুটি প্রক্রিয়া সরবরাহ করে: 1. fork()
সিস্টেম কল, বা 2. exec()
কল।
একটি কার্নেল থ্রেড একটি লাইটওয়েট প্রক্রিয়া এবং এটিও কার্যকর হয় একটি প্রোগ্রাম। একটি একক প্রক্রিয়াতে একই ডেটা এবং সংস্থানগুলি ভাগ করে নেওয়ার ক্ষেত্রে বেশ কয়েকটি থ্রেড থাকতে পারে তবে প্রোগ্রাম কোডের মাধ্যমে বিভিন্ন পথ অবলম্বন করা যায়। লিনাক্স clone()
থ্রেড উত্পন্ন করার জন্য একটি সিস্টেম কল সরবরাহ করে।
কার্নেল থ্রেডের ব্যবহারগুলির উদাহরণ হ'ল: র্যামের ডেটা সিঙ্ক্রোনাইজেশন, সিডিইউগুলির মধ্যে প্রক্রিয়াগুলি বিতরণে শিডিয়ুলারকে সহায়তা করা ইত্যাদি etc.
সংক্ষেপে: কার্নেল কার্নেল স্পেসে চালিত হয়, কার্নেলের স্পেসে সমস্ত মেমরি এবং রিসোর্সের সম্পূর্ণ অ্যাক্সেস রয়েছে, আপনি বলতে পারেন মেমরিটিকে দুটি ভাগে ভাগ করা হয়েছে, কার্নেলের জন্য অংশ এবং ব্যবহারকারীর নিজস্ব প্রক্রিয়ার জন্য অংশ, (ব্যবহারকারীর স্থান) সাধারণ প্রোগ্রাম চালায়, ব্যবহারকারী স্পেস সরাসরি কার্নেল স্পেসে অ্যাক্সেস করতে পারে না তাই এটি কার্নেল থেকে রিসোর্সগুলি ব্যবহার করার অনুরোধ করে। সিস্কেল দ্বারা (গ্লিবিতে পূর্বনির্ধারিত সিস্টেম কল)
এখানে একটি বিবৃতি রয়েছে যা বিভিন্ন " ব্যবহারকারী স্থান কর্নেলের জন্য কেবলমাত্র একটি পরীক্ষার বোঝা " ...
খুব পরিষ্কার হতে হবে: প্রসেসরের আর্কিটেকচার সিপিইউকে দুটি মোড, কার্নেল মোড এবং ইউজার মোডে চালিত করার অনুমতি দেয় , হার্ডওয়্যার নির্দেশিকাটি একটি মোড থেকে অন্য মোডে স্যুইচ করার অনুমতি দেয়।
মেমরিটি ব্যবহারকারীর স্থান বা কার্নেল স্পেসের অংশ হিসাবে চিহ্নিত করা যেতে পারে।
সিপিইউ যখন ইউজার মোডে চলমান থাকে, সিপিইউ কেবল ব্যবহারকারীর স্পেসে থাকা মেমোরিটি অ্যাক্সেস করতে পারে, যখন সিপিইউ কার্নেল স্পেসে মেমরি অ্যাক্সেস করার চেষ্টা করে তখন ফলাফলটি "হার্ডওয়্যার ব্যতিক্রম" হয়, যখন সিপিইউ কার্নেল মোডে চলতে থাকে, সিপিইউ সরাসরি অ্যাক্সেস করতে পারে কার্নেল স্থান এবং ব্যবহারকারীর স্থান উভয় ...
কার্নেল স্পেস মানে মেমরি স্পেস কেবল কার্নেল দ্বারা স্পর্শ করা যায়। 32 বিট লিনাক্সে এটি 1 জি (0xC0000000 থেকে 0xffffffff ভার্চুয়াল মেমরি ঠিকানা হিসাবে)। কার্নেল দ্বারা নির্মিত প্রতিটি প্রক্রিয়াও একটি কার্নেল থ্রেড, সুতরাং একটি প্রক্রিয়ার জন্য দুটি স্ট্যাক থাকে: একটি প্রক্রিয়াটির জন্য ব্যবহারকারীর স্পেসে এবং অন্যটি কার্নেলের মধ্যে কার্নেল থ্রেডের জন্য স্থান।
কার্নেল স্ট্যাক 2 পৃষ্ঠাগুলি দখল করেছে (32 বিট লিনাক্সের 8k), একটি টাস্ক_স্ট্রিক্ট (প্রায় 1 ক) এবং আসল স্ট্যাক (প্রায় 7 কে) অন্তর্ভুক্ত। পরেরটি কার্নেল ফাংশনে কিছু অটো ভেরিয়েবল বা ফাংশন কল প্যারাম বা ফাংশন ঠিকানা সঞ্চয় করতে ব্যবহৃত হয়। এখানে কোডটি রয়েছে (প্রসেসর এইচ (লিনাক্স \ এসএম-আই 386 অন্তর্ভুক্ত)):
#define THREAD_SIZE (2*PAGE_SIZE)
#define alloc_task_struct() ((struct task_struct *) __get_free_pages(GFP_KERNEL,1))
#define free_task_struct(p) free_pages((unsigned long) (p), 1)
__get_free_pages (GFP_KERNEL, 1)) অর্থ 2 ^ 1 = 2 পৃষ্ঠা হিসাবে বরাদ্দ মেমরি।
তবে প্রক্রিয়া স্ট্যাকটি অন্য জিনিস, এর ঠিকানাটি কেবল বেলো 0xC0000000 (32 বিট লিনাক্স), এটির আকারটি বেশ বড় হতে পারে, ব্যবহারকারীর স্পেস ফাংশন কলগুলির জন্য ব্যবহৃত হয়।
সুতরাং এখানে সিস্টেম কলের জন্য একটি প্রশ্ন আসবে, এটি কার্নেল স্পেসে চলছে তবে ব্যবহারকারী স্পেসে প্রক্রিয়া দ্বারা ডাকা হয়েছিল, এটি কীভাবে কাজ করে? লিনাক্স কার্নেল স্ট্যাক বা প্রক্রিয়া স্ট্যাকের মধ্যে তার প্যারামগুলি এবং ফাংশন ঠিকানা রাখবে? লিনাক্সের সমাধান: সমস্ত সিস্টেম কলটি সফ্টওয়্যার ব্যাঘাত আইএনটি 0x80 দ্বারা ট্রিগার করা হয়। এন্ট্রি.-এ সংজ্ঞায়িত করা হয়েছে (লিনাক্স \ আর্ক \ i386 \ কার্নেল), উদাহরণস্বরূপ এখানে কয়েকটি লাইন রয়েছে:
ENTRY(sys_call_table)
.long SYMBOL_NAME(sys_ni_syscall) /* 0 - old "setup()" system call*/
.long SYMBOL_NAME(sys_exit)
.long SYMBOL_NAME(sys_fork)
.long SYMBOL_NAME(sys_read)
.long SYMBOL_NAME(sys_write)
.long SYMBOL_NAME(sys_open) /* 5 */
.long SYMBOL_NAME(sys_close)
দ্বারা সুনীল যাদব, Quora তে:
লিনাক্স কার্নেল প্রত্যেকটি জিনিসকে বোঝায় যা কার্নেল মোডে চলমান এবং বিভিন্ন স্বতন্ত্র স্তর দ্বারা গঠিত। সর্বনিম্ন স্তরে, কার্নেল এইচএল মাধ্যমে হার্ডওয়্যারের সাথে যোগাযোগ করে। মধ্য স্তরে ইউএনআইএক্স কার্নেলটি 4 টি স্বতন্ত্র অঞ্চলে বিভক্ত। চারটি ক্ষেত্রের প্রথমটি অক্ষর ডিভাইস, কাঁচা এবং রান্না করা টিটিওয়াই এবং টার্মিনাল হ্যান্ডলিং পরিচালনা করে। দ্বিতীয় অঞ্চলটি নেটওয়ার্ক ডিভাইস ড্রাইভার, রাউটিং প্রোটোকল এবং সকেট পরিচালনা করে। তৃতীয় অঞ্চলটি ডিস্ক ডিভাইস ড্রাইভার, পৃষ্ঠা এবং বাফার ক্যাশে, ফাইল সিস্টেম, ভার্চুয়াল মেমরি, ফাইলের নামকরণ এবং ম্যাপিং পরিচালনা করে। চতুর্থ এবং শেষ অঞ্চল প্রেরণ, সময়সূচি, তৈরি এবং সমাপ্তির পাশাপাশি সংকেত হ্যান্ডলিং প্রক্রিয়া পরিচালনা করে। সর্বোপরি আমাদের কাছে কার্নেলের শীর্ষ স্তর রয়েছে যার মধ্যে সিস্টেম কল, বিঘ্ন এবং ফাঁদ রয়েছে। এই স্তরটি নিম্ন স্তরের প্রতিটি কার্যক্রমে ইন্টারফেস হিসাবে কাজ করে। একটি প্রোগ্রামার অপারেটিং সিস্টেমের বৈশিষ্ট্যগুলির সাথে যোগাযোগের জন্য বিভিন্ন সিস্টেম কল এবং বিঘ্ন ব্যবহার করে।
সংক্ষিপ্ত কার্নেল স্পেসে মেমরির অংশটি যেখানে লিনাক্স কার্নেল চালিত হয় (লিনাক্সের ক্ষেত্রে শীর্ষস্থানীয় 1 গিগাবাইট ভার্চুয়াল স্পেস) এবং ব্যবহারকারীর স্থান মেমরির সেই অংশ যেখানে ব্যবহারকারী অ্যাপ্লিকেশনটি চালিত হয় (লিনাক্সের ক্ষেত্রে ভার্চুয়াল মেমরির নীচে 3 গিগাবাইট) যদি আপনি থাকেন নীচে দেওয়া লিঙ্কটি দেখতে আরও জানতে চান :)
http://learnlinuxconcepts.blogspot.in/2014/02/kernel-space-and-user-space.html
খুব সরল ব্যাখ্যা দেওয়ার চেষ্টা করছি
ভার্চুয়াল মেমরিটি কার্নেল স্পেস এবং ব্যবহারকারীর স্পেসে বিভক্ত। কার্নেল স্পেস হ'ল ভার্চুয়াল মেমরির এমন অঞ্চল যেখানে কার্নেল প্রসেসগুলি চলবে এবং ব্যবহারকারীর স্থান হ'ল ভার্চুয়াল মেমরির সেই অঞ্চল যেখানে ব্যবহারকারী প্রক্রিয়াগুলি চলমান থাকবে।
এই বিভাগটি মেমোরি অ্যাক্সেস সুরক্ষাগুলির জন্য প্রয়োজনীয়।
যখনই কোনও বুটলোডার কোনও র্যামের কোনও স্থানে লোড করার পরে কার্নেলটি শুরু করে, (সাধারণত কোনও এআরএম ভিত্তিক নিয়ামক হিসাবে) এটি নিশ্চিত করা দরকার যে নিয়ামকটি এফআইকিউ এবং আইআরকিউ অক্ষম দ্বারা তত্ত্বাবধায়ক মোডে রয়েছে।
কার্নেল স্পেস এবং ইউজার স্পেস লজিক্যাল স্পেস।
আধুনিক প্রসেসরের বেশিরভাগই বিভিন্ন সুবিধাভোগী মোডে চালানোর জন্য ডিজাইন করা হয়েছে। x86 মেশিনগুলি 4 টি বিভিন্ন সুবিধাযুক্ত মোডে চলতে পারে।
এবং যখন কোনও বিশেষ সুবিধাযুক্ত মোডে / উপরে থাকে তখন একটি নির্দিষ্ট মেশিন নির্দেশনা কার্যকর করা যায় can
এই নকশার কারণে আপনি একটি সিস্টেম সুরক্ষা বা বালি-বাক্সের প্রয়োগের পরিবেশ দিচ্ছেন।
কার্নেল কোডের একটি অংশ যা আপনার হার্ডওয়্যার পরিচালনা করে এবং সিস্টেম বিমূর্ততা সরবরাহ করে। সুতরাং এটিতে সমস্ত মেশিন নির্দেশের অ্যাক্সেস থাকা দরকার। এবং এটি সফটওয়্যারটির সবচেয়ে নির্ভরযোগ্য অংশ। সুতরাং আমি সর্বোচ্চ অধিকার দিয়ে মৃত্যুদন্ড কার্যকর করা উচিত। এবং রিং স্তর 0 হ'ল সর্বাধিক সুবিধাযুক্ত মোড। সুতরাং রিং স্তর 0 কে কার্নেল মোড হিসাবেও ডাকা হয় ।
ব্যবহারকারী অ্যাপ্লিকেশন হ'ল সফটওয়্যারটির অংশ যা কোনও তৃতীয় পক্ষের বিক্রেতা থেকে আসে এবং আপনি এগুলিকে পুরোপুরি বিশ্বাস করতে পারবেন না। দূষিত অভিপ্রায়যুক্ত কেউ যদি আপনার মেশিনের সমস্ত নির্দেশিকায় সম্পূর্ণ অ্যাক্সেস পেয়ে থাকে তবে আপনার সিস্টেমটি ক্রাশ করার জন্য একটি কোড লিখতে পারে। সুতরাং অ্যাপ্লিকেশনটিতে সীমিত নির্দেশাবলীর অ্যাক্সেস সরবরাহ করা উচিত। এবং রিং স্তর 3 হ'ল সর্বনিম্ন সুবিধাযুক্ত মোড। সুতরাং আপনার সমস্ত অ্যাপ্লিকেশন সেই মোডে চলে। সুতরাং যে রিং স্তর 3 এছাড়াও ব্যবহারকারী মোড বলা হয় ।
দ্রষ্টব্য: আমি রিং স্তর 1 এবং 2 পাচ্ছি না They এগুলি মূলত মধ্যবর্তী সুযোগ সুবিধাগুলি। সুতরাং ডিভাইস ড্রাইভার কোড এই অধিকার সহ কার্যকর করা হতে পারে। আফাইক, লিনাক্স যথাক্রমে কার্নেল কোড সম্পাদন এবং ব্যবহারকারীর প্রয়োগের জন্য রিং স্তর 0 এবং 3 ব্যবহার করে।
কার্নেল মোডে ঘটে যাওয়া যে কোনও অপারেশনকে কার্নেল স্পেস হিসাবে বিবেচনা করা যেতে পারে। এবং ব্যবহারকারী মোডে ঘটে যাওয়া যে কোনও ক্রিয়াকলাপকে ব্যবহারকারীর স্থান হিসাবে বিবেচনা করা যেতে পারে।
সঠিক উত্তরটি হল: কার্নেল স্পেস এবং ব্যবহারকারীর স্থানের মতো কোনও জিনিস নেই। প্রসেসরের নির্দেশের সেটটিতে পৃষ্ঠা টেবিল মানচিত্রের মূল, বা হার্ডওয়্যার ডিভাইস মেমরির অ্যাক্সেস ইত্যাদির মতো ধ্বংসাত্মক জিনিসগুলি সেট করার জন্য বিশেষ অনুমতি রয়েছে etc.
কার্নেল কোডে সর্বোচ্চ স্তরের সুবিধা রয়েছে এবং ব্যবহারকারীর কোডটি সর্বনিম্ন। এটি ব্যবহারকারীর কোডটিকে সিস্টেম ক্র্যাশ করা, অন্যান্য প্রোগ্রাম সংশোধন করা ইত্যাদি থেকে বাধা দেয়
সাধারণত কার্নেল কোডটি ব্যবহারকারীর কোডের চেয়ে আলাদা মেমরি মানচিত্রের অধীনে রাখা হয় (যেমন ব্যবহারকারীর স্পেসগুলি একে অপরের চেয়ে আলাদা মেমরি মানচিত্রে রাখা হয়)। এখান থেকে "কার্নেল স্পেস" এবং "ব্যবহারকারীর স্পেস" পদগুলি এসেছে। তবে এটি কোনও কঠোর এবং দ্রুত নিয়ম নয়। উদাহরণস্বরূপ, যেহেতু x86 অপ্রত্যক্ষভাবে তার বিঘ্নিত / ট্র্যাপ হ্যান্ডলারগুলি সর্বদা ম্যাপ করা প্রয়োজন, কার্নেলের অংশ (বা কিছু OSE সমস্ত) ব্যবহারকারীর স্পেসে ম্যাপ করা আবশ্যক। আবার, এর অর্থ এই নয় যে এই জাতীয় কোডটির ব্যবহারকারীর সুবিধাগুলি রয়েছে।
কার্নেল / ব্যবহারকারীর বিভাজন কেন প্রয়োজনীয়? কিছু ডিজাইনার এটিতে আসলেই প্রয়োজনীয় বলে একমত নন। মাইক্রোকার্নেল আর্কিটেকচারটি এই ধারণাটির উপর ভিত্তি করে তৈরি করা হয়েছে যে ব্যবহারকারীর সুবিধাযুক্ত কোডে সমস্ত উল্লেখযোগ্য ক্রিয়াকলাপ সহ কোডের সর্বাধিক সুবিধাযুক্ত বিভাগগুলি যথাসম্ভব ছোট হওয়া উচিত। আপনার পড়াশুনা করতে হবে কেন এটি একটি ভাল ধারণা হতে পারে, এটি কোনও সাধারণ ধারণা নয় (এবং সুবিধা এবং ত্রুটি উভয়ের জন্যই বিখ্যাত)।
স্মৃতি দুটি স্বতন্ত্র অঞ্চলে বিভক্ত:
ব্যবহারকারীর স্পেসের অধীনে চলমান প্রক্রিয়াগুলির কেবলমাত্র মেমোরির সীমিত অংশে অ্যাক্সেস থাকে তবে কার্নেলের সমস্ত মেমরির অ্যাক্সেস থাকে। ব্যবহারকারীর স্পেসে চলমান প্রক্রিয়াগুলির কার্নেল স্পেসেও অ্যাক্সেস নেই। ব্যবহারকারীর স্পেস প্রক্রিয়াগুলি কেবল কার্নেলের দ্বারা প্রকাশিত ইন্টারফেসের মাধ্যমে কার্নেলের একটি ছোট অংশ অ্যাক্সেস করতে পারে - সিস্টেম কল I হ্যান্ডলার শেষ হওয়ার পরে এটির কাজ।
লিনাক্সে দুটি স্থান প্রথম স্থান ব্যবহারকারী ব্যবহারকারীর এবং অন্যটি হল কর্নাল স্পেস। ব্যবহারকারীর স্থানটিতে কেবলমাত্র ব্যবহারকারী অ্যাপ্লিকেশন থাকে যা আপনি চালনা করতে চান। কার্নাল পরিষেবা হিসাবে প্রক্রিয়া পরিচালনা, ফাইল পরিচালনা, সংকেত হ্যান্ডলিং, মেমরি পরিচালনা, থ্রেড ম্যানেজমেন্ট এবং আরও অনেক পরিষেবা সেখানে উপস্থিত রয়েছে। আপনি যদি ইউজার স্পেস থেকে অ্যাপ্লিকেশনটি চালান তবে অ্যাপ্লিকেশনটি কেবল কার্নাল পরিষেবাদির সাথে যোগাযোগ করে। এবং সেই পরিষেবাটি ডিভাইস ড্রাইভারের সাথে যোগাযোগ করে যা হার্ডওয়্যার এবং কার্নালের মধ্যে উপস্থিত থাকে। কার্নাল স্পেস এবং ব্যবহারকারী স্পেস বিচ্ছিন্নতার মূল সুবিধাটি হ'ল আমরা ব্যবহারকারীর স্পেসে উপস্থিত সমস্ত ব্যবহারকারীর অ্যাপ্লিকেশনটির ভাইরাস.বিসিএজ দ্বারা সুরক্ষা অর্জন করতে পারি, এবং পরিষেবাটি কার্নাল স্পেসে উপস্থিত রয়েছে। কেন লিনাক্স ভাইরাস থেকে প্রভাব ফেলবে না ts