একটি উত্তম টিওসি এবং আরও সামগ্রী সহ এই উত্তরের সংস্করণ ।
আমি রিপোর্ট করা ত্রুটি সংশোধন করব। আপনি যদি বৃহত পরিবর্তন করতে চান বা কোনও অনুপস্থিত দিক যুক্ত করতে চান তবে ভাল উত্তর পাওয়ার জন্য নিজের উত্তরগুলিতে এগুলি তৈরি করুন। গৌণ সম্পাদনাগুলি সরাসরি একত্রিত হতে পারে।
কোডের উদাহরণ
সর্বনিম্ন উদাহরণ: https://github.com/cirosantilli/x86-bare-metal-example/blob/5c672f73884a487414b3e21bd9e579c67cd77621/paging.S
প্রোগ্রামিংয়ের অন্যান্য কিছুর মতোই, এটিকে সত্যিই বোঝার একমাত্র উপায় হ'ল ন্যূনতম উদাহরণগুলি সহ খেল।
এটিকে কী "শক্ত" বিষয় হিসাবে পরিণত করে তা হ'ল ন্যূনতম উদাহরণটি বড় কারণ আপনার নিজের ছোট ওএস তৈরি করতে হবে।
ইন্টেল ম্যানুয়াল
যদিও উদাহরণগুলি মনে না রেখে এটি বোঝা অসম্ভব, যত তাড়াতাড়ি সম্ভব ম্যানুয়ালগুলির সাথে পরিচিত হওয়ার চেষ্টা করুন।
ইন্টেল ইন্টেল ম্যানুয়াল ভলিউম 3 সিস্টেম প্রোগ্রামিং গাইড - 325384-056 মার্কিন সেপ্টেম্বর 2015 অধ্যায় 4 "পেজিং" এর পেজিংয়ের বর্ণনা দেয় ।
বিশেষ আকর্ষণীয় চিত্র 4-4 "32-বিট পেজিংয়ের সাথে সিআর 3 এর ফর্ম্যাটস এবং পেজিং-স্ট্রাকচার এন্ট্রি", যা কী ডেটা স্ট্রাকচার দেয়।
এমএমইউ
পেজিং সিপিইউর মেমরি ম্যানেজমেন্ট ইউনিট (এমএমইউ) অংশ দ্বারা করা হয়। অন্যান্য অনেকের (যেমন x87 কো-প্রসেসর , এপিক ) এর মতো এটি প্রথম দিনগুলিতে পৃথক চিপ দ্বারা ব্যবহৃত হত, যা পরে সিপিইউতে সংহত হয়েছিল। শব্দটি এখনও ব্যবহৃত হয়।
সাধারণ ঘটনা
লজিক্যাল ঠিকানাগুলি মেমরি অ্যাড্রেস "নিয়মিত" ব্যবহারকারী-জমি কোড ব্যবহৃত (যেমন বিষয়বস্তু হয় rsi
মধ্যে mov eax, [rsi]
)।
প্রথম বিভাগটি তাদের রৈখিক ঠিকানাগুলিতে অনুবাদ করে এবং তারপরে পেজিংয়ের পরে রৈখিক ঠিকানাগুলি দৈহিক ঠিকানায় অনুবাদ করে।
(logical) ------------------> (linear) ------------> (physical)
segmentation paging
বেশিরভাগ সময়, আমরা প্রকৃত র্যাম হার্ডওয়্যার মেমরি কোষকে সূচক হিসাবে শারীরিক ঠিকানাগুলি ভাবতে পারি, তবে এটি এর ফলে 100% সত্য নয়:
পেজিং কেবল সুরক্ষিত মোডে উপলব্ধ। সুরক্ষিত মোডে পেজিংয়ের ব্যবহার isচ্ছিক। রেজিস্টার PG
বিট cr0
সেট করা থাকলে পেজিং চালু আছে।
পেজিং বনাম বিভাজন
পেজিং এবং বিভাগকরণের মধ্যে একটি প্রধান পার্থক্য হ'ল:
- পেজিং র্যামকে সমান আকারের অংশগুলিতে পৃষ্ঠাগুলি বলা হয়
- বিভাজনটি মেমরিকে স্বেচ্ছাসেবী আকারের মধ্যে বিভক্ত করে
এটি পেজিংয়ের প্রধান সুবিধা, যেহেতু সমান আকারের অংশগুলি জিনিসগুলিকে আরও পরিচালনাযোগ্য করে তোলে।
পেজিংটি এত বেশি জনপ্রিয় হয়ে উঠেছে যে বিভাগটি করার জন্য সমর্থনটি x86-64 এ 64৪-বিট মোডে বাদ দেওয়া হয়েছিল, এটি নতুন সফ্টওয়্যারটির অপারেশনের প্রধান মোড, যেখানে এটি কেবলমাত্র সামঞ্জস্যতা মোডে উপস্থিত রয়েছে, যা আইএ 32 অনুকরণ করে।
প্রয়োগ
পেজিং আধুনিক ওএসে প্রসেস ভার্চুয়াল অ্যাড্রেস স্পেসগুলি প্রয়োগ করতে ব্যবহৃত হয়। ভার্চুয়াল ঠিকানার সাহায্যে ওএস কোনও একা র্যামে দু'বার বা একাধিক সমবর্তী প্রক্রিয়াগুলি এমনভাবে ফিট করতে পারে যে:
- উভয় প্রোগ্রামের অন্যান্য সম্পর্কে কিছুই জানতে হবে
- উভয় প্রোগ্রামের স্মৃতি প্রয়োজন হিসাবে বৃদ্ধি এবং সঙ্কুচিত হতে পারে
- প্রোগ্রামগুলির মধ্যে স্যুইচ খুব দ্রুত is
- একটি প্রোগ্রাম কখনই অন্য প্রক্রিয়ার স্মৃতি অ্যাক্সেস করতে পারে না
পেজিং gmentতিহাসিকভাবে বিভাগকরণের পরে এসেছিল এবং লিনাক্সের মতো আধুনিক ওএসগুলিতে ভার্চুয়াল মেমরির প্রয়োগের জন্য এটি বেশিরভাগ ক্ষেত্রে প্রতিস্থাপন করা হয়েছে কারণ পরিবর্তনশীল দৈর্ঘ্যের অংশগুলির পরিবর্তে পৃষ্ঠাগুলির মাপের স্থির আকারের অংশগুলি পরিচালনা করা সহজ।
হার্ডওয়্যার বাস্তবায়ন
সুরক্ষিত মোডে বিভাগকরণের মতো (যেখানে কোনও বিভাগ রেজিস্টার পরিবর্তন করে জিডিটি বা এলডিটি থেকে লোডকে ট্রিগার করে), পেজিং হার্ডওয়্যার তার কাজটি করার জন্য মেমরির ডেটা স্ট্রাকচার ব্যবহার করে (পৃষ্ঠা সারণী, পৃষ্ঠা ডিরেক্টরি ইত্যাদি)।
এই ডেটা স্ট্রাকচারগুলির ফর্ম্যাটটি হার্ডওয়্যার দ্বারা স্থির করা হয়েছে , তবে র্যামে those ডেটা স্ট্রাকচারগুলি সঠিকভাবে সেট আপ এবং পরিচালনা করতে এবং তাদের (মাধ্যমে cr3
) কোথায় হার্ডওয়্যারটি জানাতে হবে তা ওএসের উপর নির্ভর করে ।
কিছু অন্যান্য স্থাপত্যগুলি সফ্টওয়্যারটির হাতে প্রায় পুরোপুরি পেজিং ছেড়ে দেয়, সুতরাং একটি টিএলবি মিস পৃষ্ঠার টেবিলগুলি হেঁটে টিএলবিতে নতুন ম্যাপিং sertোকাতে একটি ওএস সরবরাহকারী ফাংশন চালায়। এটি পৃষ্ঠার সারণী ফর্ম্যাটগুলিকে ওএস দ্বারা চয়ন করার জন্য ছেড়ে দেয়, তবে x86 যেভাবে নির্দেশাবলীর বহির্বিন্যাসের কার্য সম্পাদন করে পৃষ্ঠা-ওয়াককে ওভারল্যাপ করতে সক্ষম করে তা হার্ডওয়্যারটির পক্ষে অসম্ভব করে তোলে ।
উদাহরণ: সরলিকৃত একক স্তরের পেজিং স্কিম
ভার্চুয়াল মেমরি স্পেস প্রয়োগ করার জন্য কীভাবে x86 আর্কিটেকচারের সরল সংস্করণে পেজিং কাজ করে তার একটি উদাহরণ ।
পৃষ্ঠা সারণী
ওএস তাদের নীচের পৃষ্ঠার টেবিলগুলি দিতে পারে:
ওএস দ্বারা 1 প্রক্রিয়া করার জন্য পৃষ্ঠা সারণী দেওয়া হয়েছে:
RAM location physical address present
----------------- ----------------- --------
PT1 + 0 * L 0x00001 1
PT1 + 1 * L 0x00000 1
PT1 + 2 * L 0x00003 1
PT1 + 3 * L 0
... ...
PT1 + 0xFFFFF * L 0x00005 1
ওএস দ্বারা 2 প্রক্রিয়া করার জন্য পৃষ্ঠা সারণী দেওয়া হয়েছে:
RAM location physical address present
----------------- ----------------- --------
PT2 + 0 * L 0x0000A 1
PT2 + 1 * L 0x0000B 1
PT2 + 2 * L 0
PT2 + 3 * L 0x00003 1
... ... ...
PT2 + 0xFFFFF * L 0x00004 1
কোথায়:
PT1
এবং PT2
: র্যামে টেবিল 1 এবং 2 এর প্রাথমিক অবস্থান।
নমুনা মান: 0x00000000
, 0x12345678
, ইত্যাদি
এটি ওএসই সেই মানগুলি স্থির করে।
L
: একটি পৃষ্ঠার টেবিল এন্ট্রি দৈর্ঘ্য।
present
: পৃষ্ঠাটি স্মৃতিতে উপস্থিত রয়েছে তা নির্দেশ করে।
পৃষ্ঠার টেবিলগুলি র্যামে অবস্থিত। তারা উদাহরণস্বরূপ অবস্থিত হতে পারে:
--------------> 0xFFFFFFFF
--------------> PT1 + 0xFFFFF * L
Page Table 1
--------------> PT1
--------------> PT2 + 0xFFFFF * L
Page Table 2
--------------> PT2
--------------> 0x0
উভয় পৃষ্ঠ সারণির জন্য র্যামের প্রাথমিক অবস্থানগুলি নির্বিচারে এবং ওএস দ্বারা নিয়ন্ত্রিত হয়। তারা ওভারল্যাপ না করে তা নিশ্চিত করা ওএসের উপর নির্ভর করে!
প্রতিটি প্রক্রিয়া কোনও পৃষ্ঠার টেবিলকে সরাসরি স্পর্শ করতে পারে না, যদিও এটি ওএসকে অনুরোধ করতে পারে যা পৃষ্ঠার টেবিলগুলিকে সংশোধন করে, উদাহরণস্বরূপ বৃহত্তর স্ট্যাক বা হিপ বিভাগের জন্য জিজ্ঞাসা করে।
একটি পৃষ্ঠা 4KB (12 বিট) এর একটি অংশ, এবং যেহেতু ঠিকানাগুলিতে 32 বিট থাকে, কেবলমাত্র 20 টি বিট (20 + 12 = 32, সুতরাং হেক্সাডেসিমাল স্বরলিপিতে 5 টি অক্ষর) প্রতিটি পৃষ্ঠা সনাক্ত করতে হবে। এই মানটি হার্ডওয়্যার দ্বারা স্থির।
পৃষ্ঠা টেবিল এন্ট্রি
একটি পৃষ্ঠা সারণী ... পৃষ্ঠাগুলির টেবিল এন্ট্রিগুলির একটি টেবিল!
টেবিল এন্ট্রিগুলির সঠিক ফর্ম্যাটটি হার্ডওয়্যার দ্বারা স্থির করা হয়েছে ।
এই সরল উদাহরণে, পৃষ্ঠা সারণীর এন্ট্রিগুলিতে কেবল দুটি ক্ষেত্র রয়েছে:
bits function
----- -----------------------------------------
20 physical address of the start of the page
1 present flag
সুতরাং এই উদাহরণে হার্ডওয়্যার ডিজাইনাররা চয়ন করতে পারে L = 21
।
বেশিরভাগ আসল পৃষ্ঠার টেবিল এন্ট্রিগুলিতে অন্যান্য ক্ষেত্র রয়েছে।
21 বিটগুলিতে জিনিসগুলি সারিবদ্ধ করা অবৈধ হবে যেহেতু মেমরিটি বাইট দ্বারা নয় ঠিক বিট দ্বারা চিহ্নিত করা যায়। সুতরাং, এমনকি L = 32
এক্ষেত্রে শুধুমাত্র 21 টি বিটগুলির প্রয়োজন, হার্ডওয়্যার ডিজাইনার সম্ভবত অ্যাক্সেসটি দ্রুততর করতে পছন্দ করবেন এবং পরবর্তী ব্যবহারের জন্য বাকী বিটগুলি কেবল সংরক্ষণ করুন। L
X86 এর জন্য আসল মান 32 বিট।
একক-স্তরের স্কিমের ঠিকানা অনুবাদ
পৃষ্ঠার টেবিলগুলি ওএস দ্বারা সেট আপ হয়ে গেলে, লিনিয়ার এবং শারীরিক ঠিকানার মধ্যে ঠিকানা অনুবাদ হার্ডওয়্যার দ্বারা সম্পন্ন হয় ।
অপারেটিং সিস্টেম সক্রিয় প্রক্রিয়া 1 চায়, তখন তা সেট করে cr3
করতে PT1
, প্রক্রিয়া এক জন্য টেবিল শুরু।
যদি প্রক্রিয়া 1 লিনিয়ার ঠিকানা অ্যাক্সেস করতে চায় 0x00000001
তবে পেজিং হার্ডওয়্যার সার্কিটটি ওএসের জন্য স্বয়ংক্রিয়ভাবে নিম্নলিখিতটি করে:
রৈখিক ঠিকানা দুটি ভাগে বিভক্ত করুন:
| page (20 bits) | offset (12 bits) |
সুতরাং এই ক্ষেত্রে আমাদের হবে:
- পৃষ্ঠা = 0x00000
- অফসেট = 0x001
পৃষ্ঠা টেবিল 1 দেখুন কারণ cr3
এটি পয়েন্ট।
এন্ট্রি দেখুন 0x00000
কারণ এটি পৃষ্ঠা অংশ।
হার্ডওয়্যারটি জানে যে এই এন্ট্রিটি র্যাম ঠিকানায় অবস্থিত PT1 + 0 * L = PT1
।
যেহেতু এটি উপস্থিত, অ্যাক্সেসটি বৈধ
পৃষ্ঠা টেবিল দ্বারা, পৃষ্ঠা নম্বর অবস্থান 0x00000
হয় 0x00001 * 4K = 0x00001000
।
চূড়ান্ত শারীরিক ঠিকানা সন্ধানের জন্য আমাদের কেবল অফসেট যুক্ত করা দরকার:
00001 000
+ 00000 001
-----------
00001 001
কারণ 00001
পৃষ্ঠার শারীরিক ঠিকানাটি টেবিলের উপরে তাকানো এবং 001
এটি অফসেট।
নামটি ইঙ্গিত করে, অফসেটটি সর্বদা সহজভাবে পৃষ্ঠার শারীরিক ঠিকানা যুক্ত করা হয়।
হার্ডওয়্যার এর পরে সেই শারীরিক অবস্থানে মেমরি পায়।
একই পদ্ধতিতে, নিম্নলিখিত অনুবাদগুলি প্রক্রিয়া 1 এর জন্য ঘটবে:
linear physical
--------- ---------
00000 002 00001 002
00000 003 00001 003
00000 FFF 00001 FFF
00001 000 00000 000
00001 001 00000 001
00001 FFF 00000 FFF
00002 000 00002 000
FFFFF 000 00005 000
উদাহরণস্বরূপ, ঠিকানা অ্যাক্সেস করার সময় 00001000
, পৃষ্ঠার অংশটি 00001
হার্ডওয়্যারটি জানে যে পৃষ্ঠার সারণী এন্ট্রিটি র্যাম ঠিকানায় অবস্থিত: PT1 + 1 * L
( 1
পৃষ্ঠার অংশের কারণে), এবং এটি যেখানে এটি সন্ধান করবে।
ওএস যখন প্রসেস 2-এ স্যুইচ করতে চায়, তখন কেবল cr3
পৃষ্ঠায় পয়েন্ট 2 করা দরকার এটি এত সহজ!
এখন নিম্নলিখিত অনুবাদগুলি প্রক্রিয়া 2 এর জন্য ঘটবে:
linear physical
--------- ---------
00000 002 00001 002
00000 003 00001 003
00000 FFF 00001 FFF
00001 000 00000 000
00001 001 00000 001
00001 FFF 00000 FFF
00003 000 00003 000
FFFFF 000 00004 000
একই লিনিয়ার ঠিকানাটি কেবলমাত্র অভ্যন্তরের মানের উপর নির্ভর করে বিভিন্ন প্রক্রিয়াগুলির জন্য বিভিন্ন শারীরিক ঠিকানায় অনুবাদ করেcr3
।
এই পদ্ধতিতে প্রতিটি প্রোগ্রামের সঠিক শারীরিক ঠিকানা সম্পর্কে চিন্তা না করেই এর ডেটা শুরু 0
এবং শেষ হবে বলে আশা করা যায় FFFFFFFF
।
পৃষ্ঠার ত্রুটি
প্রক্রিয়া 1 যদি উপস্থিত নেই এমন কোনও পৃষ্ঠার ভিতরে কোনও ঠিকানা অ্যাক্সেস করার চেষ্টা করে তবে কী হবে?
হার্ডওয়্যারটি একটি পৃষ্ঠা ফল্ট ব্যতিক্রমের মাধ্যমে সফ্টওয়্যারটিকে অবহিত করে।
তারপরে সাধারণত কী করা উচিত তা নির্ধারণের জন্য একটি ব্যতিক্রম হ্যান্ডলারকে নিবন্ধিত করা ওএসের কাজ।
এটা সম্ভব যে টেবিলটিতে নেই এমন একটি পৃষ্ঠা অ্যাক্সেস করা একটি প্রোগ্রামিং ত্রুটি:
int is[1];
is[2] = 1;
তবে এমন কিছু ক্ষেত্রে থাকতে পারে যেখানে এটি গ্রহণযোগ্য, যেমন লিনাক্সে যখন:
প্রোগ্রামটি তার স্ট্যাক বাড়াতে চায়।
এটি কেবলমাত্র প্রদত্ত সম্ভাব্য পরিসরে একটি নির্দিষ্ট বাইট অ্যাক্সেস করার চেষ্টা করে এবং ওএস খুশি হলে এটি পৃষ্ঠাটি প্রক্রিয়া ঠিকানার জায়গাতে যুক্ত করে।
পৃষ্ঠাটি ডিস্কে অদলবদল করা হয়েছিল।
পৃষ্ঠাটি র্যামে ফিরে আসার জন্য ওএসকে প্রক্রিয়াগুলির পিছনে কিছু কাজ করতে হবে।
অপারেটিং সিস্টেম ওএস আবিষ্কার করতে পারে যে পৃষ্ঠা সারণী প্রবেশের বাকী বিষয়বস্তুর উপর ভিত্তি করে এটিই কেস, যেহেতু যদি বর্তমান পতাকাটি পরিষ্কার থাকে, পৃষ্ঠার টেবিল এন্ট্রির অন্যান্য প্রবেশদ্বারগুলি ওএস যা চায় তা সম্পূর্ণরূপে ছেড়ে যায়।
উদাহরণস্বরূপ লিনাক্সে, যখন = 0:
পৃষ্ঠা সারণীর প্রবেশের সমস্ত ক্ষেত্র যদি 0, অবৈধ ঠিকানা।
অন্যথায়, পৃষ্ঠাটি ডিস্কে অদলবদল করা হয়েছে এবং সেই ক্ষেত্রগুলির প্রকৃত মানগুলি ডিস্কের পৃষ্ঠার অবস্থানটি এনকোড করে।
যাই হোক না কেন, ওএসের জানা দরকার যে সমস্যাটি মোকাবেলা করতে সক্ষম হওয়ার জন্য কোন ঠিকানা পৃষ্ঠা ফল্ট উত্পন্ন করেছিল। এই কারণেই cr2
যখনই কোনও পৃষ্ঠা ফল্ট ঘটে তখন সুন্দর আইএ 3232 বিকাশকারীরা সেই ঠিকানার মান নির্ধারণ করে । ব্যতিক্রম হ্যান্ডলারটি কেবলমাত্র cr2
ঠিকানাটি দেখতে সন্ধান করতে পারে।
সরলকরণ
বাস্তবতার সরলীকরণ যা এই উদাহরণটি বুঝতে সহজ করে তোলে:
সমস্ত আসল পেজিং সার্কিট স্থান বাঁচাতে একাধিক স্তরের পেজিং ব্যবহার করে তবে এটি একটি সাধারণ একক-স্তরের স্কিম দেখায়।
পৃষ্ঠার সারণীতে কেবলমাত্র দুটি ক্ষেত্র রয়েছে: একটি 20 বিট ঠিকানা এবং 1 বিট উপস্থিত পতাকা।
আসল পৃষ্ঠার টেবিলগুলিতে মোট 12 টি ক্ষেত্র রয়েছে এবং তাই অন্যান্য বৈশিষ্ট্যগুলি বাদ দেওয়া হয়েছে।
উদাহরণ: মাল্টি-লেভেল পেজিং স্কিম
একক স্তরের পেজিং স্কিমের সমস্যাটি হ'ল এটি প্রতি প্রক্রিয়াতে খুব বেশি র্যাম: 4 জি / 4 কে = 1 এম এন্ট্রি গ্রহণ করবে । যদি প্রতিটি এন্ট্রি 4 বাইট দীর্ঘ হয়, তবে এটি প্রক্রিয়া অনুযায়ী 4 এম করতে পারে , যা ডেস্কটপ কম্পিউটারের জন্যও অনেক বেশি: ps -A | wc -l
বলে যে আমি এই মুহুর্তে 244 টি প্রসেস চালাচ্ছি, যাতে আমার র্যামের প্রায় 1 জিবি লাগবে!
এই কারণে, x86 বিকাশকারীরা মাল্টি-লেভেল স্কিম ব্যবহার করার সিদ্ধান্ত নিয়েছে যা র্যামের ব্যবহার হ্রাস করে।
এই সিস্টেমের খারাপ দিকটি এটির অ্যাক্সেসের সময়টি কিছুটা বেশি।
পিএই ছাড়াই 32 বিট প্রসেসরের জন্য ব্যবহৃত সহজ 3 স্তরের পেজিং স্কিমটিতে, 32 অ্যাড্রেস বিটগুলি নিম্নরূপে বিভক্ত করা হয়েছে:
| directory (10 bits) | table (10 bits) | offset (12 bits) |
প্রতিটি প্রক্রিয়াটির সাথে অবশ্যই একটি এবং কেবলমাত্র একটি পৃষ্ঠাগুলি ডিরেক্টরি যুক্ত থাকতে হবে, সুতরাং এতে 2^10 = 1K
কমপক্ষে পৃষ্ঠাগুলির ডিরেক্টরি অন্তর্ভুক্ত থাকবে, যা একক স্তরের স্কিমের জন্য প্রয়োজনীয় ন্যূনতম 1M এর চেয়ে অনেক ভাল।
পৃষ্ঠার টেবিলগুলি কেবল ওএস দ্বারা প্রয়োজনীয় হিসাবে বরাদ্দ করা হয়। প্রতিটি পৃষ্ঠা সারণীতে 2^10 = 1K
পৃষ্ঠা ডিরেক্টরি এন্ট্রি রয়েছে
পৃষ্ঠা ডিরেক্টরিতে রয়েছে ... পৃষ্ঠা ডিরেক্টরি এন্ট্রি! পৃষ্ঠা ডিরেক্টরি এন্ট্রিগুলি পৃষ্ঠার টেবিলের এন্ট্রিগুলির সমান, কেবলমাত্র তারা সারণীর ভৌত ঠিকানার পরিবর্তে পৃষ্ঠা সারণীর র্যামের ঠিকানাগুলিতে নির্দেশ করে । যেহেতু এই ঠিকানাগুলি কেবল 20 বিট বিস্তৃত, পৃষ্ঠা টেবিলগুলি 4KB পৃষ্ঠাগুলির শুরুতে হওয়া উচিত।
cr3
এখন পৃষ্ঠা সারণির পরিবর্তে বর্তমান প্রক্রিয়ার পৃষ্ঠা ডিরেক্টরিটির র্যামে অবস্থিত।
পৃষ্ঠার টেবিল এন্ট্রি একক স্তরের স্কিম থেকে মোটেও পরিবর্তন করে না।
পৃষ্ঠার সারণীগুলি একক স্তরের স্কিম থেকে পরিবর্তিত হয় কারণ:
- প্রতিটি প্রক্রিয়াতে 1K পৃষ্ঠার টেবিল থাকতে পারে, প্রতি পৃষ্ঠায় ডিরেক্টরিতে প্রবেশের জন্য একটি।
- প্রতিটি পৃষ্ঠার সারণীতে 1 এম এন্ট্রির পরিবর্তে 1K এন্ট্রি রয়েছে।
প্রথম দুটি স্তরে 10 টি বিট ব্যবহার করার কারণ (এবং না, বলুন 12 | 8 | 12
), প্রতিটি পৃষ্ঠা সারণীর এন্ট্রি 4 বাইট দীর্ঘ। তারপরে পৃষ্ঠা ডিরেক্টরি এবং পৃষ্ঠা সারণীর 2 ^ 10 এন্ট্রি 4Kb পৃষ্ঠাগুলিতে দুর্দান্তভাবে ফিট করবে। এর অর্থ হ'ল সেই উদ্দেশ্যে পৃষ্ঠাগুলি বরাদ্দ করা এবং অপসারণ করা আরও দ্রুত এবং সহজ।
বহু স্তরের স্কীমে ঠিকানা অনুবাদ Address
পৃষ্ঠা ডিরেক্টরিটি ওএস দ্বারা 1 প্রক্রিয়াতে দেওয়া হয়েছে:
RAM location physical address present
--------------- ----------------- --------
PD1 + 0 * L 0x10000 1
PD1 + 1 * L 0
PD1 + 2 * L 0x80000 1
PD1 + 3 * L 0
... ...
PD1 + 0x3FF * L 0
ওএস দ্বারা 1 * প্রক্রিয়া করার জন্য পৃষ্ঠা সারণী দেওয়া হয়েছে PT1 = 0x10000000
( 0x10000
* 4K):
RAM location physical address present
--------------- ----------------- --------
PT1 + 0 * L 0x00001 1
PT1 + 1 * L 0
PT1 + 2 * L 0x0000D 1
... ...
PT1 + 0x3FF * L 0x00005 1
ওএস দ্বারা 1 * প্রক্রিয়া করার জন্য পৃষ্ঠা সারণী দেওয়া হয়েছে PT2 = 0x80000000
( 0x80000
* 4K):
RAM location physical address present
--------------- ----------------- --------
PT2 + 0 * L 0x0000A 1
PT2 + 1 * L 0x0000C 1
PT2 + 2 * L 0
... ...
PT2 + 0x3FF * L 0x00003 1
কোথায়:
PD1
: র্যামে প্রক্রিয়া 1 পৃষ্ঠা পৃষ্ঠাটির প্রাথমিক অবস্থান।
PT1
এবং PT2
: পৃষ্ঠার টেবিলের প্রাথমিক অবস্থান 1 এবং র্যামে 1 প্রক্রিয়াটির জন্য পৃষ্ঠা সারণী 2।
সুতরাং এই উদাহরণে পৃষ্ঠা ডিরেক্টরি এবং পৃষ্ঠা সারণীটি র্যামে কিছু সংরক্ষণ করা যেতে পারে:
----------------> 0xFFFFFFFF
----------------> PT2 + 0x3FF * L
Page Table 1
----------------> PT2
----------------> PD1 + 0x3FF * L
Page Directory 1
----------------> PD1
----------------> PT1 + 0x3FF * L
Page Table 2
----------------> PT1
----------------> 0x0
আসুন লিনিয়ার ঠিকানাটি 0x00801004
ধাপে ধাপে অনুবাদ করুন ।
আমরা মনে করি যে এটি cr3 = PD1
, যা স্রেফ বর্ণিত পৃষ্ঠা ডিরেক্টরিটিতে নির্দেশ করে।
বাইনারি রৈখিক ঠিকানা:
0 0 8 0 1 0 0 4
0000 0000 1000 0000 0001 0000 0000 0100
হিসাবে গ্রুপিং 10 | 10 | 12
:
0000000010 0000000001 000000000100
0x2 0x1 0x4
যা দেয়:
- পৃষ্ঠা ডিরেক্টরি এন্ট্রি = 0x2
- পৃষ্ঠা সারণি এন্ট্রি = 0x1
- অফসেট = 0x4
সুতরাং হার্ডওয়্যার পৃষ্ঠা ডিরেক্টরিটির 2 প্রবেশের সন্ধান করে।
পৃষ্ঠা ডিরেক্টরি সারণীটি বলে যে পৃষ্ঠার সারণিটি অবস্থিত 0x80000 * 4K = 0x80000000
। এটি প্রক্রিয়াটির প্রথম র্যাম অ্যাক্সেস।
পৃষ্ঠা সারণীর এন্ট্রি 0x1
হওয়ায়, হার্ডওয়্যার পৃষ্ঠা পৃষ্ঠা সারণীর 1 এন্ট্রি দেখায় 0x80000000
, যা এটি বলে যে প্রকৃত পৃষ্ঠা ঠিকানায় অবস্থিত 0x0000C * 4K = 0x0000C000
। এটি প্রক্রিয়াটির দ্বিতীয় র্যাম অ্যাক্সেস।
অবশেষে, পেজিং হার্ডওয়্যারটি অফসেট যুক্ত করে, এবং চূড়ান্ত ঠিকানাটি 0x0000C004
।
অনূদিত ঠিকানার অন্যান্য উদাহরণ হ'ল:
linear 10 10 12 split physical
-------- --------------- ----------
00000001 000 000 001 00001001
00001001 000 001 001 page fault
003FF001 000 3FF 001 00005001
00400000 001 000 000 page fault
00800001 002 000 001 0000A001
00801008 002 001 008 0000C008
00802008 002 002 008 page fault
00B00001 003 000 000 page fault
কোনও পৃষ্ঠা ডিরেক্টরি এন্ট্রি বা একটি পৃষ্ঠা সারণী এন্ট্রি উপস্থিত না থাকলে পৃষ্ঠা ত্রুটিগুলি ঘটে।
ওএস যদি একই সাথে অন্য কোনও প্রক্রিয়া চালাতে চায়, তবে এটি দ্বিতীয় প্রক্রিয়াটিকে একটি পৃথক পৃষ্ঠা ডিরেক্টরি দেয় এবং সেই ডিরেক্টরিটিকে পৃথক পৃষ্ঠার টেবিলের সাথে যুক্ত করে।
-৪-বিট আর্কিটেকচার
RAM৪ বিট বর্তমান র্যাম আকারের জন্য এখনও খুব বেশি ঠিকানা, তাই বেশিরভাগ আর্কিটেকচার কম বিট ব্যবহার করবে।
x86_64 48 বিট (256 টিআইবি) ব্যবহার করে এবং লিগ্যাসি মোডের পিএই ইতিমধ্যে 52-বিট অ্যাড্রেসগুলি (4 পিবি) অনুমতি দেয়।
এই 48 টি বিটগুলির মধ্যে 12 টি ইতিমধ্যে অফসেটের জন্য সংরক্ষিত রয়েছে, যা 36 বিট ফেলে।
যদি 2 স্তরের পদ্ধতির গ্রহণ করা হয় তবে সেরা বিভাজনটি হবে দুটি 18 বিট স্তর।
তবে এর অর্থ হ'ল পৃষ্ঠা ডিরেক্টরিটিতে 2^18 = 256K
এন্ট্রি থাকবে যা খুব বেশি র্যাম নেয়: 32 বিট আর্কিটেকচারের জন্য একক স্তরের পেজিংয়ের কাছাকাছি!
সুতরাং, bit৪ বিট আর্কিটেকচার আরও পৃষ্ঠার স্তর তৈরি করে, সাধারণত 3 বা 4।
x86_64 কোনও 9 | 9 | 9 | 12
স্কিমে 4 স্তর ব্যবহার করে , যাতে উপরের স্তরটি কেবলমাত্র 2^9
উচ্চ স্তরের এন্ট্রি গ্রহণ করে।
পিএই
শারীরিক ঠিকানা এক্সটেনশন।
32 বিট সহ, কেবল 4 গিগাবাইট র্যাম সম্বোধন করা যেতে পারে।
এটি বড় সার্ভারগুলির জন্য সীমাবদ্ধ হয়ে উঠতে শুরু করে, সুতরাং ইন্টেল পেন্টিয়াম প্রো-এর সাথে PAE প্রক্রিয়া প্রবর্তন করে।
সমস্যা থেকে মুক্তি পেতে, ইন্টেল 4 টি নতুন ঠিকানা লাইন যুক্ত করেছে, যাতে 64 জিবি সম্বোধন করা যায়।
PAE চালু থাকলে পৃষ্ঠা সারণির কাঠামোও পরিবর্তন করা হয়। এটি ঠিক কীভাবে পরিবর্তিত হয়েছে তা পিএসই চালু বা বন্ধ রয়েছে তার উপর নির্ভর করে।
PAE PAE
বিট এর মাধ্যমে চালু এবং বন্ধ করা আছে cr4
।
এমনকি মোট ঠিকানাযোগ্য মেমরিটি GB৪ জিবি হলেও পৃথক প্রক্রিয়াটি কেবলমাত্র 4 গিগাবাইট পর্যন্ত ব্যবহার করতে সক্ষম। ওএস বিভিন্ন 4 জিবি খণ্ডে বিভিন্ন প্রক্রিয়া রাখতে পারে।
পিএসই
পৃষ্ঠার আকার এক্সটেনশন।
পৃষ্ঠাগুলির জন্য 4K এর পরিবর্তে দৈর্ঘ্যে 4M (বা PAE চালু থাকলে 2M) হতে দেয়।
পিএসই PAE
বিট এর মাধ্যমে চালু এবং বন্ধ করা আছে cr4
।
পিএই এবং পিএসই পৃষ্ঠার সারণী প্রকল্পগুলি
যদি পিএই এবং পিএসই হয় সক্রিয় থাকে, বিভিন্ন পেজিং স্তরের স্কিমগুলি ব্যবহৃত হয়:
কোনও পিএই এবং কোনও পিএসই নেই: 10 | 10 | 12
কোন PAE এবং PSE: 10 | 22
।
22 টি 4Mb পৃষ্ঠার মধ্যে অফসেট, যেহেতু 22 বিট ঠিকানা 4Mb।
পিএই এবং কোনও পিএসই: 2 | 9 | 9 | 12
9 এর পরিবর্তে 9 টি দুটি ব্যবহৃত হওয়ার নকশার কারণ হ'ল এখন এন্ট্রিগুলি 32 টি বিটগুলিতে আর ফিট করতে পারে না, যা সমস্ত 20 অ্যাড্রেস বিট এবং 12 টি অর্থপূর্ণ বা সংরক্ষিত পতাকা বিট দ্বারা পূরণ করা হয়েছিল।
কারণটি হ'ল পৃষ্ঠার টেবিলগুলির ঠিকানা উপস্থাপনের জন্য 20 বিটগুলি এখন আর পর্যাপ্ত নয়: প্রসেসরে 4 টি অতিরিক্ত ওয়্যার যুক্ত হওয়ার কারণে 24 বিট এখন দরকার।
অতএব, ডিজাইনারগণ প্রবেশের আকারটি b৪ বিটের মধ্যে বাড়ানোর সিদ্ধান্ত নিয়েছে এবং তাদের একটি একক পৃষ্ঠার টেবিলের সাথে ফিট করার জন্য এন্ট্রিগুলির সংখ্যা 2 ^ 10 এর পরিবর্তে 2 ^ 9 এ কমিয়ে আনতে হবে।
যেহেতু এটি শুরু 2, একটি নতুন পৃষ্ঠা স্তর নামক পৃষ্ঠা নির্দেশিকা পয়েন্টার সারণী (PDPT) হল পয়েন্ট পৃষ্ঠা ডিরেক্টরি এবং ঠিকানা রৈখিক 32 বিট পূরণ করার জন্য। পিডিপিটিগুলিও 64 বিট প্রশস্ত।
cr3
এখন পিডিপিটিগুলিকে নির্দেশ করে যা দক্ষতার সাথে সম্বোধনের জন্য অবশ্যই মুঠের চার 4 গিগাবাইটের মেমরিতে থাকতে হবে এবং 32 বিট বহুগুণে সারিবদ্ধ থাকবে। এর অর্থ হ'ল cr3
প্রথম 4GB এর 2 ^ 32 সম্পূর্ণ করতে 32 গুণগুলি * 2 ^ 27 এর পরিবর্তে এখন 20: 2 ^ 5 এর পরিবর্তে 27 টি তাত্পর্যপূর্ণ বিট রয়েছে।
পিএই এবং পিএসই: 2 | 9 | 21
ডিজাইনাররা এটি একটি পৃষ্ঠায় ফিট করার জন্য 9 বিট প্রশস্ত ক্ষেত্র রাখার সিদ্ধান্ত নিয়েছে।
এটি 23 বিট ছেড়ে। পিএসই ছাড়া পিএইসি কেসের সাথে জিনিসগুলি অভিন্ন রাখার জন্য পিডিপিটি-তে 2 রেখে অফসেটের জন্য 21 টি পাতা ছেড়ে যায়, অর্থাত পৃষ্ঠা 4M এর পরিবর্তে 2M প্রশস্ত হয়।
টিএলবি
ট্রান্সলেশন লুকআহেড বাফার (টিএলবি) পেজিং অ্যাড্রেসের জন্য একটি ক্যাশে।
এটি ক্যাশে হওয়ায় এটি সিপিইউ ক্যাশের অনেকগুলি ডিজাইন ইস্যু যেমন এসোসিয়েটিভিটি স্তরের ভাগ করে level
এই বিভাগে 4 টি একক ঠিকানার এন্ট্রি সহ একটি সরলীকৃত সম্পূর্ণ সংঘবদ্ধ টিএলবি বর্ণনা করবে। মনে রাখবেন যে অন্যান্য ক্যাশেগুলির মতো, বাস্তব টিএলবি সাধারণত পুরোপুরি সংঘবদ্ধ হয় না।
প্রাথমিক অভিযান
রৈখিক এবং শারীরিক ঠিকানার মধ্যে অনুবাদ হওয়ার পরে এটি টিএলবিতে সঞ্চিত হয়। উদাহরণস্বরূপ, 4 টি এন্ট্রি টিএলবি নিম্নলিখিত রাজ্যে শুরু হয়:
valid linear physical
------ ------- ---------
> 0 00000 00000
0 00000 00000
0 00000 00000
0 00000 00000
>
বর্তমান এন্ট্রি প্রতিস্থাপন করা নির্দেশ করে।
এবং কোনও পৃষ্ঠা লিনিয়ার ঠিকানাটি 00003
একটি প্রকৃত 00005
ঠিকায় অনুবাদ করার পরে , টিএলবি পরিণত হয়:
valid linear physical
------ ------- ---------
1 00003 00005
> 0 00000 00000
0 00000 00000
0 00000 00000
এবং একটি দ্বিতীয় অনুবাদ পর 00007
থেকে 00009
এটা হয়ে:
valid linear physical
------ ------- ---------
1 00003 00005
1 00007 00009
> 0 00000 00000
0 00000 00000
এখন যদি 00003
আবার অনুবাদ করার দরকার হয় তবে হার্ডওয়্যার প্রথমে টিএলবি সন্ধান করে এবং একক র্যাম অ্যাক্সেস সহ এর ঠিকানাটি সন্ধান করে 00003 --> 00005
।
অবশ্যই, 00000
টিএলবিতে নেই যেহেতু কোনও বৈধ প্রবেশিকাতে 00000
কী হিসাবে নেই।
প্রতিস্থাপন নীতি
যখন টিএলবি পূর্ণ হয়, পুরানো ঠিকানাগুলি ওভাররাইট করা হয়। ঠিক সিপিইউ ক্যাশের মতো, প্রতিস্থাপনের নীতিটি একটি সম্ভাব্য জটিল অপারেশন, তবে সর্বাধিক ব্যবহৃত ব্যবহৃত প্রবেশ (এলআরইউ) সরিয়ে ফেলা সহজ এবং যুক্তিসঙ্গত হিউরিস্টিক।
রাষ্ট্র থেকে শুরু করে এলআরইউ সহ:
valid linear physical
------ ------- ---------
> 1 00003 00005
1 00007 00009
1 00009 00001
1 0000B 00003
যোগ করা 0000D -> 0000A
দেবে:
valid linear physical
------ ------- ---------
1 0000D 0000A
> 1 00007 00009
1 00009 00001
1 0000B 00003
ক্যাম
টিএলবি ব্যবহার করে অনুবাদটি দ্রুততর হয়, কারণ প্রাথমিক অনুবাদটি টিএলবি স্তরের প্রতি একটি অ্যাক্সেস নেয় , যার অর্থ একটি সাধারণ 32 বিট স্কিমের 2, তবে 64 বিট আর্কিটেকচারে 3 বা 4 4
টিএলবি সাধারণত ব্যয়বহুল ধরণের র্যাম হিসাবে প্রয়োগ করা হয় যাকে বলা হয় সামগ্রী-ঠিকানাযোগ্য মেমরি (সিএএম)। সিএএম হার্ডওয়্যারে একটি সহযোগী মানচিত্র প্রয়োগ করে, এটি একটি কাঠামো যা একটি কী (লিনিয়ার ঠিকানা) দেয়, একটি মান পুনরুদ্ধার করে।
ম্যাপিংগুলি র্যাম ঠিকানাগুলিতেও প্রয়োগ করা যেতে পারে, তবে সিএএম ম্যাপিংয়ের জন্য র্যাম ম্যাপিংয়ের চেয়ে অনেক কম এন্ট্রি প্রয়োজন হতে পারে।
উদাহরণস্বরূপ, একটি মানচিত্র যা:
- কী এবং মান উভয়েরই 20 টি বিট থাকে (একটি সাধারণ পেজিং স্কিমের ক্ষেত্রে)
- প্রতিটি সময়ে সর্বাধিক 4 টি মান সংরক্ষণ করা দরকার
4 টি এন্ট্রি সহ একটি টিএলবিতে সংরক্ষণ করা যেতে পারে:
linear physical
------- ---------
00000 00001
00001 00010
00010 00011
FFFFF 00000
তবে র্যামের সাহায্যে এটি বাস্তবায়নের জন্য 2 to 20 ঠিকানা থাকা প্রয়োজন :
linear physical
------- ---------
00000 00001
00001 00010
00010 00011
... (from 00011 to FFFFE)
FFFFF 00000
যা কোনও টিএলবি ব্যবহারের চেয়ে আরও ব্যয়বহুল হবে।
অবৈধ এন্ট্রি
যখন cr3
পরিবর্তন হয়, সমস্ত টিএলবি এন্ট্রি অবৈধ হয়, কারণ একটি নতুন প্রক্রিয়ার জন্য একটি নতুন পৃষ্ঠার টেবিল ব্যবহৃত হতে চলেছে, সুতরাং এটি পুরানো এন্ট্রিগুলির কোনও অর্থ রাখার সম্ভাবনা কম।
X86 এমন invlpg
নির্দেশও দেয় যা স্পষ্টভাবে একটি একক টিএলবি প্রবেশকে অবৈধ করে। অন্যান্য আর্কিটেকচারগুলি অবৈধ টিএলবি এন্ট্রিগুলিকে আরও বেশি নির্দেশাবলীর প্রস্তাব দেয় যেমন প্রদত্ত পরিসরে সমস্ত প্রবেশিকা অবৈধ করে।
কিছু x86 সিপিইউ x86 নির্দিষ্টকরণের প্রয়োজনীয়তার বাইরে চলে যায় এবং পৃষ্ঠার টেবিল এন্ট্রিটি সংশোধন করে এবং এটি ব্যবহার করার মধ্যে, যখন এটি ইতিমধ্যে টিএলবিতে ক্যাশে করা হয় নি তখন এটির গ্যারান্টি থেকে আরও সুসংগততা সরবরাহ করে । স্পষ্টতই উইন্ডোজ 9 এক্স নির্ভুলতার জন্য এটির উপর নির্ভর করেছিল, তবে আধুনিক এএমডি সিপিইউগুলি সুসংগত পৃষ্ঠ-ওয়াক সরবরাহ করে না। ইন্টেল সিপিইউগুলি করে, যদিও তাদের এটি করতে ভুল অনুমানগুলি সনাক্ত করতে হবে। এর সদ্ব্যবহার করা সম্ভবত একটি খারাপ ধারণা, যেহেতু সম্ভবত লাভ করার মতো খুব বেশি কিছুই নেই, এবং সূক্ষ্ম সময়-সংবেদনশীল সমস্যা সৃষ্টি করার একটি বড় ঝুঁকি যা ডিবাগ করা কঠিন।
লিনাক্স কার্নেলের ব্যবহার
লিনাক্স কার্নেল x86 এর পেজিং বৈশিষ্ট্যগুলির বৃহত ব্যবহার করে যাতে ছোট ডেটা বিভাজন সহ দ্রুত প্রক্রিয়া পরিবর্তন করতে পারে allow
ভিতরে v4.2
, নীচে দেখুন arch/x86/
:
include/asm/pgtable*
include/asm/page*
mm/pgtable*
mm/page*
পৃষ্ঠাগুলি উপস্থাপনের জন্য কোনও স্ট্রাক্ট সংজ্ঞায়িত করা হয়নি বলে মনে হচ্ছে, কেবল ম্যাক্রোস: include/asm/page_types.h
বিশেষ আকর্ষণীয়। অংশ:
#define _PAGE_BIT_PRESENT 0 /* is present */
#define _PAGE_BIT_RW 1 /* writeable */
#define _PAGE_BIT_USER 2 /* userspace addressable */
#define _PAGE_BIT_PWT 3 /* page write through */
arch/x86/include/uapi/asm/processor-flags.h
সংজ্ঞা দেয় CR0
, এবং বিশেষত PG
বিট অবস্থান:
#define X86_CR0_PG_BIT 31 /* Paging */
গ্রন্থাগার
বিনামূল্যে:
অ-মুক্ত: