X86 নির্দেশাবলীর কি একই সাথে স্মৃতিতে উপস্থিত থাকার জন্য তাদের নিজস্ব এনকোডিংয়ের পাশাপাশি তাদের সমস্ত আর্গুমেন্ট প্রয়োজন?


64

আমি এমন লিনাক্স ভিএম চালানো সম্ভব কিনা কিনা তা জানার চেষ্টা করছি যার র‌্যাম কেবলমাত্র একটি একক শারীরিক পৃষ্ঠায় সমর্থনযুক্ত।

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

লিনাক্স গেস্ট শুরু করার চেষ্টা করার সময় আমি লক্ষ্য করেছি যে সমাবেশ সংক্রান্ত নির্দেশাবলী যা মেমরি অপারেশন ব্যবহার করে, যেমন

add [rbp+0x820DDA], ebp

পৃষ্ঠার ত্রুটিযুক্ত লুপের দিকে পরিচালিত করুন যতক্ষণ না আমি নির্দেশযুক্ত পৃষ্ঠার পাশাপাশি অপারেন্ডে উল্লিখিত পৃষ্ঠার জন্য এই বিটটি পুনরুদ্ধার করি (এই উদাহরণে [rbp+0x820DDA]))

আমি ভাবছি কেন এই ঘটনা? সিপিইউ মেমরি পৃষ্ঠাগুলি ক্রমানুসারে অ্যাক্সেস করা উচিত নয়, অর্থাত্ প্রথমে নির্দেশিকাটি পড়ুন এবং তারপরে মেমরি অপারেণ্ডটি অ্যাক্সেস করবেন? অথবা x86 এর জন্য নির্দেশিকা পৃষ্ঠা এবং সমস্ত অপরেন্ড পৃষ্ঠা একই সাথে অ্যাক্সেসযোগ্য হওয়া দরকার?

আমি এএমডি জেন ​​1 এ পরীক্ষা করছি।


2
তুমি কেন এটা করতে চাও?
এসএস অ্যান

11
কেবলমাত্র প্রযুক্তিগত আগ্রহের বাইরে :)
স্যাবিব্যাগ

14
হাসিখুশি প্রকল্প ধারণার জন্য উত্সাহ দেওয়া।
পাইপ

10
এটি "ব্রাউজারে জাভাস্ক্রিপ্টে চলমান একটি 486 এমুলেটরের বুট লিনাক্স" এর স্তরে উন্মাদ। আমি এটা ভালোবাসি.
ক্রাইলিস

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

উত্তর:


56

হ্যাঁ, তাদের জন্য মেশিন কোড এবং সমস্ত মেমরি অপারেশন প্রয়োজন।

সিপিইউ মেমরি পৃষ্ঠাগুলি ক্রমানুসারে অ্যাক্সেস করা উচিত নয়, অর্থাত্ প্রথমে নির্দেশিকাটি পড়ুন এবং তারপরে মেমরি অপারেণ্ডটি অ্যাক্সেস করবেন?

হ্যাঁ এটিই যৌক্তিকভাবে ঘটে যা ঘটে তবে একটি পৃষ্ঠা-ত্রুটি ব্যতিক্রম সেই 2-পদক্ষেপ প্রক্রিয়াটিকে বাধা দেয় এবং কোনও অগ্রগতি বাতিল করে দেয়। কোনও পৃষ্ঠা-ত্রুটি ঘটলে মাঝখানে কী নির্দেশ ছিল তা সিপিইউর মনে রাখার কোনও উপায় নেই।

কোনও পৃষ্ঠা-ফল্ট হ্যান্ডলার যখন কোনও বৈধ পৃষ্ঠা ত্রুটি পরিচালনা করার পরে ফিরে আসে, আরআইপি = ত্রুটিযুক্ত নির্দেশের ঠিকানা, সুতরাং সিপিইউ এটি স্ক্র্যাচ থেকে চালানো পুনরায় চেষ্টা করে

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

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

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


কয়েকটি নির্দেশাবলী বাধাযোগ্য এবং আংশিক অগ্রগতি করতে পারে rep movs( যেমন একটি ক্যানের মধ্যে স্মৃতিবিজড়িত) এবং অন্যান্য স্ট্রিং নির্দেশাবলী, বা লোড / স্ক্যাটার স্টোর সংগ্রহ করতে পারে। তবে একমাত্র প্রক্রিয়াটি স্ট্রিং অপ্সের জন্য আরসিএক্স / আরএসআই / আরডিআই বা সংগ্রহস্থলের জন্য গন্তব্য এবং মাস্ক রেজিস্টারের মতো আর্কিটেকচারাল রেজিস্টারগুলি আপডেট করছে (যেমন এভিএক্স 2 এরvpgatherdd জন্য ম্যানুয়াল )। অপকড / ডিকোড ফলাফলগুলি কোনও গোপন আভ্যন্তরীণ রেজিস্টারে না রেখে এবং কোনও পৃষ্ঠা ত্রুটি হ্যান্ডলার থেকে ওরেট পরে পুনরায় চালু করা হয় art এই নির্দেশাবলী যা একাধিক পৃথক ডেটা অ্যাক্সেস করে।

এছাড়াও মনে রাখবেন যে x86 (বেশিরভাগ আইএসএর মতো) গ্যারান্টি দেয় যে নির্দেশগুলি পারমাণবিক প্রতিবন্ধক। বাধা / ব্যতিক্রম: এগুলি বাধা দেওয়ার আগে সেগুলি সম্পূর্ণরূপে ঘটে থাকে বা হয় না। এটি পরিচালনা করার সময় কোনও সমাবেশ নির্দেশকে বাধা দিচ্ছে । সুতরাং উদাহরণস্বরূপ add [mem], regস্টোর অংশটি ত্রুটিযুক্ত থাকলেও, lockউপসর্গ ছাড়াই লোডটি ফেলে দিতে হবে ।


অগ্রণী অগ্রগতি জন্য উপস্থিত অতিথি ব্যবহারকারী-স্থান পৃষ্ঠাগুলির সবচেয়ে খারাপ ক্ষেত্রে সংখ্যা 6 হতে পারে (প্রতিটি পৃথক পৃথক অতিথি-কার্নেল পৃষ্ঠা-সারণী সাবট্রিজ):

  • movsqবা movswপৃষ্ঠার সীমানা বিস্তৃত 2-বাইট নির্দেশনা, সুতরাং এটির ডিকোড করার জন্য উভয় পৃষ্ঠার প্রয়োজন।
  • কিওয়ার্ড উত্স অপারেন্ড [rsi]একটি পৃষ্ঠা বিভক্ত
  • কিওয়ার্ড গন্তব্য অপারেন্ড [rdi]একটি পৃষ্ঠা বিভক্ত

যদি এই 6 টি পৃষ্ঠার কোনও ত্রুটি থেকে থাকে তবে আমরা আবার স্কোয়ারে ফিরে আসছি।

rep movsdএটি একটি 2-বাইট নির্দেশও এবং এর এক ধাপে অগ্রগতি করা একই প্রয়োজন। একই ক্ষেত্রে পছন্দ push [mem]বা pop [mem]একটি শ্রেণীবদ্ধ স্ট্যাক দিয়ে নির্মিত যেতে পারে।

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


@ ব্র্যান্ডন মন্তব্যগুলিতে উল্লেখ করেছেন যে কোনও অতিথির স্মৃতিতে তার পৃষ্ঠার টেবিলগুলির প্রয়োজন হবে এবং ব্যবহারকারী-স্থান পৃষ্ঠার বিভাজনগুলিও 1 জিআইবি বিভক্ত হতে পারে সুতরাং উভয় পক্ষ শীর্ষ স্তরের পিএমএল 4 এর বিভিন্ন উপ-গাছের মধ্যে রয়েছে। এইচডাব্লু পৃষ্ঠা ওয়াকের অগ্রগতি করতে এই সমস্ত অতিথি পৃষ্ঠা-সারণী পৃষ্ঠাগুলির স্পর্শ করতে হবে। এমন একটি পরিস্থিতি যা এই প্যাথোলজিকাল দ্বারা ঘটনাক্রমে হওয়ার সম্ভাবনা কম।

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

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


15
একক নির্দেশের জন্য সবচেয়ে খারাপ কেস "পৃষ্ঠা ডিরেক্টরি পয়েন্টার টেবিল সীমানা জুড়ে" ("পৃষ্ঠাগুলি 6 পৃষ্ঠার সারণী, 6 পৃষ্ঠার ডিরেক্টরি, 6 পিডিপিটি এবং একটি পিএমএল 4 যোগ করে)" দিয়ে সমস্ত কিছুকে ভুলভাবে যুক্ত করে " push dword [foo" (বা এমনকি ঠিক call [foo]) কিছু হতে পারে ; সিপিইউর "পিইবিএস বাফারের সাথে সুনির্দিষ্ট ইভেন্ট ভিত্তিক নমুনা" বৈশিষ্ট্যটি সক্ষম এবং কনফিগার করা হয়েছে যাতে পিইবিএস বাফারটিতে pushপারফরম্যান্স পর্যবেক্ষণের ডেটা যুক্ত হওয়ার কারণ রয়েছে। একটি রক্ষণশীল "হোস্ট দ্বারা প্রদত্ত ন্যূনতম পৃষ্ঠাগুলির জন্য যাতে অতিথি প্যাথলজিকাল ক্ষেত্রে অগ্রগতি করতে পারে" আমি কমপক্ষে ১ 16 পৃষ্ঠা চাই।
ব্রেন্ডন

4
নোট করুন যে এই ধরণের জিনিসটি বরাবরই সিআইএসসি-ওয়াই আর্কিটেকচারে প্রচলিত ছিল। কিছু মাইক্রোপ্রসেসর আংশিকভাবে নির্দেশাবলী ডিকোড করে এবং মাইক্রোরিজিস্টার অবস্থাকে একটি পৃষ্ঠা ত্রুটিতে ফেলে দেয়, তবে অন্যরা "/ লুপ-ওয়াই" নির্দেশাবলীর জন্য ঠিকানাটি চালিত করে না / / অথবা প্রয়োজন হয় না (এম 68 কে-তে ডিবিআরএ, ভ্যাক্সে এমওভিসি 3 / এমওভিসি 5 ইত্যাদি) একই রকম রেজিস্টারে থাকতে পারে আপনার আরইপি মোভের উদাহরণে।
টেরিক

1
@ ব্রেন্ডন: ভ্যাক্সের নির্দেশিকায় কেউ প্রায় 50 টি পৃষ্ঠা হিসাবে সবচেয়ে খারাপ বিষয় গণনা করেছেন। আমি বিবরণগুলি ভুলে গিয়েছি, তবে আপনি অবশ্যই নির্দেশটি একটি পৃষ্ঠার সীমানায় রেখেছেন, পৃষ্ঠার সীমানা বিস্তৃত টেবিলের সাহায্যে অনুবাদ-সারণী অনুসন্ধানের মতো কিছু ব্যবহার করুন, পৃষ্ঠার সীমানায় ইন্ডিয়ারেক্টস সহ (আরএক্স) [আরওয়াই] ব্যবহার করুন এবং শীঘ্রই. কেশিকতম নির্দেশাবলী 6 টি অপারেন্ড করে নিয়েছিল (সেগুলিকে r0-r5 এ লোড করা) এবং সমস্ত ছয়টি ডাবল অনড় হতে পারে, আমার ধারণা।
টেরিক

3
ওএস নির্দেশনা পরিবর্তন করতে পারে তবে এটি পরিবর্তনও করতে পারে EIP। সুতরাং একটি যৌক্তিক ফলো-আপ প্রশ্ন আছে। বুদ্ধিমান নির্দেশনা প্যাচ প্রকল্পটি ধরে ধরে ন্যূনতম পৃষ্ঠাগুলি কত? উদাহরণস্বরূপ স্বাক্ষরবিহীন মানটিকে একটি প্রান্তযুক্ত স্ক্র্যাচ বাফারে অনুলিপি করুন, নির্দেশকে অনুকরণ করুন এবং পরবর্তী নির্দেশিকায় IRET করুন T
এমসাল্টারস

1
ওএসের iretনির্দেশাবলী সহ পৃষ্ঠাটি স্মৃতিতে থাকা দরকার। এটি একটি বাই-বাইট নির্দেশ, সুতরাং একটি অতিরিক্ত পৃষ্ঠা। পৃষ্ঠার ত্রুটি হ্যান্ডলার বিঘ্নিত ঠিকানাও মেমরির মধ্যে থাকা দরকার তবে এটি উপরের মতো একই পৃষ্ঠা হতে পারে।
স্টিগ হেমার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.