রেড জোনের উদ্দেশ্য কী?


12

রেড জোন স্ট্যাক পয়েন্টার ছাড়িয়ে মেমরির একটি স্থির আকারের অঞ্চল যা "বরাদ্দ" করা হয়নি। সংকলকগণ সরল পাতায় ফাংশনে সেই অঞ্চলটি অ্যাক্সেস করতে সমাবেশ তৈরি করে।

তবে আমি রেড জোনের জন্য কোনও আসল সুবিধা দেখতে পাচ্ছি না। স্ট্যাক পয়েন্টার ছাড়িয়ে মেমরি অ্যাক্সেস করা সত্যিই বিপজ্জনক এবং সহজেই ডেটা দুর্নীতিতে ডেকে আনতে পারে । এমন কি কেন? 2 টি প্রসেসরের নির্দেশাবলী সংরক্ষণ করা (পুশ ebp; Mov ebp esp) বাস্তব গতি দেয় না।

উত্তর:


16

রেড জোনটি হ'ল নির্ভেজাল এবং সহজভাবে একটি অপ্টিমাইজেশন যা নির্দেশাবলী সংরক্ষণ করতে পারে। এর অর্থ হ'ল প্রতিটি ফাংশনের জন্য নির্গত কোডের প্রয়োজন নেই স্ট্যাক পয়েন্টার থেকে বিয়োগ করে স্থানীয় স্টোরেজ তৈরি করা

sub XXX, %rsp 

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

যদি আপনাকে আর স্ট্যাক পয়েন্টারটি থেকে সাব সাব করতে না হয় তবে নির্গত কোডটি বেস পয়েন্টার হিসাবে আরএসপি ব্যবহার করতে পারে, সাধারণত একটি কাজ আরবিপি-র জন্য সংরক্ষিত থাকে এবং নির্গত কোড আরবিপি ব্যবহার করতে পারে অন্য সাধারণ উদ্দেশ্যে নিবন্ধক হিসাবে।

এর পরিণামটি হ'ল প্রতিটি ফাংশন কলের উপস্থাপনা এবং পর্বটি দুটি নির্দেশিকা সংরক্ষণ করতে পারে যা আরবিপি সংরক্ষণ এবং পুনরুদ্ধার করতে পারে:

(gnu এসেম্বলার)

pushq %rbp       # prologue [ two instructions not necessary ]
movq %rsp,%rbp

.... [code]

movq %rbp,%rsp   # epilogue [ two instructions not necessary ]
popq %rbp        

মনে রাখবেন যে সিসিসি-তে আপনি যদি না চান তবে আপনি -ম্নো-রেড-জোন পতাকাটি পাস করতে পারেন (তবে x86-64 এবিআই এর দরকার আছে)। লিনাক্স কার্নেলটি এবিআই সম্মতিযুক্ত হওয়ার দরকার নেই এবং এইভাবে সমস্ত কার্নেল কোড-এমএনও-রেড-জোন দিয়ে সংকলিত হয়।

তদ্ব্যতীত, স্ট্যাক পয়েন্টারের বাইরে মেমরি অ্যাক্সেস করা বিপজ্জনক নয় যদি এটি অপারেশনটির প্রত্যাশিত মোড। এটি কেবল বিপজ্জনক এবং অপরিকল্পিত এবং অপ্রত্যাশিত হলে দুর্নীতির দিকে পরিচালিত করতে পারে। যখন নির্গত কোড এটি করে, এটি জানে যে এটি কী করছে।


হ্যাঁ, আমি এটি বুঝতে পারি। কিন্তু 1 টি নির্দেশিকা সংরক্ষণ করা (এসএসপি থেকে সাব) সত্যিই অপ্টিমাইজেশন? আমি বোঝাতে চাইছি কিছু বাইট এবং 1 প্রসেসরের চক্রের ডেটা দূষিত হওয়ার বাস্তব সম্ভাবনার দামের জন্য অদ্ভুত দেখাচ্ছে। এটি করার জন্য অন্য কোনও কারণ থাকতে পারে?
আলেকজান্ডার ডিজোবা

3
এটা সত্যিই ESP থেকে সাব অপ্টিমাইজেশান যে নয়, কিন্তু যেহেতু আপনি আর আছে ESP থেকে সাব, আপনি বেস পয়েন্টার (সাধারণত ebp দ্বারা সম্পন্ন) এবং ব্যবহারের ebp ফাংশন কোডে অন্য কিছু যেমন ESP ব্যবহার করতে পারেন। শেষ অবধি, যেহেতু esp এখন বেস পয়েন্টার, তাই কোডটি পূর্বসূরী / উপবন্ধে ebp সংরক্ষণ এবং পুনরুদ্ধার এড়াতে পারে। আমি এই অতিরিক্ত তথ্যের সাথে উত্তরটি পরিষ্কার করব
ব্রায়ান ওন

এডিপি এবং ইপিপি / এসএসপি পরিবর্তে আরবিপি / আরএসপি পরিবর্তিত হয়েছে যেহেতু রেড জোনটি x86-64 এবিআইয়ের কেবলমাত্র একটি অংশ (যদিও 32 টি বিট রেজিস্টার সহ কোনও একই কৌশল ব্যবহার করতে কোনও কিছুই বাধা দেয় না; তবে কোনও সংকলক আজ সেভাবে করেন না)
ব্রায়ান ওন

1
ফ্রেম পয়েন্টার বাদ দেওয়া মোটেই রেড জোনের সাথে সম্পর্কিত নয় - সংকলকটি কোনওভাবেই %rspবেজ পয়েন্টার হিসাবে স্ট্যাকটিকে সূচক করতে পারে।
আলেকোভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.