উইন্ডোজ ৪ x x--- এ অন্য সমস্ত ওএস থেকে আলাদা কলিং কনভেনশন কেন ব্যবহার করে?


110

এএমডির একটি এবিআই স্পেসিফিকেশন রয়েছে যা x86-64 এ কল করার কনভেনশনটি বর্ণনা করে describes সমস্ত ওএসগুলি এটি অনুসরণ করে, উইন্ডোজ বাদে যার নিজস্ব x86-64 কলিং কনভেনশন রয়েছে। কেন?

কেউ কি এই পার্থক্যের প্রযুক্তিগত, ?তিহাসিক বা রাজনৈতিক কারণগুলি জানেন, বা এটি নিখুঁতভাবে NIHsyndrome এর বিষয়?

আমি বুঝতে পারি যে বিভিন্ন ওএসের উচ্চ স্তরের জিনিসগুলির জন্য বিভিন্ন প্রয়োজন থাকতে পারে, তবে এটি ব্যাখ্যা করে না যে উদাহরণস্বরূপ উইন্ডোজটিতে নিবন্ধক পরামিতিগুলি পাস করার ক্রম কেন rcx - rdx - r8 - r9 - rest on stackঅন্য প্রত্যেকে ব্যবহার করে rdi - rsi - rdx - rcx - r8 - r9 - rest on stack

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

সম্পাদনা করুন: কীভাবে, দেখুন উইকিপিডিয়া এন্ট্রি এবং সেখান থেকে লিঙ্কগুলি।


2
ঠিক আছে, কেবলমাত্র প্রথম নিবন্ধকের জন্য: আরসিএক্স: এক্সএক্স এমএসভিসি __thiscall x86 কনভেনশনের "এই" পরামিতি ছিল। তাই সম্ভবত তাদের সংকলকটি x64 এ পোর্ট করা সহজ করার জন্য, তারা প্রথম হিসাবে আরসিএক্স দিয়ে শুরু করেছিল। তারপরে যা কিছু ছিল তাও আলাদা হবে সেই প্রাথমিক সিদ্ধান্তের একটি পরিণতি।
ক্রিস বেক

@ ক্রিস: আমি এএমডি A৪ এবিআই পরিপূরক নথিতে (এবং এটি আসলে কী তা কিছু ব্যাখ্যা) নীচে একটি উল্লেখ যুক্ত করেছি।
ফ্র্যাঙ্কএইচ।

1
আমি মাইক্রোসফট থেকে একটি যুক্তিপূর্ণ খুঁজে পেলাম না কিন্তু আমি কিছু আলোচনা পাওয়া এখানে
phuclv

উত্তর:


81

নির্বাচন চার x64 উপর যুক্তি রেজিস্টার - ইউনিক্স / Win64 সাধারণ

X86 সম্পর্কে মনে রাখার একটি বিষয় হ'ল "রেজি নম্বর" এনকোডিংয়ের নিবন্ধের নাম সুস্পষ্ট নয়; নির্দেশনা এনকোডিংয়ের শর্তাবলী ( এমওডি আর / এম বাইট, দেখুন http://www.c-jump.com/CIS77/CPU/x86/X77_0060_mod_reg_r_m_by_.htm ), নম্বরগুলি নিবন্ধ করুন ... 7 - এই ক্রমে - ?AX, ?CX, ?DX, ?BX, ?SP, ?BP, ?SI, ?DI

সুতরাং প্রত্যাবর্তনের মান এবং প্রথম দুটি আর্গুমেন্ট (যা "ধ্রুপদী" 32 বিট __fastcallকনভেনশন) এর জন্য এ / সি / ডি (নিয়মিত 0..2 ) নির্বাচন করা একটি যৌক্তিক পছন্দ। যতদূর bit৪ বিবিটে যাওয়ার কথা, "উচ্চতর" রেগ অর্ডার করা হয় এবং মাইক্রোসফ্ট এবং ইউএন * এক্স / লিনাক্স উভয়ই প্রথম হিসাবে R8/ R9হিসাবে যায়।

মনে রাখা যে, মাইক্রোসফট পছন্দের RAX(ফেরত মান) এবং RCX, RDX, R8, R9(ARG [0..3]) একটি বোধগম্য নির্বাচন যদি আপনি নির্বাচন হয় চার আর্গুমেন্ট জন্য রেজিস্টার।

আমি জানি না কেন আগে AMD64 UN * X ABI বেছে RDXনিয়েছিল RCX

এক্স on৪ - ইউএন * এক্স-এর জন্য ছয়টি যুক্তি নিবন্ধগুলি নির্বাচন করা

ইউএন * এক্স, আরআইএসসি আর্কিটেকচারে, রেজিস্টারগুলিতে traditionতিহ্যগতভাবে যুক্তিগুলি পাস করেছেন - বিশেষত প্রথম ছয়টি যুক্তির জন্য (এটি পিপিসি, স্পার্ক, এমআইপিএস অন্তত)। যা এএমডি 64৪ (ইউএন * এক্স) এবিআই ডিজাইনাররা সেই আর্কিটেকচারে ছয়টি রেজিস্ট্রার ব্যবহার করার জন্য কেন বেছে নেওয়ার অন্যতম কারণ হতে পারে।

তাই আপনি যদি চান ছয় নিবন্ধনের আর্গুমেন্ট পাস, এবং এটা পছন্দ করে নিন লজিক্যাল এর RCX, RDX, R8এবং R9তাদের মধ্যে চার, এর জন্য অন্যান্য দুটি যা আপনি বাছাই করা উচিত?

এগুলি নির্বাচন করার জন্য "উচ্চতর" রেগুলিকে অতিরিক্ত নির্দেশের উপসর্গের বাইটের প্রয়োজন হয় এবং অতএব আরও বড় নির্দেশের আকারের পদচিহ্ন থাকে, সুতরাং আপনার যদি বিকল্প থাকে তবে আপনি সেগুলির মধ্যে কোনওটিই বেছে নিতে চান না। শাস্ত্রীয় নিবন্ধগুলির মধ্যে, এর অন্তর্নিহিত অর্থের কারণে RBPএবং RSPএগুলি উপলভ্য নয় এবং RBXtraditionতিহ্যগতভাবে ইউএন * এক্স (গ্লোবাল অফসেট টেবিল) -এ একটি বিশেষ ব্যবহার রয়েছে যা আপাতদৃষ্টিতে এএমডি A৪ এবিআই ডিজাইনার অকারণে বেমানান হতে চাননি।
কিন্তু, একমাত্র পছন্দ ছিল RSI/ RDI

সুতরাং আপনার যদি আর্গুমেন্ট রেজিস্ট্রার হিসাবে RSI/ নিতে হয় তবে RDIতাদের কোন যুক্তি হওয়া উচিত?

তাদের মেকিং arg[0]এবং arg[1]কিছু সুফল রয়েছে। সিএইচওর মন্তব্য দেখুন।
?SIএবং ?DIস্ট্রিং ইন্সট্রাকশন সোর্স / গন্তব্য অপারেশনস এবং সিএইচও যেমন উল্লিখিত হয়েছে, তাদের আর্গুমেন্ট রেজিস্টার হিসাবে ব্যবহারের অর্থ AMD64 ইউএন * এক্স কলিং কনভেনশনগুলির সাথে, সহজতম strcpy()ফাংশন, উদাহরণস্বরূপ, কেবলমাত্র দুটি সিপিইউ নির্দেশাবলী নিয়ে থাকে repz movsb; retকারণ উত্স / লক্ষ্য ফোনকারী ঠিকানাগুলি সঠিক রেজিস্টারে রেখেছেন। বিশেষত নিম্ন-স্তরের এবং সংকলক-উত্পাদিত "আঠালো" কোডে রয়েছে (উদাহরণস্বরূপ, কিছু সি ++ হিপ বরাদ্দকারী নির্মাণে শূন্য-ফিলিং বস্তু বা কার্নেল শূন্য-পূরণের হিপ পৃষ্ঠাগুলি রয়েছে)sbrk(), বা অনুলিপি-লিখিত পেজফাল্টগুলি) বিপুল পরিমাণে অনুলিপি অনুলিপি / পূরণ করুন, সুতরাং দুটি বা তিনটি সিপিইউ নির্দেশনা সংরক্ষণ করার জন্য এটি কোডের জন্য প্রায়শই ব্যবহৃত হবে যা অন্যথায় এ জাতীয় উত্স / লক্ষ্য ঠিকানা যুক্তিগুলি লোড করবে the "সঠিক" নিবন্ধগুলি।

তাই একটি উপায়, জাতিসংঘের * X এবং Win64 যে ইউনিক্স "prepends" দুটি অতিরিক্ত আর্গুমেন্ট, উদ্দেশ্যপূর্ণ মনোনীত একমাত্র ভিন্ন RSI/ RDIরেজিস্টার, চার আর্গুমেন্ট প্রাকৃতিক পছন্দের RCX, RDX, R8এবং R9

যে অতিক্রম ...

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

http://msdn.microsoft.com/en-us/library/7kcdt6fy.aspx

উইন 64৪ এবং এএমডি UN৪ ইউএন * এক্স স্ট্যাকস্পেস ব্যবহারের পদ্ধতিতেও উল্লেখযোগ্যভাবে পৃথক; উইন on৪ তে, উদাহরণস্বরূপ, কলকারীকে অবশ্যই আর্গুমেন্টগুলির জন্য স্ট্যাকস্পেস বরাদ্দ করতে হবে যদিও নিবন্ধগুলিতে 0 ... 3 পাস করা হয়েছে passed অন্যদিকে ইউএন * এক্স-তে, একটি পাতার ফাংশন (যেমন একটি যা অন্য ফাংশনগুলিকে ডাকে না) এমনকি স্ট্যাকস্পেস বরাদ্দ করার প্রয়োজন নেই এমনকি যদি এটির 128 বাইটের বেশি প্রয়োজন না হয় (হ্যাঁ, আপনি নিজের এবং এটি ব্যবহার করতে পারেন) এটিকে বরাদ্দ না করেই একটি নির্দিষ্ট পরিমাণের স্ট্যাক ... ভাল, যদি না আপনি কার্নেল কোড হন, নিফ্টি বাগের উত্স)। এগুলি সমস্ত নির্দিষ্ট অপ্টিমাইজেশনের পছন্দ, মূল পোস্টারের উইকিপিডিয়া রেফারেন্সটি নির্দেশ করে যেগুলির জন্য বেশিরভাগ যুক্তি পূর্ণ এবিআই রেফারেন্সে ব্যাখ্যা করা হয়েছে।


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

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

1
@ সিএইচও: না। তবে তারা যেভাবেই হোক এটিকে পরিবর্তন করেছে। উইন 64 এবিআই উইন 32 এর থেকে পৃথক (এবং সুসংগত নয়) এবং এটিএমডি এবিআই থেকেও আলাদা।
জানকানিস

7
@ সোমজান: উইন 6464 এবং উইন __fastcall২ টি 32 বিট এর চেয়ে বেশি দুটি যুক্তি না থাকার এবং 32 বিটের চেয়ে বেশি কোনও মান ফেরত দেওয়ার ক্ষেত্রে 100% অভিন্ন। এটি ফাংশনগুলির একটি ছোট শ্রেণির নয়। আই386 / এএমডি 64 এর জন্য ইউএন * এক্স এবিআই-এর মধ্যে এ জাতীয় কোনও পশ্চাতে সামঞ্জস্যতা মোটেই সম্ভব নয়।
ফ্র্যাঙ্কএইচ।

2
@ এসজেএক্স: আমি মাত্র 2000 সালের নভেম্বর থেকে প্রাসঙ্গিক মেইলিং লিস্টের থ্রেড পেয়েছি এবং যুক্তির সংক্ষিপ্তসার হিসাবে একটি উত্তর পোস্ট করেছি। নোট এটি এতই memcpyযে যে ভাবে বাস্তবায়িত করা যায়নি, না strcpy
পিটার কর্ডেস

42

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

এটিএমডি আর্কিটেক্টরা এতে সক্রিয় থাকায় এটি এএমডি mail৪ মেলিং তালিকায় সেই পুরানো থ্রেডগুলির কয়েকটি পড়ার আগ্রহজনক। উদাহরণস্বরূপ নিবন্ধকের নাম নির্বাচন করাই একটি অন্যতম শক্ত অংশ ছিল: এএমডি মূল 8 টি রেজিস্টারগুলির নাম পরিবর্তন করে r0-r7 বা নতুন রেজিস্টারগুলিকে পছন্দ করে বলে বিবেচনা করেUAX

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


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

তিনি "গ্লোবাল" শব্দটি ব্যবহার করছেন কল-সংরক্ষিত রেজিস্টারগুলিকে বোঝাতে, যা ব্যবহৃত হলে পুশ / পপড হতে হবে।

পছন্দমত rdi, rsi, rdxযেমন প্রথম তিন args দ্বারা প্রেরণা ছিল:

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

    (পটভূমি: syscall/ sysretঅপরিহার্যভাবে rcx(সহ rip) এবং r11(সহ RFLAGS) ধ্বংস করুন , যাতে কার্নেলটি দৌড়ানোর rcxসময় মূলত কী ছিল তা দেখতে পারে না syscall))

কার্নেল সিস্টেম-কল এবিআই ফাংশন কল এবিআইয়ের সাথে মিলিত হওয়ার জন্য বেছে নেওয়া হয়েছিল, এর r10পরিবর্তে rcx, সুতরাং একটি লিবিসি র‌্যাপার ফাংশন mmap(2)কেবল mov %rcx, %r10/ mov $0x9, %eax/ করতে পারে syscall


নোট করুন যে আই 386 লিনাক্স দ্বারা ব্যবহৃত এসআইএসভি কলিং কনভেনশন উইন্ডোর 32 বিট __ভেক্টরকালের তুলনায় সাফল্য অর্জন করে। এটি স্ট্যাকের সমস্ত কিছু পাস করে এবং কেবলমাত্র edx:eaxছোট স্ট্রকের জন্য নয়, কেবলমাত্র 64 এর জন্য ফিরে আসে । এটির সাথে সামঞ্জস্যতা বজায় রাখার জন্য সামান্য প্রচেষ্টা করা অবাক হওয়ার কিছু নেই। যখন না করার কোনও কারণ নেই, তারা rbxকল-সংরক্ষিত রাখার মতো কাজ করেছিলেন , যেহেতু তারা সিদ্ধান্ত নিয়েছিলেন যে আসল ৮-এ (যার জন্য কোনও রেক্স উপসর্গের দরকার নেই) ভাল থাকা ভাল।

ABI- র অনুকূল করছে অনেক বেশি গুরুত্বপূর্ণ অন্য কোন বিবেচনা চেয়ে দীর্ঘমেয়াদী। আমি মনে করি তারা বেশ ভাল কাজ করেছে। আমি রেজিস্টারগুলিতে প্যাকযুক্ত স্ট্রাক্টগুলি ফেরত দেওয়ার বিষয়ে সম্পূর্ণ নিশ্চিত নই, বিভিন্ন রেগের বিভিন্ন ক্ষেত্রের পরিবর্তে। আমি অনুমান করি যে কোডগুলি ক্ষেত্রগুলিতে এই পদ্ধতিতে পরিচালনা না করে মান দিয়ে তাদের পাস করে তবে আনপ্যাকিংয়ের অতিরিক্ত কাজটি নির্বোধ বলে মনে হয়। তাদের আরও বেশি পূর্ণসংখ্যার রিটার্ন রেজিস্টার থাকতে পারে, কেবল মাত্র rdx:rax4 জন সদস্যের সাথে একটি স্ট্রাক্ট ফেরত পাঠানো তাদের আরডিআই, আরএসআই, আরডিএক্স, র্যাক্স বা অন্য কোনও কিছুতে ফিরিয়ে দিতে পারে।

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


আমি সন্দেহ করি যে উইন্ডোজ এবিআই ডিজাইনাররা সেই লোকের সুবিধার্থে 32 এবং 64 বিটের মধ্যে পার্থক্য হ্রাস করতে পারে যা একটির থেকে অন্যের জন্য asm পোর্ট করতে হয়, বা এটি #ifdefকোনও ASM তে একটি দম্পতি ব্যবহার করতে পারে যাতে একই উত্সটি আরও সহজে তৈরি করতে পারে একটি ফাংশনের 32 বা 64 বিট সংস্করণ।

সরঞ্জামচেইনে পরিবর্তনগুলি হ্রাস করা অসম্ভব বলে মনে হচ্ছে। কোনও x86-64 সংকলকটির একটি পৃথক টেবিলের প্রয়োজন যাগুলির নিবন্ধটি কী এবং কলিং কনভেনশনটি কী জন্য ব্যবহৃত হয় what 32 বিট এর সাথে একটি ছোট ওভারল্যাপ থাকলে সরঞ্জামচেন কোড আকার / জটিলতায় উল্লেখযোগ্য সঞ্চয় উত্পাদন সম্ভব নয়।


1
আমি মনে করি এমএস পাশ থেকে বেঞ্চমার্কিংয়ের পরে সেই রেজিস্ট্রিগুলি বেছে নেওয়ার যৌক্তিকতা সম্পর্কে আমি রেমন্ড চেনের ব্লগে কোথাও পড়েছি তবে আমি এটি আর খুঁজে পাচ্ছি না। তবে হোমজোন সম্পর্কিত কিছু কারণ এখানে ব্লগস.এমএসএন.এম.সি.এস.ফোল্ডারস /
p


@ ফুকলভ: আরও দেখুন ইএসপি-র নীচে লেখা কি বৈধ? । আমার উত্তর সম্পর্কে রেমন্ডের মন্তব্যগুলি এমন কিছু এসইএইচ বিবরণ নির্দেশ করেছে যেখানে আমি জানিনা যা x86 32/64 উইন্ডোজটিতে বর্তমানে ডি-ফ্যাক্টো রেড জোন নেই explain তাঁর ব্লগ পোস্টটিতে একই কোড পৃষ্ঠা-হ্যান্ডলার সম্ভাবনার জন্য কিছু প্রশংসনীয় কেস রয়েছে যা আমি উত্তরটিতে উল্লেখ করেছি :) সুতরাং হ্যাঁ, রাইমন্ড এটির চেয়ে ব্যাখ্যা করার চেয়ে ভাল কাজ করেছিলেন আমার চেয়ে (আশ্চর্যজনক কারণ আমি উইন্ডোজ সম্পর্কে খুব কমই জানতে শুরু করেছি), এবং নন- x86 এর জন্য রেড-জোন মাপের সারণীটি সত্যই ঝরঝরে।
পিটার কর্ডেস

13

মনে রাখবেন যে মাইক্রোসফ্ট প্রাথমিকভাবে "প্রাথমিকভাবে এএমডি effort64 প্রয়াসের দিকে আনুষ্ঠানিক ছিল" ( ম্যাথু কর্নার এবং নীল প্যাজেট দ্বারা রচিত "হিস্ট্রি অফ মডার্ন -৪-বিট কম্পিউটিং" থেকে ) কারণ তারা আইএ 6464 আর্কিটেকচারে ইন্টেলের সাথে দৃ with় অংশীদার ছিল। আমি মনে করি যে এর অর্থ এই ছিল যে তারা অন্যথায় ইউবিস ও উইন্ডোজে উভয়ই এবিআই-তে জিসিসি ইঞ্জিনিয়ারদের সাথে কাজ করার জন্য উন্মুক্ত থাকলেও তারা এটি করতে পারত না, কারণ এটি প্রকাশের পরে এএমডি 64 effort প্রয়াসকে প্রকাশ্যে সমর্থন করার অর্থ ছিল ' টি এখনও আনুষ্ঠানিকভাবে এটি করা হয়েছে (এবং সম্ভবত ইন্টেলকে বিরক্ত করবে)।

সর্বোপরি, সেই দিনগুলিতে ওপেন সোর্স প্রকল্পগুলির সাথে বন্ধুত্বপূর্ণ হওয়ার জন্য মাইক্রোসফ্টের একেবারে কোনও ঝোঁক ছিল না। অবশ্যই লিনাক্স বা জিসিসি নয়।

তাহলে তারা কেন এবিআইতে সহযোগিতা করবে? আমি অনুমান করতে পারি যে এবিআই অন্যদের চেয়ে ভিন্ন কারণ কেবল সেগুলি কমবেশি একই সময়ে এবং বিচ্ছিন্নভাবে ডিজাইন করা হয়েছিল।

"আধুনিক ইতিহাসের -৪-বিট কম্পিউটিংয়ের ইতিহাস" এর আরও একটি উদ্ধৃতি:

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

ওয়েবার এ পর্যন্ত বলেছিলেন যে লিনাক্সের কাজটি এএমডি's৪ এর সাফল্যের জন্য একেবারে গুরুত্বপূর্ণ ছিল, কারণ এটি যদি প্রয়োজন হয় তবে অন্য কোনও সংস্থার সাহায্য ছাড়াই এএমডিকে শেষ থেকে শেষের একটি সিস্টেম তৈরি করতে সক্ষম করে। এই সম্ভাবনাটি নিশ্চিত করেছে যে অন্যান্য অংশীদারদের ব্যাকআপ না দেওয়া সত্ত্বেও এএমডির সবচেয়ে খারাপ পরিস্থিতি বেঁচে থাকার কৌশল ছিল, যার ফলস্বরূপ অন্যান্য অংশীদাররা তাদের পিছনে চলে যাওয়ার ভয়ে নিমগ্ন ছিল।

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

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


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

1
আমার কাছে সত্যিই কোনও দক্ষতা বা জ্ঞান নেই যে এবিআইরা কতটা ভাল । আমার মাঝে মাঝে কেবল সেগুলি কী তা জানতে হবে যাতে আমি সমাবেশ পর্যায়ে বুঝতে / ডিবাগ করতে পারি।
মাইকেল বুড়

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

1
@ ডিগনফ: ঠিক আছে, কার্নেল কোড কেন রেড জোন ব্যবহার করতে পারে না তার উত্তর । বিঘ্নগুলি কার্নেল স্ট্যাক ব্যবহার করে, ব্যবহারকারী-স্পেস স্ট্যাকটি ব্যবহার করে না, এমনকি সিপিইউ ব্যবহারকারী-স্পেস কোড চলমান থাকলেও তারা উপস্থিত হয়। কার্নেলটি ব্যবহারকারী-স্থানের স্ট্যাকগুলিতে বিশ্বাস করে না কারণ একই ব্যবহারকারী-স্থান প্রক্রিয়াতে থাকা অন্য একটি থ্রেড এটি পরিবর্তন করতে পারে, এভাবে কার্নেলের নিয়ন্ত্রণ গ্রহণ করে!
পিটার কর্ডস

1
@ DavidA.Gray: হাঁ, ABI- র বলে না আপনি আছে তাই অপ্টিমাইজ কোড সাধারণত না একটি ফ্রেম পয়েন্টার হিসাবে RBP ব্যবহার করবেন (ফাংশন ছাড়া ব্যবহারের allocaবা কয়েক অন্যান্য ক্ষেত্রে)। আপনি যদি gcc -fomit-frame-pointerলিনাক্সে ডিফল্ট হতে অভ্যস্ত হন তবে এটি স্বাভাবিক । এবিআই স্ট্যাক-আনওয়াইন্ড মেটাডেটা সংজ্ঞায়িত করে যা ব্যতিক্রম হ্যান্ডলিংটিকে এখনও কাজ করতে দেয়। (আমি ধরে নিলাম এটি জিএনইউ / লিনাক্স x86-64 সিস্টেম ভি এর সিএফআই স্টাফের মতো কিছু কাজ করে .eh_frame)। gcc -fomit-frame-pointerx86-64 থেকে চিরকালের জন্য ডিফল্ট (অপ্টিমাইজেশান সক্ষম সহ) হয়েছে এবং অন্যান্য সংকলক (যেমন এমএসভিসি) একই কাজ করে।
পিটার কর্ডেস

12

উইন 32 এর ইএসআই এবং ইডিআইয়ের নিজস্ব ব্যবহার রয়েছে এবং এগুলি সংশোধন করা উচিত নয় (বা কমপক্ষে তারা এপিআইতে কল করার আগে পুনরুদ্ধার করা উচিত)। আমি কল্পনা করেছিলাম 64৪-বিট কোডটি আরএসআই এবং আরডিআইয়ের সাথে একই রকম হয়, যা ব্যাখ্যা করবে যে তারা কেন চারপাশে ফাংশন যুক্তিগুলি ব্যবহার করতে ব্যবহৃত হচ্ছে না।

যদিও আপনাকে বলতে পারি না কেন আরসিএক্স এবং আরডিএক্স স্যুইচ করা হয়েছে।


1
সমস্ত কলিং কনভেনশনে কিছু নিবন্ধগুলি স্ক্র্যাচ হিসাবে মনোনীত করা হয় এবং কিছু উইন 64 এ ESI / EDI এবং RSI / RDI এর মতো সংরক্ষিত থাকে। তবে এগুলি সাধারণ উদ্দেশ্যে নিবন্ধভুক্ত, মাইক্রোসফ্ট এগুলি অন্যভাবে ব্যবহার করতে সমস্যা ছাড়াই বেছে নিতে পারত।
জানকানিস

1
@ সোমজান: অবশ্যই, তারা যদি পুরো এপিআই লিখতে চায় এবং দুটি আলাদা ওএস থাকে। যদিও আমি "সমস্যা ছাড়াই" কল করব না। কয়েক ডজন বছর ধরে, এমএস x86 রেজিস্টারগুলির সাথে এটি কী করবে এবং কী করবে না সে সম্পর্কে নির্দিষ্ট প্রতিশ্রুতি দিয়েছিল এবং তারা পুরোপুরি কম-বেশি সামঞ্জস্যপূর্ণ এবং সামঞ্জস্যপূর্ণ ছিল। তারা এএমডি-র কিছু আদেশের কারণে উইন্ডোটি ছুঁড়ে ফেলবে না, বিশেষত একজন এত নির্বিচারে এবং "প্রসেসর তৈরির" রাজত্বের বাইরে।
সিএইচও

5
@ সোমজান: এএমডি 64 ইউএন * এক্স এবিআই সর্বদা হ'ল - একটি ইউনিক্স-নির্দিষ্ট অংশ piece দস্তাবেজ, x86-64.org/documentation/abi.pdf শীর্ষক হয় সিস্টেম ভী অ্যাপ্লিকেশন বাইনারি ইন্টারফেস, AMD64 আর্কিটেকচারের প্রসেসর সাপ্লিমেন্ট একটি কারণে। (সাধারণ) ইউনিক্স এবিআই (একটি বহু-আয়তনের সংগ্রহ, sco.com/developers/devspecs ) প্রসেসর-নির্দিষ্ট অধ্যায় 3 - পরিপূরক - যা কোনও নির্দিষ্ট প্রসেসরের জন্য ফাংশন কলিং কনভেনশন এবং ডেটা বিন্যাসের নিয়মগুলির জন্য একটি বিভাগ রেখে দেয়।
ফ্র্যাঙ্কএইচ।

7
@ সোমজান: মাইক্রোসফ্ট উইন্ডোজ কখনই বিশেষত ইউএন * এক্স এর খুব কাছাকাছি থাকার চেষ্টা করেনি এবং যখন উইন্ডোজকে এক্স 64৪ / এএমডি to৪ এ বন্দরিত করার কথা আসে তখন তারা কেবল তাদের নিজস্ব __fastcall কলিং কনভেনশনকে বাড়িয়ে তোলা বেছে নিয়েছিল । আপনি দাবি win32 / Win64 সুসংগত নয়, কিন্তু তারপর, ঘনিষ্ঠভাবে চেহারা: একটি ফাংশন যা লাগে জন্য দুই 32bit args এবং আয় 32bit, Win64 এবং Win32 __fastcallআসলে হয় 100% সামঞ্জস্যপূর্ণ (দুই 32bit args, একই ফেরত মান ক্ষণস্থায়ী জন্য একই regs)। এমনকি কিছু বাইনারি (!) কোড উভয় অপারেটিং মোডে কাজ করতে পারে। ইউনিক্সের পক্ষটি "পুরানো উপায়" দিয়ে পুরোপুরি ভেঙে গেছে। সঙ্গত কারণে, তবে বিরতি বিরতি is
ফ্র্যাঙ্কএইচ।

2
@ অলফ: এটি কেবল একটি সংকলক জিনিসই বেশি। আমি যখন এনএএসএম-এ স্ট্যান্ডেলোন স্টাফ করতাম তখন ইএসআই এবং ইডিআই নিয়ে আমার সমস্যা ছিল। উইন্ডোজ অবশ্যই নিবন্ধগুলি সম্পর্কে যত্নশীল। তবে হ্যাঁ, আপনি এগুলি ব্যবহার করার আগে সেগুলি সংরক্ষণ করতে এবং উইন্ডোজগুলির প্রয়োজনের পূর্বে পুনরুদ্ধার করা থাকলে আপনি সেগুলি ব্যবহার করতে পারেন।
সিএওও
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.