X86 পেজিং কীভাবে কাজ করে?


92

এই প্রশ্নটি এই বিষয়ে ভাল ফ্রি তথ্যের শূন্যস্থান পূরণ করার জন্য।

আমি বিশ্বাস করি যে একটি ভাল উত্তর একটি বড় এসও উত্তর বা কমপক্ষে কয়েকটি উত্তরের সাথে খাপ খায়।

মূল লক্ষ্যটি হ'ল সম্পূর্ণ প্রাথমিকভাবে কেবল পর্যাপ্ত তথ্য দেওয়া যাতে তারা নিজেরাই ম্যানুয়ালটি নিতে পারে এবং পেজিং সম্পর্কিত বেসিক ওএস ধারণাগুলি বুঝতে সক্ষম হয়।

প্রস্তাবিত নির্দেশিকা:

  • উত্তরগুলি প্রাথমিকভাবে বন্ধুত্বপূর্ণ হওয়া উচিত:
    • কংক্রিট, তবে সম্ভবত সরলীকৃত উদাহরণগুলি খুব গুরুত্বপূর্ণ
    • প্রদর্শিত ধারণাগুলির প্রয়োগগুলি স্বাগত
  • দরকারী সংস্থান উদ্ধৃত করা ভাল
  • ওএসগুলি কীভাবে পেজিং বৈশিষ্ট্যগুলি ব্যবহার করে সে সম্পর্কে ছোটখাটো অভিভাবকরা স্বাগত
  • পিএই এবং পিএসইর ব্যাখ্যাগুলি স্বাগত
  • x86_64 এ ছোট ডিগ্রিশনগুলি স্বাগত

সম্পর্কিত প্রশ্ন এবং কেন আমি মনে করি তারা দুগ্ধ নয়:


4
এটি "FAQ" ট্যাগ হওয়া উচিত এবং "সম্প্রদায়-উইকি" হিসাবে চিহ্নিত করা উচিত।
কেরেক এসবি

@ কেরেকএসবি এই ধরণের প্রশ্ন কীভাবে পরিচালনা করতে হয় তা আমি সত্যিই জানি না। উত্তরগুলি সম্প্রদায়ের উইকিস হওয়া উচিত এটি কি? আমি একটি faqট্যাগ খুঁজে পাইনি ।
সিরো সান্তিলি 郝海东 冠状 病 六四 事件

4
আমি বলব সংক্ষিপ্ত উত্তরটি হ'ল " ভলিউম 3, অধ্যায় 4 পড়ুন: ইন্টেল ম্যানুয়ালে পেজিং "। এটি বেশ স্পষ্ট, সংক্ষিপ্ত এবং ভাল-লিখিত এবং এটি আর কোনও প্রামাণিক হয় না।
কেরেরেক এসবি

4
@ কেরেকএসবি আমি একমত যে ম্যানুয়ালটি স্পষ্ট এবং প্রামাণিক, তবে এটি আমার প্রথম পড়া হিসাবে কিছুটা কঠোর ছিল, জিনিসগুলি আরও ভালভাবে বোঝার জন্য আমার কিছু সাধারণ এবং দৃ concrete় উদাহরণ + যৌক্তিক প্রয়োজন।
সিরো সান্তিলি :17 冠状 病 六四 事件 法轮功

উত্তর:


144

একটি উত্তম টিওসি এবং আরও সামগ্রী সহ এই উত্তরের সংস্করণ

আমি রিপোর্ট করা ত্রুটি সংশোধন করব। আপনি যদি বৃহত পরিবর্তন করতে চান বা কোনও অনুপস্থিত দিক যুক্ত করতে চান তবে ভাল উত্তর পাওয়ার জন্য নিজের উত্তরগুলিতে এগুলি তৈরি করুন। গৌণ সম্পাদনাগুলি সরাসরি একত্রিত হতে পারে।

কোডের উদাহরণ

সর্বনিম্ন উদাহরণ: 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 টি বিটগুলির প্রয়োজন, হার্ডওয়্যার ডিজাইনার সম্ভবত অ্যাক্সেসটি দ্রুততর করতে পছন্দ করবেন এবং পরবর্তী ব্যবহারের জন্য বাকী বিটগুলি কেবল সংরক্ষণ করুন। LX86 এর জন্য আসল মান 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 */

গ্রন্থাগার

বিনামূল্যে:

  • rutgers-pxk-416 অধ্যায় "মেমরি পরিচালনা: বক্তৃতা নোট"

    পুরানো ওএস দ্বারা ব্যবহৃত স্মৃতি সংস্থা কৌশলগুলির ভাল Goodতিহাসিক পর্যালোচনা।

অ-মুক্ত:

  • bovet05 অধ্যায় "স্মৃতি সম্বোধন"

    X86 মেমরি ঠিকানার যুক্তিসঙ্গত পরিচয়। কিছু ভাল এবং সাধারণ উদাহরণ মিস করছি।


দুর্দান্ত উত্তর, তবে এলআরইউ কীভাবে সিদ্ধান্ত নেওয়া হয় সে সম্পর্কে আমি এখনও অস্পষ্ট। এমআরইউ ব্যতীত অন্য কোনও পৃষ্ঠা অ্যাক্সেস করা হলে প্রতিবার ওএস চালু করা ব্যয়বহুল বলে মনে হয়। পর্যায়ক্রমে আমি দেখতে পেলাম যে হার্ডওয়্যারটি এলআরইউর জন্য পৃষ্ঠা টেবিলটিকে পুনরায় সাজিয়েছে, যা সমবর্তী প্রোগ্রামগুলির জন্য বিপজ্জনক হতে পারে। এর মধ্যে দুটিই কি সঠিক? কোনও পৃষ্ঠা ত্রুটি দেখা দিলে ওএস কীভাবে জানতে পারে যে কোন পৃষ্ঠাটি এলআরইউ?
কেইনান

@ কেয়নান আমি মনে করি এটি এমন হার্ডওয়্যার যা এটি করে, তাই সময় নেওয়া কোনও উদ্বেগ নয়। সম্মতি হিসাবে আমি জানি না এটি কীভাবে পরিচালিত হয়। আমি মনে করি প্রসেসর প্রতি একটি সিআর 3 এবং ক্যাশে রয়েছে এবং ওএসের অবশ্যই মেমোরি পৃষ্ঠাগুলি যাতে ওভারল্যাপ না হয় তা নিশ্চিত করা উচিত।
সিরো সান্তিলি :4 冠状 病 六四 事件 法轮功

4
real TLBs are not usually fully associativeThe TLB is usually implemented as … CAMএই দুটি বক্তব্য কি পরস্পরবিরোধী নয়?
a3f

>>> x86_64 একটি 9 | 4 টি স্তর ব্যবহার করে 9 | 9 | 12 স্কিম এটি 9 হওয়া উচিত 9 | 9 | 9 | 12?
monklof

@ মোমোক্লোফ আমার মনে হয় এটি সঠিক: 9 9 9 12 ইতিমধ্যে 512 জিবি র‌্যামের অনুমতি দেয়। 5 স্তরের স্কিমটি কেবলমাত্র সার্ভারগুলিকে লক্ষ্য করে আরও সাম্প্রতিক বিকাশ, এটি আমার ওয়েবসাইটের উত্তরে উল্লেখ করা হয়েছে যা আপ টু ডেট।
সিরো সান্তিলি 郝海东 冠状 病 六四 事件 法轮功

22

এখানে একটি খুব সংক্ষিপ্ত, উচ্চ-স্তরের উত্তর:

একটি x86 প্রসেসর বিভিন্ন সম্ভাব্য মোডগুলির মধ্যে একটিতে চালিত হয় (মোটামুটি: বাস্তব, সুরক্ষিত, 64-বিট)) প্রতিটি মোড একাধিক সম্ভাব্য মেমরি অ্যাড্রেসিং মডেল ব্যবহার করতে পারে (তবে প্রতিটি মোড প্রতিটি মডেল ব্যবহার করতে পারে না), যেমন: রিয়েল-মোড অ্যাড্রেসিং, সেগমেন্টেড অ্যাড্রেসিং এবং ফ্ল্যাট-লিনিয়ার অ্যাড্রেসিং।

আধুনিক বিশ্বে সুরক্ষিত বা 64৪-বিট মোডে কেবল ফ্ল্যাট-লিনিয়ার সম্বোধনই প্রাসঙ্গিক এবং দুটি মোড মূলত একইরকম, মূল পার্থক্যটি মেশিন শব্দের আকার এবং এইভাবে স্মরণে রাখার মতো পরিমাণ।

এখন, মেমরি অ্যাড্রেসিং মোডটি মেশিনের নির্দেশাবলী (যেমন mov DWORD PTR [eax], 25, যা 32-বিট রেজিস্টারে dwordসংরক্ষিত আছে যার মেমরিতে 25 মানের একটি 32-বিট (ওরফে ) পূর্ণসংখ্যা সংরক্ষণ করে) এর অর্থ দেয় opera eaxফ্ল্যাট লিনিয়ার অ্যাড্রেসিংয়ে, এই সংখ্যাটি eaxশূন্য থেকে সর্বোচ্চ মান পর্যন্ত (এক্ষেত্রে আমাদের ক্ষেত্রে 2 32  - 1) একক, সংলগ্ন পরিসীমাতে চলার অনুমতি দেওয়া হয় ।

যাইহোক, ফ্ল্যাট রৈখিক অ্যাড্রেসিং পারেন যাবে পেজড বা পেজড না । পেজিং ছাড়াই ঠিকানাটি সরাসরি শারীরিক স্মৃতিতে বোঝায়। সঙ্গে পেজিং, প্রসেসর স্মৃতিতে ম্যানেজমেন্ট ইউনিট (অথবা MMU) স্বচ্ছভাবে আকাঙ্ক্ষিত ঠিকানা (এখন একটি নামক ফিড ভার্চুয়াল অ্যাড্রেস ) একটি লুকআপ প্রক্রিয়া, তথাকথিত মধ্যে পেজ তালিকা , এবং একটি নতুন মান, যা একটি প্রকৃত ঠিকানা হিসেবে ব্যাখ্যা করা হয় সংগ্রহ করে। আসল অপারেশনটি এখন শারীরিক স্মৃতিতে এই নতুন, অনুবাদকৃত ঠিকানার উপর পরিচালিত হয়, যদিও ব্যবহারকারী কেবল ভার্চুয়াল ঠিকানাটি দেখেন।

পেজিংয়ের মূল সুবিধাটি হ'ল পৃষ্ঠাগুলি অপারেটিং সিস্টেম দ্বারা পরিচালিত হয়। সুতরাং অপারেটিং সিস্টেম পৃষ্ঠা সারণিগুলি নির্বিচারে সংশোধন ও প্রতিস্থাপন করতে পারে, যেমন "যখন স্যুইচিংয়ের কাজগুলি"। এটি পৃষ্ঠার টেবিলগুলির একটি সম্পূর্ণ সংগ্রহ রাখতে পারে, প্রতিটি "প্রক্রিয়া" এর জন্য একটি, এবং যখনই এটি স্থির করে যে কোনও নির্দিষ্ট প্রক্রিয়া প্রদত্ত সিপিইউতে চলছে, এটি প্রক্রিয়াটির পৃষ্ঠা সারণীগুলি সেই সিপিইউয়ের এমএমইউতে লোড করে দেয় (প্রতিটি সিপিইউর নিজস্ব রয়েছে) পৃষ্ঠার সারণির সেট)। ফলাফলটি হ'ল প্রতিটি প্রক্রিয়া তার নিজস্ব ভার্চুয়াল অ্যাড্রেস স্পেস দেখতে পাবে যা ওএসের জন্য মেমরি বরাদ্দ করতে হয়েছিল যখন শারীরিক পৃষ্ঠাগুলি বিনামূল্যে ছিল তা নির্বিশেষে একই দেখাচ্ছে। এটি অন্য কোনও প্রক্রিয়ার স্মৃতি সম্পর্কে কখনই জানে না, কারণ এটি সরাসরি শারীরিক স্মৃতি অ্যাক্সেস করতে পারে না।

পৃষ্ঠার টেবিলগুলি নেস্টেড ট্রি-জাতীয় ডেটা স্ট্রাকচারগুলি সাধারণ মেমোরিতে সংরক্ষিত থাকে, ওএস দ্বারা লিখিত হয় তবে সরাসরি হার্ডওয়্যার দ্বারা পড়ে, তাই ফর্ম্যাটটি স্থির হয়ে গেছে। তারা শীর্ষ-স্তরের টেবিলের দিকে ইঙ্গিত করার জন্য একটি বিশেষ সিপিইউ নিয়ন্ত্রণ রেজিস্ট্রার সেট করে এমএমইউতে "লোড" হয়েছেন। সিপিইউ লকআপগুলি মনে রাখার জন্য টিএলবি নামক একটি ক্যাশে ব্যবহার করে, তাই টিএলবি-মিস কারণগুলির পাশাপাশি সাধারণ ডেটা ক্যাশের কারণগুলির জন্য একই কয়েকটি পৃষ্ঠায় বারবার অ্যাক্সেসগুলি বিক্ষিপ্ত অ্যাক্সেসের চেয়ে অনেক দ্রুত are "টিএলবি এন্ট্রি" শব্দটি টিএলবিতে ক্যাশে না থাকা সত্ত্বেও পৃষ্ঠার সারণি এন্ট্রিগুলিকে উল্লেখ করার জন্য ব্যবহৃত শব্দটি দেখতে পাওয়া যায় সাধারণ।

এবং আপনি যদি উদ্বেগ প্রকাশ করেন যে কোনও প্রক্রিয়া কেবলমাত্র পেজিং নিষ্ক্রিয় করতে পারে বা পৃষ্ঠার টেবিলগুলিকে সংশোধন করতে পারে: এটি অনুমোদিত নয়, যেহেতু x86 সুবিধাগুলি স্তর প্রয়োগ করে ("রিংগুলি" বলা হয়), এবং ব্যবহারকারী কোডটি একটি বিশেষাধিকার স্তরে কার্যকর করা হয় যা অনুমতি দেওয়ার তুলনায় খুব কম এটি সিপিইউর পৃষ্ঠাগুলি পরিবর্তন করতে পারে to

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.