ভার্চুয়াল অ্যাড্রেস স্পেসে পৃষ্ঠা আকারটি কীভাবে নির্ধারিত হয়?


43

লিনাক্স একটি ভার্চুয়াল মেমরি সিস্টেম ব্যবহার করে যেখানে সমস্ত ঠিকানাগুলি ভার্চুয়াল ঠিকানা নয় শারীরিক ঠিকানা। এই ভার্চুয়াল ঠিকানাগুলি প্রসেসরের মাধ্যমে শারীরিক ঠিকানাগুলিতে রূপান্তরিত হয়।

এই অনুবাদটিকে আরও সহজ করার জন্য ভার্চুয়াল এবং শারীরিক স্মৃতি পৃষ্ঠাগুলিতে বিভক্ত। এই পৃষ্ঠাগুলির প্রতিটি একটি অনন্য নম্বর দেওয়া হয়; পৃষ্ঠা ফ্রেম নম্বর।

কিছু পৃষ্ঠার আকার 2 কেবি, 4 কেবি ইত্যাদি হতে পারে তবে এই পৃষ্ঠার আকারের সংখ্যাটি কীভাবে নির্ধারিত হয়? এটি কি স্থাপত্যের আকার দ্বারা প্রভাবিত? উদাহরণস্বরূপ, একটি 32-বিট বাসে 4 জিবি ঠিকানার স্থান থাকবে।

উত্তর:


56

getconfকমান্ডের মাধ্যমে সিস্টেমের কনফিগারেশনটি জিজ্ঞাসা করে আপনি সিস্টেমের ডিফল্ট পৃষ্ঠার আকারটি খুঁজে পেতে পারেন :

$ getconf PAGE_SIZE
4096

অথবা

$ getconf PAGESIZE
4096

দ্রষ্টব্য: উপরের ইউনিটগুলি সাধারণত বাইটে হয় তাই 4096 সমতুল্য 4096 বাইট বা 4 কেবি হয়।

এটি এখানে লিনাক্স কার্নেলের উত্সটিতে শক্ত রয়েছে:

উদাহরণ

$ more /usr/src/kernels/3.13.9-100.fc19.x86_64/include/asm-generic/page.h
...
...
/* PAGE_SHIFT determines the page size */

#define PAGE_SHIFT  12
#ifdef __ASSEMBLY__
#define PAGE_SIZE   (1 << PAGE_SHIFT)
#else
#define PAGE_SIZE   (1UL << PAGE_SHIFT)
#endif
#define PAGE_MASK   (~(PAGE_SIZE-1))

স্থানান্তর কীভাবে আপনাকে 4096 দেয়?

আপনি যখন বিট নামান, আপনি একটি বাইনারি গুণ 2. সুতরাং দ্বারা কার্যকর বিট একটি নাড়াচাড়া বাঁদিকে (সম্পাদন করছি 1 << PAGE_SHIFT) 2 ^ 12 = 4096 গুণ করছে।

$ echo "2^12" | bc
4096

2
আধুনিক হার্ডওয়্যার 2MB, এবং কিছু 1GB, পৃষ্ঠাগুলি সমর্থন করে। "PAGE_SHIFT" কে 2MB পৃষ্ঠাগুলির জন্য কার্নেল বিল্ডের জন্য ডিফল্ট হিসাবে 21 এ সেট করা যেতে পারে?
রিভার্সফ্লো

2
@ রিভার্সফ্লো এই জাতীয় প্রশ্নের উত্তর পেতে আমি একটি পৃথক প্রশ্ন জিজ্ঞাসা করব।
কিরিল বুলিগিন 11

@ সিম, ভাবছেন এখানে বিট কারচুপির ব্যবহার কেন? আমি পড়েছি যে সংকলক সাধারণত গুণগুলি বিট ম্যানিপুলেশনে রূপান্তর করে, তাই একই কর্মক্ষমতা দেয়।
ইনএফ্ল্যাশ

17

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

প্রায় সমস্ত আর্কিটেকচার 4kB পৃষ্ঠার আকারকে সমর্থন করে। কিছু আর্কিটেকচার বড় পৃষ্ঠাগুলি সমর্থন করে (এবং কয়েকটি ছোট পৃষ্ঠাগুলিও সমর্থন করে) তবে 4 কেবি খুব বিস্তৃত ডিফল্ট।

লিনাক্স দুটি পৃষ্ঠার আকার সমর্থন করে:

  • স্বাভাবিক আকারের পৃষ্ঠা, যা আমি বিশ্বাস করি, সব আর্কিটেকচারের ডিফল্টরূপে 4 KB যদিও কয়েকটি আর্কিটেকচার অন্যান্য মান অনুমতি, উপর যেমন 16kB ARM64 বা 8kB, 16kB বা 64kB উপর ia64 । এগুলি এমএমইউ (যা লিনাক্স পিটিই বলে ডাকে ) এর গভীর স্তরের বর্ণনাকারীর সাথে মিলে যায় ।
  • বিশাল পৃষ্ঠাগুলি , যদি সংকলিত হয় (তবে CONFIG_HUGETLB_PAGEএটি প্রয়োজনীয় এবং CONFIG_HUGETLBFSবেশিরভাগ ব্যবহারের জন্য)। এটি এমএমইউ বর্ণনাকারীদের দ্বিতীয়-গভীর স্তরের (যা লিনাক্স পিএমডি বলে) এর সাথে সামঞ্জস্য করে (বা কমপক্ষে এটি সাধারণত করে তোলে, আমি জানি না যে এটি সমস্ত আর্কিটেকচারের মধ্যে রয়েছে কিনা)।

পৃষ্ঠার আকার মেমরির ব্যবহার, মেমরির ব্যবহার এবং গতির মধ্যে একটি আপস।

  • বৃহত্তর পৃষ্ঠার আকারের অর্থ যখন কোনও পৃষ্ঠা আংশিকভাবে ব্যবহৃত হয় তখন আরও অপচয় হয়, সুতরাং সিস্টেমটি মেমরির ক্ষতির বাইরে চলে যায়।
  • একটি গভীর এমএমইউ বর্ণনাকারী স্তরের অর্থ পৃষ্ঠা টেবিলগুলির জন্য আরও কার্নেল মেমরি।
  • একটি গভীর এমএমইউ বর্ণনাকারী স্তরের অর্থ পৃষ্ঠা সারণী ট্র্যাভারসালগুলিতে বেশি সময় ব্যয় করা।

বেশিরভাগ অ্যাপ্লিকেশনের জন্য বৃহত পৃষ্ঠার আকারগুলির লাভ খুব সামান্য, তবে ব্যয়টি যথেষ্ট। এ কারণেই বেশিরভাগ সিস্টেমগুলি কেবলমাত্র সাধারণ আকারের পৃষ্ঠা ব্যবহার করে use

getconfইউটিলিটি বা সি ফাংশন সহ আপনি আপনার সিস্টেমে (সাধারণ) পৃষ্ঠার আকারটি জিজ্ঞাসা করতে পারেন sysconf

$ getconf PAGE_SIZE
4096

বিশাল পৃষ্ঠাগুলি ব্যবহারের জন্য hugetlbfsফাইল সিস্টেমটি মাউন্ট করা এবং mmapসেখানে ফাইলগুলি পিং করা প্রয়োজন ।


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

এটি সত্যই মৌলিক উত্তর। লিনাক্স কেবলমাত্র পেজিং হার্ডওয়্যারটি ভালভাবে ব্যবহার করার জন্য তৈরি করা হয়েছে। পেজিং সম্পর্কে আরও বিশদ: স্ট্যাকওভারফ্লো
how-does-x86-paging-

0

পৃষ্ঠার আকারটি বেশিরভাগ প্রসেসরের আর্কিটেকচারের উপর নির্ভর করে। X86-এ, সুরক্ষিত মোড প্রবর্তনকারী 386 প্রসেসরের সময় থেকে, পৃষ্ঠার আকার 4 কেবি হয়েছে।

X64 মোডে, বিশাল আকারের পৃষ্ঠাগুলিও হতে পারে, যা 2 এমবি আকারের। তবে এগুলি ব্যবহার করা কিছুটা জটিল।

আপনি উইকিপিডিয়া নিবন্ধে পৃষ্ঠা আকারের আরও তথ্য পেতে পারেন


0

প্রসেসর উপলব্ধ পৃষ্ঠার আকার নির্ধারণ করে। বেশিরভাগ উদ্দেশ্যে, x86 এবং x86_64 প্রসেসরের হার্ডওয়্যার প্রয়োগ করা পৃষ্ঠার আকার 4kb। তবে অপারেটিং সিস্টেমটি চাইলে একবারে একাধিক পৃষ্ঠা বরাদ্দ করতে পারে এবং এর মাধ্যমে সফ্টওয়্যারটিতে 8 কেবি, 16 কেবি বা 32 কেবি পৃষ্ঠা কার্যকরভাবে প্রয়োগ করতে পারে।

X86 এবং x86_64 প্রসেসর যথাক্রমে স্ট্যান্ডার্ড 4kb পৃষ্ঠাগুলির সাথে 4 এমবি এবং 2 এমবি পৃষ্ঠাগুলিও অন্তর্নির্মিত করতে পারে। যদি সেই ক্ষমতাটি ব্যবহার করা হয় তবে এটি বেশিরভাগ ক্ষেত্রে কার্নেল স্পেস বরাদ্দ করতে ব্যবহৃত হত।

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