কার্নেল এমএম্যাপ ক্রিয়াকলাপের জন্য মেমরির আকার


9

আমি লিনাক্স এমএম্যাপ ফাইলগুলিকে যেভাবে প্রধান মেমোরিতে নিয়ে যায় (আমার প্রসঙ্গে এটি কার্যকর করার জন্য, তবে আমি অনুমান করি এমএমএপি প্রক্রিয়াটিও লেখার জন্য এবং পড়ার ক্ষেত্রে একই) এবং এটি কোন আকার ব্যবহার করে।

সুতরাং আমি জানি যে লিনাক্স সাধারণত 4 কেবি পৃষ্ঠার আকারের পেজিং ব্যবহার করে (কার্নেলের মধ্যে আমি এই আকারটি কোথায় খুঁজে পাব?) বরাদ্দকৃত স্মৃতিটির জন্য এর অর্থ কী: ধরুন আপনার কাছে কয়েকটি থোন্সড বাইটের আকারের বাইনারি রয়েছে, কেবল 5812 বি বলতে দিন এবং আপনি এটি সম্পাদন করুন। কার্নেলের মধ্যে কী ঘটে: এটি 2 * 4 কেবি বরাদ্দ করে তারপরে 5812B কে এই স্পেসে অনুলিপি করে> ২ য় পৃষ্ঠায় প্রধান মেমরির নষ্ট করে?

কার্নেল উত্সে যেখানে পৃষ্ঠাগুলি সংজ্ঞায়িত করা হয়েছে সেই ফাইলটি যদি কেউ জানত তবে এটি দুর্দান্ত হবে।

আমার 2 য় প্রশ্নটিও খুব সহজ আমার ধারণা: আমি 5812 বি ফাইলাইজ হিসাবে ধরে নিয়েছি। ঠিক কি, এই আকারটি কেবল ইনোড থেকে নেওয়া হয়েছে?

উত্তর:


6

এক্সিকিউটেবলের আকার এবং মেমরির আকারের মধ্যে সরাসরি সম্পর্ক নেই। বাইনারি কার্যকর করা হয় তখন কী ঘটে যায় তার একটি খুব দ্রুত ওভারভিউ এখানে দেওয়া হয়েছে:

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

এক্সিকিউটেবল ফর্ম্যাট, লিঙ্কিং এবং এক্সিকিউটেবল লোডিং সম্পর্কে আরও তথ্যের জন্য, আপনি জন আর। লেভিনের লিঙ্কারস এবং লোডারগুলি পড়তে পারেন ।

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

লিনাক্সের অধীনে, আপনি এক্সিকিউটেবলের সাথে মেমরি ম্যাপিংগুলি পরিদর্শন করতে পারেন cat /proc/$pid/maps। ফর্ম্যাটটি proc(5)ম্যান পৃষ্ঠাতে নথিভুক্ত করা হয়েছে ; আরো দেখুন লিনাক্স জন্য / proc / আইডি বোঝা / মানচিত্র


0

হ্যাঁ: আপনি অবশেষে দুটি 4k পৃষ্ঠা পাবেন। ডেটা চাহিদা অনুযায়ী লোড করা হয়, তাই যদি কখনও কখনও দ্বিতীয় পৃষ্ঠার উল্লেখ না করে তবে এটি কখনই মেমরিতে লোড হবে না।

include/asm-i386/param.h:#define EXEC_PAGESIZE  4096
include/asm-i386/elf.h:#define ELF_EXEC_PAGESIZE        4096

এই মানগুলি পরিবর্তন করবেন না এবং কিছু কাজের আশা করবেন না।

হ্যাঁ, ফাইলের আকারটি ইনোডে ext2 / 3 এ সংরক্ষণ করা হয়।


0

সংজ্ঞা অংশের জন্য, ইন্টেল আর্কিটেকচারের জন্য একটি 2.6.38 ~ ইশ কর্নেলে:

খিলান /, x86 / অন্তর্ভুক্ত / এ এস এম / page_types.h:

/ * PAGE_SHIFT পৃষ্ঠার আকার নির্ধারণ করে * /

#PAGE_SHIFT 12 নির্দিষ্ট করুন

# নির্দিষ্ট PAGE_SIZE (_AC (1, উল) << PAGE_SHIFT)

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