লিনাক্স কি কেবলমাত্র পেজিংয়ের বিভাজন ব্যবহার করে না?


24

লিনাক্স প্রোগ্রামিং ইন্টারফেস একটি প্রক্রিয়ার ভার্চুয়াল ঠিকানা স্থানের বিন্যাস দেখায়। ডায়াগ্রামের প্রতিটি অঞ্চলই কি একটি বিভাগ?

এখানে চিত্র বর্ণনা লিখুন

লিনাক্স কার্নেল বোঝার থেকে ,

এটি কি সঠিক যে নিম্নলিখিতটির অর্থ এমএমইউতে সেগমেন্টেশন ইউনিটটি সেগমেন্টগুলি এবং বিভাগগুলির মধ্যে অফসেটগুলিকে ভার্চুয়াল মেমরি ঠিকানার মানচিত্র দেয় এবং পেজিং ইউনিট তারপরে ভার্চুয়াল মেমরি ঠিকানার জন্য ভার্চুয়াল মেমরি ঠিকানায় মানচিত্র করে?

মেমরি ম্যানেজমেন্ট ইউনিট (এমএমইউ) একটি হার্ডওয়্যার সার্কিটের মাধ্যমে একটি লজিকাল ঠিকানাটিকে একটি লিনিয়ার এড্রেসে রূপান্তর করে যেটিকে সেগমেন্টেশন ইউনিট বলে; পরবর্তীকালে, একটি দ্বিতীয় হার্ডওয়্যার সার্কিট বলা হয় একটি পেজিং ইউনিট লিনিয়ার ঠিকানাটিকে একটি ভৌত ​​ঠিকানায় রূপান্তর করে (চিত্র 2-1 দেখুন)।

এখানে চিত্র বর্ণনা লিখুন

তাহলে এটি কেন বলবে যে লিনাক্স কেবলমাত্র পেজিংয়ের বিভাজন ব্যবহার করে না?

বিভাগগুলিকে 80x86 মাইক্রোপ্রসেসরে অন্তর্ভুক্ত করা হয়েছে যাতে প্রোগ্রামাররা তাদের অ্যাপ্লিকেশনগুলিকে যৌক্তিকভাবে সম্পর্কিত সংস্থাগুলিতে বিভক্ত করতে উত্সাহিত করে যেমন সাবরোটাইনস বা গ্লোবাল এবং স্থানীয় ডেটা অঞ্চলগুলিতে। তবে লিনাক্স খুব সীমিত উপায়ে বিভাজন ব্যবহার করে। প্রকৃতপক্ষে, বিভাগকরণ এবং পেজিং কিছুটা নিরর্থক, কারণ উভয়ই প্রক্রিয়াগুলির শারীরিক ঠিকানা স্পেস পৃথক করতে ব্যবহার করা যেতে পারে: বিভাগগুলি প্রতিটি প্রক্রিয়াটির জন্য পৃথক রৈখিক ঠিকানা স্থান নির্ধারণ করতে পারে, যখন পৃষ্ঠাগুলি একই লিনিয়ার ঠিকানা স্থানটিকে বিভিন্ন শারীরিক ঠিকানার জায়গাগুলিতে ম্যাপ করতে পারে both । লিনাক্স নিম্নলিখিত কারণে বিভাগগুলিতে পেজিং পছন্দ করে:

All সমস্ত প্রক্রিয়া একই বিভাগে রেজিস্টার মানগুলি ব্যবহার করে যখন মেমরি পরিচালনা সহজ হয় — এটি যখন লিনিয়ার ঠিকানার একই সেট ভাগ করে।

Linux লিনাক্সের নকশা উদ্দেশ্যগুলির মধ্যে একটি হ'ল বিস্তৃত স্থাপত্যের বহনযোগ্যতা; বিশেষত, আরআইএসসি আর্কিটেকচারের বিভাগকরণের জন্য সীমিত সমর্থন রয়েছে।

৮০x86 architect আর্কিটেকচারের প্রয়োজন হলে লিনাক্সের ২.ure সংস্করণটি বিভাগগুলি ব্যবহার করে।


আপনি সংস্করণ নির্দিষ্ট করতে পারেন দয়া করে। এটি লেখকের নাম উল্লেখ করাও সহায়ক হতে পারে। আমি জানি কমপক্ষে প্রথমটি একজন বিশিষ্ট ব্যক্তিত্ব থেকে। যাইহোক, শিরোনামের নাম দুটিই কিছুটা জেনেরিক, আপনি বই সম্পর্কে :-) সম্পর্কে কথা বলছিলেন তা প্রথমে আমার কাছে পরিষ্কার ছিল না।
সোর্সজেদি

2
পুনরায় "বিভাগকে 80x86 মাইক্রোপ্রসেসরের মধ্যে অন্তর্ভুক্ত করা হয়েছে ...": এটি ঠিক সত্য নয়। এটি 808x প্রসেসরের একটি উত্তরাধিকার, যার 16-বিট ডেটা পয়েন্টার এবং 64 কেবি মেমরি বিভাগ ছিল। বিভাগের পয়েন্টারগুলি আপনাকে আরও মেমরির ঠিকানাতে বিভাগগুলিকে স্যুইচ করার অনুমতি দেয়। সেই আর্কিটেকচারটি 80x86 এ নিয়ে গেছে (পয়েন্টার আকারের সাথে 33 বিট বেড়েছে)। আজকাল x86_64 মডেলটিতে আপনার কাছে bit৪ বিট পয়েন্টার রয়েছে যা (তাত্ত্বিকভাবে - আমি মনে করি কেবলমাত্র 48 টি বিট ব্যবহার করা হয়) ঠিকানা 16 এক্সাবাইট, সুতরাং বিভাগগুলি প্রয়োজনীয় নয়।
জামেস্কেফ

2
@ জামেস্কেফ, ভাল, ৩৮ in-তে ৩২-বিট সুরক্ষিত মোড সেগমেন্টগুলিকে সমর্থন করে যা সেগুলি ৮৮86-এ থাকা ১ 16-বাইট স্কেলড পয়েন্টার থেকে একেবারেই আলাদা, সুতরাং এটি কেবল সাধারণ উত্তরাধিকার নয়। অবশ্যই তাদের কার্যকারিতা সম্পর্কে কিছু বলতে হবে না।
ilkkachu

@ জামেস্কফ 80186 এর 8086 হিসাবে একই মেমরির মডেল ছিল, কোনও "33 বিট" নেই
জেসেন

উত্তরের যোগ্য নয়, সুতরাং কেবলমাত্র একটি মন্তব্য: বিভাগগুলি এবং পৃষ্ঠাগুলি কেবল অদলবদলের প্রসঙ্গে (যেমন পৃষ্ঠার সোয়াপিং বনাম সেগমেন্টের অদলবদল) এর প্রেক্ষাপটে এবং সেই প্রসঙ্গে পৃষ্ঠা অদলবদলটি কেবল জলভাগের বাইরে থেকে অদলবদলগুলিকে উড়িয়ে দেয়। আপনি যদি খণ্ডগুলিকে আউট / আউট করে পরিবর্তন করেন তবে আপনাকে পুরো বিভাগটি অদলবদল করতে হবে যা 2-4 জিবি হতে পারে। X86 এ ব্যবহার করা এটি আসল জিনিস ছিল না। পৃষ্ঠাগুলি দিয়ে আপনি সর্বদা 4KB ইউনিটে কাজ করতে পারেন। যখন মেমরি অ্যাক্সেস করার কথা আসে তখন বিভাগগুলি এবং পৃষ্ঠাগুলি পৃষ্ঠার সারণির মাধ্যমে সম্পর্কিত এবং তুলনা কমলাগুলিতে আপেল হবে be
vhu

উত্তর:


20

X86-64 আর্কিটেকচারটি দীর্ঘ মোডে (64৪-বিট মোড) বিভাজন ব্যবহার করে না।

বিভাগের চারটি রেজিস্ট্রেশন করে: সিএস, এসএস, ডিএস, এবং ইএসকে 0, এবং সীমা 2 ^ 64 এ বাধ্য করা হয়েছে।

https://en.wikipedia.org/wiki/X86_memory_segmentation#Later_developments

OS এর পক্ষে "লিনিয়ার অ্যাড্রেস" এর সীমাটি সীমাবদ্ধ করা আর সম্ভব নয়। সুতরাং এটি মেমরির সুরক্ষার জন্য পৃথককরণ ব্যবহার করতে পারে না; এটি অবশ্যই পুরোপুরি পেজিংয়ের উপর নির্ভর করবে।

লিগ্যাসি 32-বিট মোডে চলাকালীন শুধুমাত্র x86 সিপিইউগুলির বিশদ সম্পর্কে চিন্তা করবেন না। 32-বিট মোডের জন্য লিনাক্সটি তত বেশি ব্যবহৃত হয় না। এমনকি এটি "বেশ কয়েক বছর ধরে সৌম্য অবহেলার অবস্থায়" বিবেচিত হতে পারে। ফেডোরা [LWN.net, 2017] এ 32-বিট x86 সমর্থন দেখুন ।

(এটি এমন হয় যে ৩২-বিট লিনাক্স সেগমেন্টেশনও ব্যবহার করে না that তবে আপনাকে আমার উপর বিশ্বাস করার দরকার নেই, আপনি কেবল এটিকে উপেক্ষা করতে পারেন :-)।


এটা কিছুটা ওভারস্টেটমেন্ট। লিগ্যাসি অরিজিনাল -০৮০ সেগমেন্টের (সিএস / ডিএস / ইএস / এসএস) লম্বা মোডে বেস / সীমা 0 / -1 এ স্থির করা হয় তবে এফএস এবং জিএস এখনও স্বেচ্ছাসেগা বিভাগের বেস রয়েছে। এবং সিএসে লোড করা সেগমেন্ট বর্ণনাকারী সিপিইউ 32 বা 64-বিট মোডে নির্বাহ করে কিনা তা নির্ধারণ করে। এবং x86-64 লিনাক্সের ব্যবহারকারী স্থান থ্রেড-লোকাল স্টোরেজ ( mov eax, [fs:rdi + 16]) এর জন্য এফএস ব্যবহার করে । কার্নেলটি এন্ট্রি পয়েন্টে swapgsবর্তমান প্রক্রিয়াটির কার্নেল স্ট্যাকটি খুঁজে পেতে জিএস (পরে ) ব্যবহার করে syscall। তবে হ্যাঁ, বিভাজন মূল ওএস মেমরি পরিচালনা / মেমরি-সুরক্ষা ব্যবস্থার অংশ হিসাবে ব্যবহৃত হয় না।
পিটার কর্ডেস

"লিনাক্সের ২.6 সংস্করণটি কেবলমাত্র ৮০x86 architect আর্কিটেকচারের প্রয়োজন হলে বিভাগগুলি ব্যবহার করে" এই প্রশ্নের মূল কথাটি মূলত এটি। তবে আপনার ২ য় অনুচ্ছেদটি মূলত ভুল। লিনাক্স 32 এবং 64-বিট মোডে মূলত অভিন্নভাবে বিভাগগুলি ব্যবহার করে। উদাহরণস্বরূপ বেস = 0 / সীমা = 2 ^ 32 বা 2 ^ 64 ক্লাসিক বিভাগগুলির জন্য (সিএস / ডিএস / ইএস / এসএস) যা সাধারণ নির্দেশাবলী দ্বারা স্পষ্টভাবে ব্যবহৃত হয়। 32-বিট লিনাক্স কোডে উদ্বিগ্ন হওয়ার জন্য "অতিরিক্ত" কিছুই নেই; এইচডাব্লু কার্যকারিতা রয়েছে তবে ব্যবহৃত হয়নি।
পিটার কর্ডেস

@ পিটারকর্ডস আপনি মূলত উত্তরটি ভুল ব্যাখ্যা করছেন :-)। সুতরাং আমি চেষ্টা করেছি এবং আমার যুক্তিটিকে কম অস্পষ্ট করার জন্য এটি সম্পাদনা করেছি।
সোর্সজেডি

ভাল উন্নতি, এখন এটি বিভ্রান্তিকর নয়। আমি আপনার আসল পয়েন্টের সাথে সম্পূর্ণরূপে একমত, যা আপনি x86 বিভাগকে সম্পূর্ণ উপেক্ষা করতে পারেন এবং করা উচিত, কারণ এটি কেবল ওসদেব সিস্টেম-পরিচালনার জিনিসগুলির জন্য, এবং টিএলএসের জন্য ব্যবহৃত হয়। আপনি যদি শেষ পর্যন্ত এটি সম্পর্কে জানতে চান তবে ফ্ল্যাট মেমরির মডেল সহ আপনি x86 asm ইতিমধ্যে বুঝতে পারার পরে এটি বোঝা অনেক সহজ।
পিটার কর্ডেস

8

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

এটি বলা যায় না যে লিনাক্স x86-তে বিভাজন ব্যবহার করে না, কারণ এটি সম্ভব হবে না। আপনি ইতিমধ্যে একটি অংশ হাইলাইট করেছেন, লিনাক্স খুব সীমিত উপায়ে বিভাগগুলি ব্যবহার করে । দ্বিতীয় অংশটি হ'ল লিনাক্স কেবলমাত্র ৮০x architect architect আর্কিটেকচারের প্রয়োজন হলে বিভাগগুলি ব্যবহার করে

আপনি ইতিমধ্যে কারণগুলি উদ্ধৃত করেছেন, পেজিং সহজ এবং আরও বহনযোগ্য।


7

ডায়াগ্রামের প্রতিটি অঞ্চলই কি একটি বিভাগ?

না।

বিভাগটি সিস্টেম (একটি x86-তে 32-বিট সুরক্ষিত মোডে) পৃথক কোড, ডেটা এবং স্ট্যাক বিভাগগুলিকে সমর্থন করার জন্য ডিজাইন করা হয়েছে, বাস্তবে সমস্ত বিভাগগুলি একই মেমরি অঞ্চলে সেট করা থাকে। অর্থাৎ, তারা 0 থেকে শুরু হয় এবং মেমরি (*) এর শেষে শেষ হয় । এটি যৌক্তিক ঠিকানা এবং লিনিয়ার ঠিকানার সমান করে।

একে "ফ্ল্যাট" মেমরি মডেল বলা হয় এবং এটির মডেলের তুলনায় কিছুটা সহজ যেখানে আপনার পৃথক বিভাগ রয়েছে এবং তারপরে সেগুলির মধ্যে পয়েন্টার রয়েছে। বিশেষত, একটি খণ্ডিত মডেলটির জন্য দীর্ঘ পয়েন্টার প্রয়োজন, যেহেতু সেগমেন্ট নির্বাচনকারীটিকে অফসেট পয়েন্টার ছাড়াও অন্তর্ভুক্ত করতে হবে। (16-বিট সেগমেন্ট নির্বাচক + মোট 48 বিট পয়েন্টারের জন্য 32 বিট অফসেট; বনাম কেবল একটি 32-বিট ফ্ল্যাট পয়েন্টার))

-৪-বিট দীর্ঘ মোড এমনকি ফ্ল্যাট মেমরির মডেল ব্যতীত বিভাজনকেও সমর্থন করে না।

আপনি যদি ২66-তে 16-বিট সুরক্ষিত মোডে প্রোগ্রাম করতে থাকেন তবে আপনার বিভাগগুলির জন্য আরও প্রয়োজন হবে, যেহেতু ঠিকানা স্থান 24 বিট তবে পয়েন্টারগুলি কেবলমাত্র 16 বিট।

(* মনে রাখবেন যে 32-বিট লিনাক্স কার্নেল / ইউজারস্পেস বিভাজনকে কীভাবে পরিচালনা করে তা আমি মনে করতে পারি না Se বিভাগকরণটি ইউজারস্পেস সেগমেন্টস সীমাগুলি নির্ধারণের মাধ্যমে যাতে কার্নেল স্পেস অন্তর্ভুক্ত না করে তা অনুমতি দেয় P পেজিং এটির জন্য অনুমতি দেয় কারণ এটি সরবরাহ করে প্রতি পৃষ্ঠার সুরক্ষা স্তর।)

তাহলে এটি কেন বলবে যে লিনাক্স কেবলমাত্র পেজিংয়ের বিভাজন ব্যবহার করে না?

X86 এর এখনও বিভাগ রয়েছে এবং আপনি সেগুলি অক্ষম করতে পারবেন না। এগুলি যতটা সম্ভব ব্যবহার করা হচ্ছে used 32-বিট সুরক্ষিত মোডে, ভাগগুলি ফ্ল্যাট মডেলের জন্য সেট আপ করা দরকার, এবং এমনকি 64৪-বিট মোডে সেগুলি এখনও বাছাই করে।


হু, আমি অনুমান করি যে সিএস / ডিএস / ইএস / এসএস-তে বিভাগের সীমা নির্ধারণ করে পৃষ্ঠা সারণী পরিবর্তন করার চেয়ে একটি 32-বিট কার্নেল মেল্টডাউন আরও সস্তারভাবে হ্রাস করতে পারে যা ব্যবহারকারী-স্পেসকে 2 জি বা 3 জি-র উপরে অ্যাক্সেস থেকে বিরত রাখে। (মেল্টডাউন ভলন পৃষ্ঠা-সারণীর এন্ট্রিগুলিতে কার্নেল / ব্যবহারকারী বিটের জন্য একটি কার্যপ্রণালী, কেবলমাত্র কার্নেল-ম্যাপযুক্ত পৃষ্ঠাগুলি থেকে ব্যবহারকারী-স্থানকে পড়ার অনুমতি দেয়)। ভিডিএসও পৃষ্ঠাগুলি 4 জি এর শীর্ষে ম্যাপ করা যেতে পারে, যদিও: / wrfsbaseসুরক্ষিত / কমপ্যাট মোডে অবৈধ, কেবলমাত্র দীর্ঘ মোড, সুতরাং 32-বিট কার্নেলের ব্যবহারকারী-স্থান এফএস বেস উচ্চতর করতে পারেনি set
পিটার কর্ডেস

একটি -৪-বিট কার্নেলে, 32-বিট ব্যবহারকারী-স্পেসটি সম্ভবত 64-বিট কোড সেগমেন্টে লাফিয়ে উঠতে পারে, সুতরাং আপনি মেল্টডাউন সুরক্ষার জন্য সেগমেন্ট সীমাতে নির্ভর করতে পারবেন না, কেবলমাত্র খাঁটি 32-বিট কার্নেলের মধ্যে থাকতে পারে। (যার প্রচুর শারীরিক র‌্যামযুক্ত মেশিনগুলিতে বড় ধরনের অসুবিধা রয়েছে, যেমন থ্রেড স্ট্যাকের জন্য কম মেমো থেকে চালানো)) যাইহোক, হ্যাঁ লিনাক্স সাধারণভাবে ব্যবহারকারী-জায়গাতে বেস / সীমা = 0 / -1 রেখে পেজিংয়ের সাহায্যে কার্নেল মেমরির সুরক্ষা দেয় বিভাগগুলি (এফএস / জিএস নয় যা থ্রেড-স্থানীয় সঞ্চয়স্থানের জন্য ব্যবহৃত হয়)।
পিটার কর্ডেস

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

3

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


2

ডায়াগ্রামের প্রতিটি অঞ্চলই কি একটি বিভাগ?

এগুলি "বিভাগ" শব্দটির প্রায় সম্পূর্ণ-সম্পূর্ণ-পৃথক ব্যবহার are

  • x86 বিভাজন / বিভাগ রেজিস্টার: আধুনিক x86 ওএসগুলি একটি সমতল মেমরি মডেল ব্যবহার করে যেখানে সমস্ত বিভাগগুলিতে একই বেস = 0 এবং সীমা = সর্বাধিক 32-বিট মোড থাকে, হার্ডওয়্যার হিসাবে একই রকম প্রয়োগ করা হয় যা 64-বিট মোডে বিভক্তকরণের বিভাগ তৈরি করে । (এফএস বা জিএস বাদে, থ্রেড-লোকাল স্টোরেজের জন্য ব্যবহৃত 64৪-বিট মোডেও))
  • লিঙ্কার / প্রোগ্রাম-লোডার বিভাগ / বিভাগগুলি। ( ELF ফাইল ফর্ম্যাটে বিভাগ এবং বিভাগের পার্থক্য কী )

ব্যবহারগুলির একটি সাধারণ উৎপত্তি আছে: যদি আপনি ছিল একটি segmented মেমরি মডেল (বিশেষত পেজড ভার্চুয়াল মেমরি ছাড়া) ব্যবহার করে, আপনি ডাটা থাকতে পারে এবং বাসস ঠিকানাগুলি ডিএস সেগমেন্ট বেস, এস এস বেস স্ট্যাক আপেক্ষিক, এবং কোড আপেক্ষিক আপেক্ষিক হতে সিএস বেস ঠিকানা।

সুতরাং একাধিক বিভিন্ন প্রোগ্রাম বিভিন্ন লিনিয়ার ঠিকানাগুলিতে লোড করা যায়, বা এমনকি সেগমেন্ট বেসগুলির সাথে সম্পর্কিত 16 বা 32-বিট অফসেট পরিবর্তন না করে শুরু করার পরেও সরানো যেতে পারে।

তবে তারপরে আপনাকে জানতে হবে যে কোনও পয়েন্টারটি কোন বিভাগের সাথে তুলনামূলক, তাই আপনার কাছে "দূরবর্তী পয়েন্টার" এবং আরও কিছু রয়েছে। (প্রকৃত 16-বিট x86 প্রোগ্রামগুলির প্রায়শই তাদের কোডগুলিকে ডেটা হিসাবে অ্যাক্সেসের প্রয়োজন হয় না, তাই কোথাও একটি 64 কে কোড সেগমেন্ট ব্যবহার করতে পারে এবং ডিএস = এসএস সহ আরও একটি 64k ব্লক, উচ্চ অফসেটগুলি থেকে স্ট্যাকটি নিচে নেমে আসা এবং ডেটা এ থাকা) নীচে। বা সমস্ত বিভাগের বেসগুলি সমান সহ একটি ক্ষুদ্র কোড মডেল)।


X86 বিভাগকে কীভাবে পেজিংয়ের সাথে মিথস্ক্রিয়া করে

32/64-বিট মোডে ঠিকানা ম্যাপিং হ'ল:

  1. বিভাগ: অফসেট (রেজিস্টার দ্বারা অফসেটটি ধারণ করে, বা নির্দেশ উপসর্গ দিয়ে ওভাররাইড করা বিভাগের বেস)
  2. 32 বা 64-বিট লিনিয়ার ভার্চুয়াল ঠিকানা = বেস + অফসেট। (লিনাক্স যেমন ফ্ল্যাট মেমরি মডেল ব্যবহার করে, পয়েন্টার / অফসেট = লিনিয়ার ঠিকানাগুলিও। এফএস বা জিএস সম্পর্কিত টিএলএস অ্যাক্সেস করার সময় বাদে))
  3. পৃষ্ঠা সারণী (টিএলবি দ্বারা ক্যাশেড) মানচিত্রের লিনিয়ার 32 (লেগ্যাসি মোড), 36 (লেগ্যাসি পিএই), বা 52-বিট (x86-64) শারীরিক ঠিকানা। ( /programming/46509152/why-in-64bit-the- ভার্চুয়াল- অ্যাড্রেস-are-4-bit-short-48bit-long-compared-with-the )।

    এই পদক্ষেপটি alচ্ছিক: একটি নিয়ন্ত্রণ রেজিস্টারে কিছু সেট করে বুটআপ করার সময় পেজিং সক্ষম করতে হবে। পেজিং ছাড়াই লিনিয়ার অ্যাড্রেসগুলি হ'ল ফিজিকাল অ্যাড্রেস।

লক্ষ্য করুন যে বিভাজনটি আপনাকে একক প্রক্রিয়াতে (বা থ্রেড) ভার্চুয়াল অ্যাড্রেস স্পেসের 32 বা 64 বিটের বেশি ব্যবহার করতে দেয় না , কারণ ফ্ল্যাট (রৈখিক) ঠিকানা স্পেসের সমস্ত কিছু ম্যাপ করা আছে কেবল তাদের অফসেটের মতো বিট সংখ্যা। (এটি 16-বিট x86-র ক্ষেত্রে নয়, যেখানে প্রায়শই 16 বিট রেজিস্টার এবং অফসেট সহ k৪ কের বেশি মেমরি ব্যবহারের জন্য বিভাগকরণটি কার্যকর ছিল))


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

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


লিনাক্স কীভাবে x86 বিভাগ রেজিস্টার সেট আপ করে:

সিএস / ডিএস / ইএস / এসএসের ভিত্তি এবং সীমা 32 এবং 64-বিট মোডে সমস্ত 0 / -1। এটিকে ফ্ল্যাট মেমরি মডেল বলা হয় কারণ সমস্ত পয়েন্টার একই ঠিকানা স্থানে নির্দেশ করে।

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

  • টিএলএস (থ্রেড লোকাল স্টোরেজ): এফএস এবং জিএস দীর্ঘ মোডে বেস = 0 এ স্থির নয় । (এগুলি 386 এর সাথে নতুন ছিল এবং কোনও নির্দেশাবলীর দ্বারা repস্পষ্টভাবে ব্যবহৃত হয় নি, এমনকি স্ট্রিং নির্দেশিকাগুলিও ES ব্যবহার করে না)। x86-64 লিনাক্স প্রতিটি থ্রেডের জন্য FS বেস ঠিকানাটি টিএলএস ব্লকের ঠিকানায় সেট করে।

    যেমন mov eax, [fs: 16]এই থ্রেডের জন্য টিএলএস ব্লকে 16 বাইট থেকে 32-বিট মান লোড করে।

  • সিএস বিভাগের বর্ণনাকারী সিপিইউ কোন মোডে রয়েছে তা চয়ন করে (16/32/64-বিট সুরক্ষিত মোড / লং মোড)। লিনাক্স সমস্ত -৪-বিট ব্যবহারকারী-স্থান প্রক্রিয়াগুলির জন্য একটি একক জিডিটি এন্ট্রি এবং সমস্ত 32-বিট ব্যবহারকারী-স্থান প্রক্রিয়াগুলির জন্য অন্য একটি জিডিটি এন্ট্রি ব্যবহার করে। (সিপিইউ সঠিকভাবে কাজ করার জন্য, ডিএস / ইএসকেও বৈধ এন্ট্রিগুলিতে সেট করতে হবে, এবং এসএসকেও করতে হবে)। এটি সুবিধার স্তরটি (কার্নেল (রিং 0) বনাম ব্যবহারকারী (রিং 3)) বাছাই করে, তাই 64৪-বিট ব্যবহারকারী-স্পেসে ফিরে আসার পরেও, কার্নেলটি সিএসের পরিবর্তনের জন্য, স্বাভাবিক ব্যবহারের পরিবর্তে iretবা sysretতার পরিবর্তে ব্যবস্থা করতে হয় লাফানো বা ret নির্দেশনা।

  • X86-64-এ, syscallএন্ট্রি পয়েন্টটি swapgsব্যবহারকারীর স্পেসের জিএস থেকে কার্নেলের জিএস ফ্লিপ করতে ব্যবহার করে, যা এটি এই থ্রেডের জন্য কার্নেল স্ট্যাকটি সন্ধান করতে ব্যবহার করে। (থ্রেড-লোকাল স্টোরেজের একটি বিশেষ ক্ষেত্রে)। syscallনির্দেশ কার্নেল স্ট্যাক এ বিন্দু স্ট্যাক পয়েন্টার পরিবর্তন করে না; কার্নেলটি এন্ট্রি পয়েন্ট 1 এ পৌঁছালে এটি এখনও ব্যবহারকারী স্ট্যাকের দিকে ইশারা করে ।

  • সুরক্ষিত মোড / লং মোডে কাজ করার জন্য সিপিইউর জন্য ডিএস / ইএস / এসএসকে বৈধ সেগমেন্ট বর্ণনাকারী হিসাবে সেট করতে হবে, যদিও সেই বর্ণনাকারীদের থেকে বেস / সীমা দীর্ঘ মোডে উপেক্ষা করা হয়।

সুতরাং মূলত x86 বিভাজনটি টিএলএস, এবং বাধ্যতামূলক x86 ওসদেব স্টাফের জন্য ব্যবহার করা হয় যা হার্ডওয়্যারটি আপনাকে করা উচিত।


পাদটীকা 1: মজাদার ইতিহাস: AMD64 সিলিকন প্রকাশের কয়েক বছর আগে থেকে কার্নেল ডেভস এবং এএমডি আর্কিটেক্টদের মধ্যে বার্তাগুলির মেলিং তালিকার সংরক্ষণাগার রয়েছে, ফলস্বরূপ syscallএটির ব্যবহারের যোগ্যতার নকশায় টুইট হয়েছিল। বিস্তারিত জানার জন্য এই উত্তরের লিঙ্কগুলি দেখুন ।

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