ডায়াগ্রামের প্রতিটি অঞ্চলই কি একটি বিভাগ?
এগুলি "বিভাগ" শব্দটির প্রায় সম্পূর্ণ-সম্পূর্ণ-পৃথক ব্যবহার are
- x86 বিভাজন / বিভাগ রেজিস্টার: আধুনিক x86 ওএসগুলি একটি সমতল মেমরি মডেল ব্যবহার করে যেখানে সমস্ত বিভাগগুলিতে একই বেস = 0 এবং সীমা = সর্বাধিক 32-বিট মোড থাকে, হার্ডওয়্যার হিসাবে একই রকম প্রয়োগ করা হয় যা 64-বিট মোডে বিভক্তকরণের বিভাগ তৈরি করে । (এফএস বা জিএস বাদে, থ্রেড-লোকাল স্টোরেজের জন্য ব্যবহৃত 64৪-বিট মোডেও))
- লিঙ্কার / প্রোগ্রাম-লোডার বিভাগ / বিভাগগুলি। ( ELF ফাইল ফর্ম্যাটে বিভাগ এবং বিভাগের পার্থক্য কী )
ব্যবহারগুলির একটি সাধারণ উৎপত্তি আছে: যদি আপনি ছিল একটি segmented মেমরি মডেল (বিশেষত পেজড ভার্চুয়াল মেমরি ছাড়া) ব্যবহার করে, আপনি ডাটা থাকতে পারে এবং বাসস ঠিকানাগুলি ডিএস সেগমেন্ট বেস, এস এস বেস স্ট্যাক আপেক্ষিক, এবং কোড আপেক্ষিক আপেক্ষিক হতে সিএস বেস ঠিকানা।
সুতরাং একাধিক বিভিন্ন প্রোগ্রাম বিভিন্ন লিনিয়ার ঠিকানাগুলিতে লোড করা যায়, বা এমনকি সেগমেন্ট বেসগুলির সাথে সম্পর্কিত 16 বা 32-বিট অফসেট পরিবর্তন না করে শুরু করার পরেও সরানো যেতে পারে।
তবে তারপরে আপনাকে জানতে হবে যে কোনও পয়েন্টারটি কোন বিভাগের সাথে তুলনামূলক, তাই আপনার কাছে "দূরবর্তী পয়েন্টার" এবং আরও কিছু রয়েছে। (প্রকৃত 16-বিট x86 প্রোগ্রামগুলির প্রায়শই তাদের কোডগুলিকে ডেটা হিসাবে অ্যাক্সেসের প্রয়োজন হয় না, তাই কোথাও একটি 64 কে কোড সেগমেন্ট ব্যবহার করতে পারে এবং ডিএস = এসএস সহ আরও একটি 64k ব্লক, উচ্চ অফসেটগুলি থেকে স্ট্যাকটি নিচে নেমে আসা এবং ডেটা এ থাকা) নীচে। বা সমস্ত বিভাগের বেসগুলি সমান সহ একটি ক্ষুদ্র কোড মডেল)।
X86 বিভাগকে কীভাবে পেজিংয়ের সাথে মিথস্ক্রিয়া করে
32/64-বিট মোডে ঠিকানা ম্যাপিং হ'ল:
- বিভাগ: অফসেট (রেজিস্টার দ্বারা অফসেটটি ধারণ করে, বা নির্দেশ উপসর্গ দিয়ে ওভাররাইড করা বিভাগের বেস)
- 32 বা 64-বিট লিনিয়ার ভার্চুয়াল ঠিকানা = বেস + অফসেট। (লিনাক্স যেমন ফ্ল্যাট মেমরি মডেল ব্যবহার করে, পয়েন্টার / অফসেট = লিনিয়ার ঠিকানাগুলিও। এফএস বা জিএস সম্পর্কিত টিএলএস অ্যাক্সেস করার সময় বাদে))
পৃষ্ঠা সারণী (টিএলবি দ্বারা ক্যাশেড) মানচিত্রের লিনিয়ার 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
এটির ব্যবহারের যোগ্যতার নকশায় টুইট হয়েছিল। বিস্তারিত জানার জন্য এই উত্তরের লিঙ্কগুলি দেখুন ।