এখানে যে কোনও বিষয়ের জন্য আরও পড়া: লিনাক্স সিস্টেম কলগুলির সংজ্ঞা নির্দেশিকা
আমি লিনাক্সে জিএনইউ এসেমব্লার (গ্যাস) ব্যবহার করে এগুলি যাচাই করেছি।
কার্নেল ইন্টারফেস
x86-32 ওরফে আই 386 লিনাক্স সিস্টেম কল কনভেনশন:
X86-32 এ লিনাক্স সিস্টেমের জন্য প্যারামিটারগুলি রেজিস্টারগুলি ব্যবহার করে পাস করা হয়। %eax
syscall_number এর জন্য। সিস্টেম কলগুলিতে, পরামিতি পাস করার জন্য% ইবিএক্স,% এক্সএক্স,% এডিএক্স,% এসি,% এডি,% ইবিপি ব্যবহার করা হয়।
রিটার্ন মান আছে %eax
। অন্যান্য সমস্ত নিবন্ধক (EFLAGS সহ) পুরো জুড়ে সংরক্ষিত আছে int $0x80
।
লিনাক্স অ্যাসেম্বলি টিউটোরিয়াল থেকে আমি নিম্নলিখিত স্নিপেট নিয়েছি তবে আমি এ সম্পর্কে সন্দেহজনক। কেউ যদি উদাহরণ দেখাতে পারে তবে দুর্দান্ত হবে।
যদি ছয়টিরও বেশি আর্গুমেন্ট
%ebx
থাকে তবে অবশ্যই মেমরির অবস্থান থাকতে হবে যেখানে আর্গুমেন্টের তালিকাটি সংরক্ষণ করা আছে - তবে এটি সম্পর্কে চিন্তা করবেন না কারণ আপনি ছয়টিরও বেশি যুক্তি সহ একটি সিস্কেল ব্যবহার করবেন না এর সম্ভাবনা কম।
উদাহরণ এবং আরও কিছু পড়ার জন্য, http://www.int80h.org/bsdasm/#alternate-calling-conferences দেখুন । আই 386 লিনাক্সের জন্য হ্যালো ওয়ার্ল্ডের আরেকটি উদাহরণ ব্যবহার করে int 0x80
: হ্যালো, লিনাক্স সিস্টেমের সাথে সমাবেশ ভাষায় বিশ্ব?
32-বিট সিস্টেম কল করার আরও দ্রুত উপায় রয়েছে: ব্যবহার করে sysenter
। কার্নেল sysenter
নৃত্যের ব্যবহারকারী-স্থানের সাথে প্রতিটি প্রক্রিয়াতে (ভিডিএসও) মেমরির একটি পৃষ্ঠার মানচিত্র তৈরি করে, যাতে ফেরতের ঠিকানাটি সন্ধান করতে সক্ষম হওয়ার জন্য কার্নেলের সাথে সহযোগিতা করতে হবে। ম্যাপিং রেজিস্টার করতে আর্গ হিসাবে একই int $0x80
। আপনার sysenter
সরাসরি ব্যবহারের পরিবর্তে ভিডিএসওতে কল করা উচিত । ( ভিডিএসওতে লিঙ্ক করা এবং কল করার বিষয়ে তথ্যের জন্য এবং সিস্টেম কলগুলির সাথে করার জন্য সমস্ত কিছুর জন্য লিনাক্স সিস্টেম কলগুলির সংজ্ঞা গাইড দেখুন See sysenter
)
x86-32 [ফ্রি | ওপেন | নেট | ড্রাগনফ্লাই] বিএসডি ইউনিক্স সিস্টেম কল কনভেনশন:
স্ট্যাকের উপর প্যারামিটারগুলি পাস করা হয়। স্ট্যাকের উপর প্যারামিটারগুলি (সর্বশেষ প্যারামিটারটি প্রথমে ধাক্কা দেওয়া) পুশ করুন। তারপরে অতিরিক্ত 32-বিট ডামি ডেটা চাপুন (এটি আসলে ডামি ডেটা নয় more আরও তথ্যের জন্য নিম্নলিখিত লিঙ্কটি দেখুন) এবং তারপরে একটি সিস্টেম কল নির্দেশ দিনint $0x80
http://www.int80h.org/bsdasm/#default-calling-convention
x86-64 লিনাক্স সিস্টেম কল কনভেনশন:
x86-64 ম্যাক ওএস এক্স একই তবে ভিন্ন । টোডো: বিএসডি কি করে তা পরীক্ষা করে দেখুন।
বিভাগটি দেখুন: সিস্টেম ভি অ্যাপ্লিকেশন বাইনারি ইন্টারফেস এএমডি 64 আর্কিটেকচার প্রসেসরের পরিপূরক এর "A.2 AMD64 লিনাক্স কার্নেল কনভেনশনস" । I386 এবং x86-64 সিস্টেম ভি PSABI- র সর্বশেষ সংস্করণগুলি এবিআই রক্ষণাবেক্ষণকারীটির রেপোতে এই পৃষ্ঠা থেকে লিঙ্কযুক্ত পাওয়া যাবে । (এছাড়াও দেখুনএক্স 86 আপ-টু-ডেট এবিআই লিঙ্কগুলির জন্য ট্যাগ উইকি এবং x86 এএসএম সম্পর্কিত আরও অনেক ভাল জিনিস)
এই বিভাগ থেকে স্নিপেট এখানে:
- ব্যবহারকারী-স্তরের অ্যাপ্লিকেশনগুলি% rdi,% rsi,% rdx,% rcx,% r8 এবং% r9 অনুক্রমটি পাস করার জন্য পূর্ণসংখ্যা নিবন্ধ হিসাবে ব্যবহার করে। কার্নেল ইন্টারফেসটি% rdi,% rsi,% rdx,% r10,% r8 এবং% r9 ব্যবহার করে।
syscall
নির্দেশের মাধ্যমে একটি সিস্টেম-কল করা হয় । এই ক্লোবারগুলি% আরসিএক্স এবং% আর 11 পাশাপাশি% র্যাক্স রিটার্ন মান, তবে অন্যান্য নিবন্ধগুলি সংরক্ষিত রয়েছে।
- সিস্কাল নম্বরটি% রেক্স রেজিস্টারে পাস করতে হবে।
- সিস্টেম-কলগুলি ছয়টি আর্গুমেন্টের মধ্যে সীমাবদ্ধ, স্ট্যাকের কোনও যুক্তি সরাসরি পাস করা হয় না।
- সিস্কেল থেকে ফিরে,% rax রেজিস্টারে সিস্টেম কলের ফলাফল রয়েছে। -4095 এবং -1 এর মধ্যে সীমার মান একটি ত্রুটি নির্দেশ করে, এটি
-errno
।
- কেবলমাত্র INTEGER বা MEMORY ক্লাসের মানগুলি কার্নেলে প্রেরণ করা হয়।
মনে রাখবেন এটি লিনাক্স-সংক্রান্ত পরিশিষ্ট থেকে এবিআইয়ের, এবং এমনকি লিনাক্সের জন্য এটি তথ্যগত নয়। (তবে এটি সত্যই সঠিক))
এই 32-বিট int $0x80
ABI- র হয় (কিন্তু অত্যন্ত প্রস্তাবিত নয়) 64-বিট কোডে ব্যবহারযোগ্য। আপনি যদি 32-বিট ইন্ট 0x80 লিনাক্স এবিআই 64-বিট কোড ব্যবহার করেন তবে কি হবে? এটি এখনও এর ইনপুটগুলি 32-বিটে ছাঁটাই করে, তাই এটি পয়েন্টারগুলির পক্ষে অনুপযুক্ত এবং এটি r8-r11 শূন্য করে।
ইউজার ইন্টারফেস: ফাংশন কলিং
x86-32 ফাংশন কলিং কনভেনশন:
X86-32 এ প্যারামিটারগুলি স্ট্যাকের উপর দিয়ে গেছে। সমস্ত পরামিতিগুলি সম্পন্ন না করা এবং তারপরে call
নির্দেশনা কার্যকর না হওয়া পর্যন্ত সর্বশেষ প্যারামিটারটি প্রথমে স্ট্যাকের দিকে ধাক্কা দেওয়া হয়েছিল। এটি সমাবেশ থেকে লিনাক্সে সি লাইব্রেরি (libc) ফাংশন কল করার জন্য ব্যবহৃত হয়।
I386 সিস্টেম ভি এবিআই (লিনাক্সে ব্যবহৃত) এর আধুনিক সংস্করণগুলির জন্য x86-64 সিস্টেম ভি এবিআইর মতো বরাবরই আবশ্যক যেমন, এর %esp
আগে 16-বাইট প্রান্তিককরণ call
প্রয়োজন। কলিগুলিকে এটি ধরে নিতে এবং এসইএসই 16-বাইট লোড / স্টোর যে সাইন ইন না করা রয়েছে সেগুলি ব্যবহার করার অনুমতি দেওয়া হয়। তবে historতিহাসিকভাবে, লিনাক্সের জন্য কেবল 4-বাইট স্ট্যাক সারিবদ্ধকরণ প্রয়োজন, তাই এটি 8-বাইট double
বা অন্য কোনও কিছুর জন্য প্রাকৃতিকভাবে সংযুক্ত স্থান সংরক্ষণ করতে অতিরিক্ত কাজও লাগল ।
কিছু অন্যান্য আধুনিক 32-বিট সিস্টেমে 4 বাইট স্ট্যাক সারিবদ্ধকরণের এখনও দরকার নেই।
x86-64 সিস্টেম ভি ব্যবহারকারী-স্পেস ফাংশন কলিং কনভেনশন:
x86-64 সিস্টেম ভি রেজিস্টারগুলিতে অর্গগুলি পাস করে যা i386 সিস্টেম ভি এর স্ট্যাক আরগস কনভেনশন থেকে বেশি দক্ষ। এটি মেমরির (ক্যাশে) আরগগুলি সংরক্ষণ করার এবং তারপরে এটিকে আবার ক্যালিতে আবার লোড করার বিলম্ব এবং অতিরিক্ত নির্দেশাবলী এড়িয়ে চলে। এটি আরও ভালভাবে কাজ করে কারণ আরও রেজিস্টার উপলব্ধ রয়েছে এবং আধুনিক উচ্চ-পারফরম্যান্স সিপিইউগুলির পক্ষে আরও ভাল যেখানে ল্যাটেন্সি এবং অফ-অর্ডার কার্যকর করার বিষয়টি রয়েছে। (আই 386 এবিআই খুব পুরানো)।
এই নতুন পদ্ধতিতে: প্রথম প্যারামিটারগুলি ক্লাসে বিভক্ত। প্রতিটি প্যারামিটারের শ্রেণি নির্ধারণ করে যে এটি কল করা ফাংশনে কীভাবে প্রেরণ করা হয়।
সম্পূর্ণ তথ্যের জন্য দেখুন: সিস্টেম ভি অ্যাপ্লিকেশন বাইনারি ইন্টারফেস এএমডি 64 আর্কিটেকচার প্রসেসর পরিপূরক এর "3.2 ফাংশন কলিং সিকোয়েন্স" যা অংশটি পড়ে:
একবার আর্গুমেন্ট শ্রেণিবদ্ধ করা হয়, নিবন্ধগুলি নিম্নলিখিত হিসাবে পাস করার জন্য (বাম থেকে ডান ক্রমে) বরাদ্দ দেওয়া হয়:
- ক্লাসটি যদি স্মৃতিচিহ্ন হয় তবে স্ট্যাকের উপর আর্গুমেন্টটি পাস করুন।
- ক্লাসটি যদি ইন্টিগের হয় তবে% rdi,% rsi,% rdx,% rcx,% r8 এবং% r9 এর পরবর্তী উপলব্ধ রেজিস্টার ব্যবহার করা হবে
সুতরাং %rdi, %rsi, %rdx, %rcx, %r8 and %r9
রেজিস্টার হয় অনুক্রমে সমাবেশ থেকে কোন libc ফাংশন পূর্ণসংখ্যা / পয়েন্টার (অর্থাত পূর্ণসংখ্যা বর্গ) পরামিতি পাস করতেন। % rdi প্রথম INTEGER প্যারামিটারের জন্য ব্যবহৃত হয়। 2 য় জন্য% rsi, 3 য় জন্য% rdx এবং আরও অনেক কিছু। তারপরে call
নির্দেশ দেওয়া উচিত। কার্যকর করার সময় স্ট্যাকটি ( %rsp
) অবশ্যই 16 বি-এ্যালাইন্টড থাকতে হবে call
।
যদি 6 টিরও বেশি INTEGER প্যারামিটার থাকে তবে 7 তম INTEGER পরামিতি এবং পরে স্ট্যাকের উপর দিয়ে দেওয়া হয়। (কলার পপস, x86-32 এর মতো।)
প্রথম 8 ভাসমান পয়েন্ট আরগগুলি% xmm0-7 এ পরে স্ট্যাকের পরে পাস করা হয়। কোনও কল-সংরক্ষিত ভেক্টর নিবন্ধ নেই। (এফপি এবং পূর্ণসংখ্যার যুক্তিগুলির মিশ্রণ সহ একটি ফাংশনে মোট 8 টিরও বেশি নিবন্ধক যুক্তি থাকতে পারে))
ভারিয়াদিক ফাংশনগুলির ( যেমনprintf
) সর্বদা প্রয়োজন %al
= এফপি নিবন্ধের আর্গগুলির সংখ্যা।
rdx:rax
মেমরিতে রেজিস্টারগুলিতে স্ট্রাক্ট কখন প্যাক করবেন ( রিটার্নে) এর বিধি রয়েছে । বিশদ বিবরণের জন্য এবিআই দেখুন এবং আপনার কোড কীভাবে পাস / ফিরিয়ে দেওয়া উচিত সে সম্পর্কে কম্পাইলারগুলির সাথে একমত হয় তা নিশ্চিত করার জন্য সংকলক আউটপুট পরীক্ষা করে দেখুন।
নোট করুন যে উইন্ডোজ এক্স 64 ফাংশন কলিং কনভেনশনের x86-64 সিস্টেম ভি থেকে একাধিক উল্লেখযোগ্য পার্থক্য রয়েছে, যেমন ছায়া স্পেস যা অবশ্যই কলার দ্বারা সংরক্ষণ করা উচিত (রেড-জোনের পরিবর্তে), এবং কল-সংরক্ষিত xmm6-xmm15। আরগো যার মধ্যে কোন রেজিস্টারে যায় তার জন্য খুব আলাদা নিয়ম।