লিনাক্সে হাই মেমরি এবং লো মেমোরি কী?


92

আমি হাইমেম এবং লোমেমের মধ্যে পার্থক্যে আগ্রহী:

  1. কেন এমন পার্থক্য আছে?
  2. তা করে আমরা কী লাভ করব?
  3. প্রতিটি বৈশিষ্ট্য কি আছে?

@ হিরো, আপনি ldd3 দ্বারা বর্ণিত হিসাবে "HIGHMEM" হ'ল "কার্নেল ভার্চুয়াল ঠিকানা" mean আমি আপনার সাথে একমত. এটি বিভ্রান্তিকর, ldd3 সংজ্ঞায়িত "LOWMEM" "HIGHMEM", এছাড়াও "কার্নেল ভার্চুয়াল ঠিকানা" "কার্নেল লজিক ঠিকানা" সংজ্ঞায়িত করা হয়েছে। তারা একই জিনিস, কিন্তু বিভিন্ন নাম আছে। এটি সফ্টওয়্যারটির "সৌন্দর্য", এটি এতই বর্ণন-ভাষা-নির্ভর।
স্টিভ 0

উত্তর:


69

একটি 32-বিট আর্কিটেকচারে, র্যামের ঠিকানা দেওয়ার জন্য ঠিকানা স্থানের সীমাটি হ'ল:

0x00000000 - 0xffffffff

বা 4'294'967'295(4 জিবি)।

লিনাক্স কার্নেলটি যথাক্রমে ব্যবহারকারীর স্পেস (উচ্চ মেমরি) এবং কার্নেল স্পেসে (কম মেমোরি) 3/1 (আরও 2/2, বা 1/3 1 হতে পারে ) পর্যন্ত বিভক্ত হয়।

ব্যবহারকারীর স্থান পরিসর:

0x00000000 - 0xbfffffff

প্রতিটি নতুন প্রসারিত ব্যবহারকারী প্রক্রিয়া এই অঞ্চলের ভিতরে একটি ঠিকানা (পরিসর) পায়। ব্যবহারকারীর প্রক্রিয়াগুলি সাধারণত অবিশ্বস্ত থাকে এবং তাই কার্নেল স্থান অ্যাক্সেস করতে নিষেধ করা হয়। তদতিরিক্ত, এগুলিকে অ-জরুরি হিসাবে বিবেচনা করা হয়, একটি সাধারণ নিয়ম হিসাবে, কার্নেল সেই প্রক্রিয়াগুলিতে মেমরির বরাদ্দকে স্থগিত করার চেষ্টা করে।

কার্নেল স্পেস রেঞ্জ:

0xc0000000 - 0xffffffff

একটি কার্নেল প্রক্রিয়াগুলি এখানে তার ঠিকানা (পরিসর) পায়। কার্নেলটি এই 1 জিবি ঠিকানাগুলিতে সরাসরি অ্যাক্সেস করতে পারে (ভাল, পুরো 1 জিবি নয়, উচ্চ মেমরির অ্যাক্সেসের জন্য 128 এমবি সংরক্ষিত আছে)।

কার্নেল স্পেসে প্রসেস করা প্রক্রিয়াগুলি বিশ্বস্ত, জরুরি এবং ধরে নেওয়া ত্রুটিমুক্ত, মেমরি অনুরোধটি তাত্ক্ষণিকভাবে প্রক্রিয়াজাত হয়ে যায়।

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


1 বিভাজনটি 3/1, 2/2, বা 1/3 CONFIG_VMSPLIT_...বিকল্প দ্বারা নিয়ন্ত্রিত কিনা ; /boot/config*আপনার কার্নেলের জন্য কোন বিকল্পটি নির্বাচিত হয়েছে তা দেখতে আপনি সম্ভবত এটি পরীক্ষা করতে পারেন ।


এটি পুরানো এবং আমি নিশ্চিত যে আপনি এখানে আছেন। তবে আমি একটি প্রশ্ন জিজ্ঞাসা করতে চাই: কার্নেল স্পেসে সংরক্ষিত 128 এমবি (উচ্চ স্মৃতি অ্যাক্সেসের জন্য), এটি কি ব্যবহারকারী-স্পেস মেমরির ক্ষেত্রের সমস্ত উল্লেখ? সুতরাং, কোনও কার্নেল প্রক্রিয়া এই অঞ্চলটি উল্লেখ করে যে কোনও ব্যবহারকারীর স্থান অ্যাক্সেস করতে পারে?
আমুমু

1
কেন এটি সর্বদা 1/4 এর মধ্যে থাকে? অর্থাৎ কেন এটি এটিকে 5/1 বা কিছু বিভক্ত করতে পারেনি?
মগলগস

এখানে "সরাসরি অ্যাক্সেস করতে পারে" এর অর্থ কী? আমার অর্থ, ভার্চুয়াল মেমরি প্রক্রিয়াটির মাধ্যমে কার্নেলটি নিজেই অ্যাক্সেস করা যায় না?
টেলেন

1
আমি বিশ্বাস করি যে আপনি উচ্চ / নিম্ন স্মৃতি সম্পর্কে যা বলছেন তা ভুল: আমি বিশ্বাস করি যে একটি খাঁটি 32 বিবিট সিস্টেমে কার্নেল সরাসরি 3 জিবি ব্যবহারকারীর স্থানটি অ্যাক্সেস করতে পারে (কার্নেল কার্নেলের স্থান এবং ব্যবহারকারীর স্থান অ্যাক্সেস করতে পারে)। তবে আপনার যখন পিএই কার্নেল জিনিসগুলি আরও জটিল হয়ে ওঠে, এখন আপনার কাছে 3 জিবি র‌্যাম রয়েছে, প্রতিটি প্রক্রিয়া 3 জিবি হতে পারে এবং আপনি সরাসরি ব্যবহারকারীর পুরো স্থান অ্যাক্সেস করতে পারবেন না। এখানেই হাই মেম এবং কার্নেল স্পেসে 128 এমবি মেমরি উপস্থিত হয় a৪ বিট কার্নেলের সাহায্যে এটি আবার সহজ হয়ে যায়, কোনও উচ্চ পুরুষ নেই, কারন থেকে সমস্ত ব্যবহারকারীর স্থান অ্যাক্সেসযোগ্য।
ctrl-alt-delor

2
@mgalgs ¼, 2/4 এবং ¾ হ'ল ডিফল্ট পছন্দগুলির একটি সেট যা প্রকাশিত হয়েছিল। 2007 সাল থেকে, কেউ 5/16 এবং 15/32 তমও নির্বাচন করতে পারে। আপনি যদি কোন # নির্দিষ্ট রেখাটি সম্পাদনা করতে জানেন তবে আপনি নিজের একটি প্রায় নির্বিচারে বিভাজন বেছে নিতে পারেন।
jørgensen

28

চালু করার প্রথম রেফারেন্সটি হ'ল লিনাক্স ডিভাইস ড্রাইভারস (অনলাইনে এবং বই আকারে উভয় উপলব্ধ), বিশেষত অধ্যায় 15 যার বিষয়টির একটি বিভাগ রয়েছে।

একটি আদর্শ বিশ্বে, প্রতিটি সিস্টেমের উপাদান এটির যে সমস্ত মেমরির অ্যাক্সেসের প্রয়োজন তা ম্যাপ করতে সক্ষম হবে। এবং এটি লিনাক্স এবং বেশিরভাগ অপারেটিং সিস্টেমে প্রসেসগুলির ক্ষেত্রে: 32-বিট প্রক্রিয়া কেবল ভার্চুয়াল মেমরির 2 ^ 32 বাইটের থেকে কিছুটা কম অ্যাক্সেস করতে পারে (আসলে একটি লিনাক্স 32-বিট আর্কিটেকচারে 3 জিবি সম্পর্কে)। কার্নেলের পক্ষে এটি শক্ত হয়ে ওঠে, যার সিস্টেমটি যে প্রক্রিয়াটিকে এটি সম্পাদন করছে তার পুরো মেমরির মানচিত্র তৈরি করতে সক্ষম হওয়া প্রয়োজন, পুরো শারীরিক মেমরির পাশাপাশি অন্য কোনও মেমরি-ম্যাপযুক্ত হার্ডওয়্যার ডিভাইস map

সুতরাং যখন কোনও 32-বিট কার্নেল 4GB এর বেশি মেমরির মানচিত্রের প্রয়োজন হয়, তখন এটি অবশ্যই উচ্চ মেমরির সমর্থন সহ সংকলন করতে হবে। উচ্চ মেমরি হ'ল মেমরি যা কার্নেলের ঠিকানার স্থানে স্থায়ীভাবে ম্যাপ করা হয় না। (কম স্মৃতি বিপরীত: এটি সর্বদা ম্যাপ করা থাকে, তাই আপনি কেবল পয়েন্টারকে ডিফারেন্স করে এটি কার্নেলের মধ্যে অ্যাক্সেস করতে পারেন))

আপনি যখন কার্নেল কোড থেকে উচ্চ মেমরি অ্যাক্সেস করেন, kmapপৃষ্ঠার ডেটা স্ট্রাকচার ( struct page) থেকে পয়েন্টার পাওয়ার জন্য আপনাকে প্রথমে কল করতে হবে । kmapপৃষ্ঠাটি উচ্চ বা কম স্মৃতিতে রয়েছে কিনা তা কল করা কাজ করে। এছাড়াও রয়েছে kmap_atomicযা বাধাগুলি যুক্ত করেছে তবে মাল্টিপ্রসেসর মেশিনে আরও দক্ষ কারণ এটি সূক্ষ্ম-দানযুক্ত লকিং ব্যবহার করে। এর মাধ্যমে প্রাপ্ত পয়েন্টারটি kmapএকটি সংস্থান: এটি ঠিকানার স্থান ব্যবহার করে। এটি শেষ করার পরে, আপনাকে অবশ্যই kunmap(বা kunmap_atomic) সেই সংস্থানটি মুক্ত করতে কল করতে হবে ; তারপরে পয়েন্টারটি আর বৈধ নয় এবং আপনি আর কল না করা পর্যন্ত পৃষ্ঠার সামগ্রীগুলি অ্যাক্সেস করা যাবে না kmap


2
উত্তরের জন্য গিলস ধন্যবাদ .. তবে, আমি এখনও পুরো ধারণাটি পেতে সক্ষম নই। আপনি কি দয়া করে এতে তথ্য হ্রাস না করে কিছুটা আরও সহজ হতে পারেন?
সেন

17

এটি লিনাক্স কার্নেলের সাথে প্রাসঙ্গিক; কোনও ইউনিক্স কার্নেল কীভাবে এটি পরিচালনা করে তা আমি নিশ্চিত নই।

হাই মেমরি হ'ল মেমোরির সেগমেন্ট যা ব্যবহারকারী-স্পেস প্রোগ্রামগুলি সম্বোধন করতে পারে। এটি লো মেমোরিটিকে স্পর্শ করতে পারে না।

লো মেমরি হ'ল মেমরির বিভাগ যা লিনাক্স কার্নেল সরাসরি সম্বোধন করতে পারে। যদি কার্নেলটি অবশ্যই উচ্চ মেমোরি অ্যাক্সেস করতে পারে তবে প্রথমে এটি নিজের নিজের ঠিকানা স্পেসে ম্যাপ করতে হবে।

সম্প্রতি একটি প্যাচ চালু হয়েছিল যা আপনাকে সেগমেন্টটি কোথায় তা নিয়ন্ত্রণ করতে দেয়। ট্রেডঅফটি হ'ল আপনি ব্যবহারযোগ্য স্থান থেকে দূরে অ্যাড্রেসযোগ্য মেমরি নিতে পারেন যাতে কার্নেলের আরও মেমরি থাকতে পারে যা ব্যবহার করার আগে এটির মানচিত্রের দরকার নেই।

অতিরিক্ত সম্পদ:


4

HIGHMEM কার্নেলের মেমরি স্পেসের একটি ব্যাপ্তি, তবে এটি আপনার অ্যাক্সেসের স্মৃতি নয় তবে এটি এমন একটি জায়গা যেখানে আপনি অ্যাক্সেস করতে চান সেখানে রেখে দেন।

একটি সাধারণ 32 বিট লিনাক্স ভার্চুয়াল মেমরি মানচিত্রটি হ'ল:

  • 0x00000000-0xbfffffff: ব্যবহারকারী প্রক্রিয়া (3 জিবি)

  • 0xc0000000-0xffffffff: কার্নেল স্পেস (1 জিবি)

(সিপিইউ-নির্দিষ্ট ভেক্টর এবং যা কিছু এখানে উপেক্ষা করা হয়)।

লিনাক্স 1 জিবি কার্নেল স্পেসকে 2 টুকরো, লওএমইএম এবং হাইটমেমে বিভক্ত করে। বিভাজন ইনস্টলেশন থেকে ইনস্টলেশন পর্যন্ত পরিবর্তিত হয়।

যদি কোনও ইনস্টলেশন চয়ন করে বলে, LOW এবং HIGH mems এর জন্য 512MB-512MB, 512MB LOWMEM (0xc0000000-0xdfffffff) স্থিরভাবে কার্নেল বুট করার সময় ম্যাপ করা হয়েছে; সাধারণত শারীরিক মেমরির প্রথম এতগুলি বাইট ব্যবহার করা হয় যাতে এই পরিসরে ভার্চুয়াল এবং শারীরিক ঠিকানাগুলিতে 0xc0000000 বলা যায় constant

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


3

যতদূর আমি মনে করি, অ্যাপ্লিকেশন স্পেসের জন্য "হাই মেমোরি" এবং কার্নেলের জন্য "লো মেমোরি" ব্যবহৃত হয়।

সুবিধা হ'ল (ব্যবহারকারী-স্থান) অ্যাপ্লিকেশনগুলি কার্নেল-স্পেস মেমরি অ্যাক্সেস করতে পারে না।


0

অনেকে বলেছেন যে লো মেমরি অপারেটিং সিস্টেমের জন্য। এটি সাধারণত সত্য তবে এটি হতে হবে না। হাই মেমরি এবং লো মেমোরি মেমরি স্পেসের মাত্র দুটি অংশ, তবে লিনাক্স সিস্টেমে লো মেমরি কেবল কার্নেলের জন্য এবং ব্যবহারকারী প্রসেসের জন্য উচ্চ মেমরির জন্য থাকে।

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

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