কেউ কি নীচের সমাবেশ কোডটি ব্যাখ্যা করতে পারে?
int 0x80
উত্তর:
এটি ভেক্টর 0x80 বাধা দিতে নিয়ন্ত্রণ পাস করে
Http://en.wikedia.org/wiki/Interrupt_vector দেখুন
লিনাক্স এ, কটাক্ষপাত আছে এই : এটি পরিচালনা করতে ব্যবহৃত হয় system_call
। অবশ্যই অন্য কোনও ওএসে এটির অর্থ সম্পূর্ণ আলাদা।
int 0x80
বিশেষভাবে call
নির্বাচিত eax
) বিশেষ ধরণের হিসাবে বিবেচনা করা উচিত of
int
মানে বাধা, এবং সংখ্যাটি 0x80
হ'ল বাধা সংখ্যা। একটি বাধা প্রোগ্রাম প্রবাহকে যার কাছে এই বিঘ্নিত পরিচালনা করে, যা 0x80
এই ক্ষেত্রে বাধা রয়েছে তা হস্তান্তর করে । লিনাক্সে, 0x80
বিঘ্নিত হ্যান্ডলারটি কার্নেল হয় এবং অন্যান্য প্রোগ্রামগুলির দ্বারা কার্নেলে সিস্টেম কল করার জন্য ব্যবহৃত হয়।
কার্নেলটি রেজিষ্টারে %eax
(এটিএন্ডটি সিনট্যাক্স এবং ইন্টেল সিনট্যাক্সে ইএএক্স) মূল্য পরীক্ষা করে প্রোগ্রামটি কোন সিস্টেমটি কল করতে চায় তা সম্পর্কে জানানো হয় । অন্যান্য রেজিস্টারগুলির ব্যবহার সম্পর্কে প্রতিটি সিস্টেম কলের বিভিন্ন প্রয়োজনীয়তা থাকে। উদাহরণস্বরূপ, 1
ইন-এর মান %eax
মানে একটি সিস্টেম কল exit()
and এবং এর মানটি %ebx
স্থিতি কোডের মান ধরে exit()
।
মনে রাখবেন যে 0x80
= 80h
=128
আপনি এখানে দেখতে পাচ্ছেন যে INT
x86 নির্দেশিকা সেটটিতে বিদ্যমান অনেকগুলি নির্দেশাবলীর (প্রকৃতপক্ষে বিধানসভা ভাষার প্রতিনিধিত্ব (বা এর 'স্মৃতিচারণক বলতে হবে)) এর মধ্যে একটি মাত্র। এছাড়াও আপনি ইন্টেলের নিজের ম্যানুয়াল পাওয়া যায় এই নির্দেশ সম্পর্কে আরও তথ্য পেতে পারেন এখানে ।
পিডিএফ থেকে সংক্ষিপ্তসার:
আইএনটি এন / ইন্টো / আইএনটি 3 Inter বিঘ্নিত পদ্ধতিতে কল করুন
আইএনটি এন নির্দেশনা গন্তব্য অপারেন্ডের সাথে নির্দিষ্ট বাধা বা ব্যতিক্রম হ্যান্ডলারকে কল দেয়। গন্তব্য অপারেন্ড 0 থেকে 255 পর্যন্ত একটি ভেক্টর নির্দিষ্ট করে, একটি 8-বিট স্বাক্ষরযুক্ত মধ্যবর্তী মান হিসাবে এনকোডেড। আইএনটি এন নির্দেশনা হ'ল একটি বিঘ্নিত হ্যান্ডলারের কাছে একটি সফ্টওয়্যার-উত্পাদিত কল সম্পাদনের জন্য সাধারণ স্মৃতিচারণ।
যেহেতু আপনি দেখতে পারেন 0x80 হয় গন্তব্য প্রতীক আপনার প্রশ্নের হবে। এই মুহুর্তে সিপিইউ জানে যে এটি কার্নেলের মধ্যে থাকা কিছু কোড কার্যকর করতে হবে, তবে কী কোড? এটি লিনাক্সের ইন্টারপ্রেট ভেক্টর দ্বারা নির্ধারিত হয়।
সর্বাধিক দরকারী ডস সফ্টওয়্যার বিঘ্নিত 0x21 বাধা ছিল। নিবন্ধগুলিতে বিভিন্ন পরামিতিগুলির সাথে এটি কল করে (বেশিরভাগ আহ এবং আল) আপনি বিভিন্ন আইও অপারেশন, স্ট্রিং আউটপুট এবং আরও অনেক কিছুতে অ্যাক্সেস করতে পারেন।
বেশিরভাগ ইউনিক্স সিস্টেম এবং ডেরিভেটিভস সিস্টেম কল করতে ব্যবহৃত বিঘ্নিত 0x80 ব্যতীত সফ্টওয়্যার বিঘ্ন ব্যবহার করে না। এই প্রবেশ দ্বারা সম্পন্ন হয় প্রসেসর EAX রেজিস্টার মধ্যে একটি কার্নেল ফাংশন সংশ্লিষ্ট 32 বিট মান এবং তারপর INT 0x80 নির্বাহ।
এই দয়া করে একবার দেখুন যেখানে বাধা হ্যান্ডলার সারণীতে অন্যান্য উপলব্ধ মানগুলি প্রদর্শিত হয়:
আপনি দেখতে পাচ্ছেন যে টেবিলটি সিপিইউকে একটি সিস্টেম কল সম্পাদন করতে নির্দেশ করে। আপনি লিনাক্স সিস্টেম কল টেবিলটি এখানে পেতে পারেন ।
সুতরাং 0x1 এর মানটি EAX রেজিস্ট্রারে স্থানান্তরিত করে এবং আপনার প্রোগ্রামের INT 0x80 কল করে আপনি প্রসেসটি কার্নেলের কোডটি কার্যকর করতে পারেন যা বর্তমান চলমান প্রক্রিয়াটি (প্রস্থানকারী) বন্ধ হয়ে যাবে (লিনাক্স, x86 ইন্টেল সিপিইউতে)।
একটি হার্ডওয়্যার বিঘ্নিত একটি সফ্টওয়্যার বিঘ্ন সঙ্গে বিভ্রান্ত করা উচিত নয়। এই বিষয়ে একটি খুব ভাল উত্তর এখানে ।
এই ভালো উৎস।
int 0x80
মধ্যে i386 লিনাক্স সিস্টেম কল ABI- র অত্যন্ত ডস অনুরূপ int 0x21
ABI- র। একটি রেজিস্টারে একটি কল নম্বর রাখুন (ডস-এর জন্য এএইচ, লিনাক্সের জন্য ইএএক্স) এবং অন্যান্য রেজিস্টারে অন্যান্য আরোগুলি, তারপরে একটি সফ্টওয়্যার-বিঘ্নিত নির্দেশনা চালান। মূল পার্থক্য হ'ল সিস্টেম কল আপনাকে যা করতে দেয় তার মধ্যে (সরাসরি ডসগুলিতে হার্ডওয়্যার অ্যাক্সেস করুন তবে লিনাক্স নয়), আপনি কীভাবে অনুরোধ করবেন তা নয়।
/usr/include/x86_64-linux-gnu/asm/unistd_64.h
ন্যূনতম চলমান লিনাক্স সিস্টেম কল উদাহরণ
লিনাক্স 0x80
সিস্টেম কল প্রয়োগ করে, যার ফলে কার্নেলের সাথে যোগাযোগের জন্য ইউজারল্যান্ড প্রোগ্রামগুলির জন্য একটি পদ্ধতি বাধা হ্যান্ডলার সেট আপ করে ।
.data
s:
.ascii "hello world\n"
len = . - s
.text
.global _start
_start:
movl $4, %eax /* write system call number */
movl $1, %ebx /* stdout */
movl $s, %ecx /* the data to print */
movl $len, %edx /* length of the buffer */
int $0x80
movl $1, %eax /* exit system call number */
movl $0, %ebx /* exit status */
int $0x80
সংকলন এবং এর সাথে চালান:
as -o main.o main.S
ld -o main.out main.o
./main.out
ফলাফল: প্রোগ্রামটি stdout প্রিন্ট করে:
hello world
এবং পরিষ্কারভাবে প্রস্থান।
আপনি সরাসরি ইউজারল্যান্ড থেকে আপনার নিজের বাধা হ্যান্ডলার সেট করতে পারবেন না কারণ আপনার কাছে কেবল রিং 3 রয়েছে এবং লিনাক্স আপনাকে এটি করতে বাধা দেয় ।
গিটহাব উজানের দিকে । উবুন্টু 16.04 এ পরীক্ষিত।
আরও ভাল বিকল্প
int 0x80
সিস্টেম কল করার জন্য আরও ভাল বিকল্প দ্বারা sysenter
বঞ্চিত করা হয়েছে : প্রথমে , তারপরে ভিডিএসও।
x86_64 এর একটি নতুন syscall
নির্দেশ রয়েছে ।
আরও দেখুন: "int 0x80" বা "সিস্কেল" এর চেয়ে ভাল কী?
ন্যূনতম 16-বিট উদাহরণ
প্রথমে একটি ন্যূনতম বুটলোডার ওএস কীভাবে তৈরি করবেন এবং কিউইএমইউ এবং রিয়েল হার্ডওয়্যারটিতে এটি চালানোর পদ্ধতিটি আমি এখানে ব্যাখ্যা করেছি: https://stackoverflow.com/a/32483545/895245
এখন আপনি 16-বিট রিয়েল মোডে চালাতে পারেন:
movw $handler0, 0x00
mov %cs, 0x02
movw $handler1, 0x04
mov %cs, 0x06
int $0
int $1
hlt
handler0:
/* Do 0. */
iret
handler1:
/* Do 1. */
iret
এটি যাতে করতে হবে:
Do 0.
Do 1.
hlt
: কার্যকর করা বন্ধ করুনপ্রসেসর কীভাবে ঠিকানায় প্রথম হ্যান্ডলারের সন্ধান করে 0
এবং দ্বিতীয়টিতে এটি দেখুন 4
: এটি আইভিটি নামক হ্যান্ডলারের একটি সারণী এবং প্রতিটি এন্ট্রিতে 4 বাইট থাকে।
ন্যূনতম উদাহরণ যা হ্যান্ডলারদের দৃশ্যমান করতে কিছু আইও করে।
ন্যূনতম সুরক্ষিত মোড উদাহরণ
আধুনিক অপারেটিং সিস্টেম তথাকথিত সুরক্ষিত মোডে চলে।
এই মোডে হ্যান্ডলিংয়ের আরও বিকল্প রয়েছে, সুতরাং এটি আরও জটিল, তবে স্পিরিটটি একই।
মূল পদক্ষেপটি LGDT এবং LIDT নির্দেশাবলী ব্যবহার করছে, যা হ্যান্ডলারের বর্ণনা দেয় এমন একটি ইন-মেমরি ডেটা স্ট্রাকচারের (ইন্ট্রিপেট ডিসক্রিপটর সারণি) নির্দেশ করে।
ইন্ট 0x80 হ'ল এসেম্বলি ল্যাঙ্গুয়েজ ইন্সট্রাকশন যা x86 (যেমন, ইন্টেল-সামঞ্জস্যপূর্ণ) প্রসেসরে লিনাক্সে সিস্টেম কল আহ্বান করতে ব্যবহৃত হয়।
"ইনট" নির্দেশটি একটি বাধা সৃষ্টি করে।
সরল উত্তর: একটি বাধা, সহজভাবে বলা, এমন একটি ইভেন্ট যা সিপিইউকে বাধা দেয় এবং একটি নির্দিষ্ট টাস্ক চালাতে বলে।
বিস্তারিত উত্তর :
সিপিইউতে মেমোরিতে সঞ্চিত ইন্টারপ্রেট সার্ভিস রুটিনগুলির একটি টেবিল রয়েছে (বা আইএসআর)। রিয়াল (16-বিট) মোডে, এই সংরক্ষণ করা হয় IVT , অথবা আমি nterrupt ভী ECTOR টি সক্ষম। আইভিটি সাধারণত 0x0000:0x0000
(শারীরিক ঠিকানা 0x00000
) এ থাকে এবং এটি সেগমেন্ট-অফসেট ঠিকানাগুলির একটি সিরিজ যা আইএসআরগুলিতে নির্দেশ করে। ওএস প্রাক-বিদ্যমান আইভিটি এন্ট্রিগুলি তার নিজস্ব আইএসআরগুলির সাথে প্রতিস্থাপন করতে পারে।
(দ্রষ্টব্য: আইভিটির আকার 1024 (0x400) বাইটে স্থির করা হয়েছে))
সুরক্ষিত (32-বিট) মোডে, সিপিইউ একটি আইডিটি ব্যবহার করে। আইডিটি হ'ল একটি পরিবর্তনশীল দৈর্ঘ্যের কাঠামো যা বর্ণনাকারী (অন্যথায় গেট হিসাবে পরিচিত) নিয়ে গঠিত , যা সিপিইউকে বাধাপ্রাপ্ত হ্যান্ডলারগুলির সম্পর্কে বলে। এই বর্ণনাকারীদের কাঠামো আইভিটির সাধারণ সেগমেন্ট-অফসেট এন্ট্রিগুলির তুলনায় অনেক জটিল; এটা এখানে:
bytes 0, 1: Lower 16 bits of the ISR's address.
bytes 2, 3: A code segment selector (in the GDT/LDT)
byte 4: Zero.
byte 5: A type field consisting of several bitfields.
bit 0: P (Present): 0 for unused interrupts, 1 for used interrupts.*
bits 1, 2: DPL (Descriptor Privilege Level): The privilege level the descriptor (bytes 2, 3) must have.
bit 3: S (Storage Segment): Is 0 for interrupt and trap gates. Otherwise, is one.
bits 4, 5, 6, 7: GateType:
0101: 32 bit task gate
0110: 16-bit interrupt gate
0111: 16-bit trap gate
1110: 32-bit interrupt gate
1111: 32-bit trap gate
* আইডিটি পরিবর্তনশীল আকারের হতে পারে তবে এটি অবশ্যই অনুক্রমিক হতে হবে, আপনি যদি আপনার আইডিটি 0x00 থেকে 0x50 হতে ঘোষণা করেন তবে আপনার অবশ্যই 0x00 থেকে 0x50 পর্যন্ত প্রতিটি বাধা থাকতে হবে। ওএস অগত্যা সবগুলি ব্যবহার করে না, সুতরাং উপস্থিত বিট সিপিইউকে সঠিকভাবে বাধাগুলি পরিচালনা করতে দেয় যা ওএস হ্যান্ডেল করার ইচ্ছা করে না।
যখন কোনও বাধা ঘটে ( int
আইআরকিউতে একটি বাহ্যিক ট্রিগার (যেমন একটি হার্ডওয়্যার ডিভাইস) দ্বারা, বা কোনও প্রোগ্রামের নির্দেশের মাধ্যমে), সিপিইউ EFLAGS, তারপরে সিএস এবং তারপরে EIP ঠেলে দেয়। (এগুলি স্বয়ংক্রিয়ভাবে iret
বিঘ্নিত রিটার্ন নির্দেশাবলীর মাধ্যমে পুনরুদ্ধার করা হয় )) ওএস সাধারণত মেশিনের অবস্থা সম্পর্কে আরও তথ্য সঞ্চয় করে, বিঘ্নিত পরিচালনা করে, মেশিনের অবস্থা পুনরুদ্ধার করে এবং অবিরত থাকে।
অনেক * এনআইএক্স ওএসে (লিনাক্স সহ), সিস্টেম কলগুলি বাধা ভিত্তিক হয়। প্রোগ্রামটি রেজিস্টারগুলিতে (EAX, EBX, ECX, EDX, ইত্যাদি ..) এবং কল বিঘ্নিত 0x80 কলগুলিতে সিস্টেম কলের আর্গুমেন্টগুলি রাখে। কার্নেল ইতিমধ্যে 0x80 এ একটি বিঘ্নিত হ্যান্ডলারটি রাখতে আইডিটি সেট করেছে, যা বাধা 0x80 প্রাপ্ত হলে ডাকা হয়। কার্নেলটি পরে আর্গুমেন্টগুলি পড়ে এবং তদনুসারে একটি কার্নেল ফাংশন শুরু করে। এটি EAX / EBX এ কোনও রিটার্ন সঞ্চয় করতে পারে। সিস্টেম কল মূলত দ্বারা প্রতিস্থাপিত করা হয়েছে sysenter
এবং sysexit
(অথবা syscall
এবং sysret
এএমডির দিকে) নির্দেশাবলী, যা রিং 0 মধ্যে দ্রুত এন্ট্রি জন্য অনুমতি দেয়।
এই বাধাদানটির একটি ভিন্ন ওএসে আলাদা অর্থ হতে পারে। এর ডকুমেন্টেশন চেক করতে ভুলবেন না।
eax
সিস্কল নম্বরের জন্য ব্যবহৃত হয়। asm.sourceforge.net/intro/hello.html
উল্লিখিত হিসাবে, এটি ভেক্টর 0x80 বাধা দিতে নিয়ন্ত্রণে ঝাঁপ দেয়। বাস্তবে এর অর্থ (অন্তত লিনাক্সের অধীনে) এর অর্থ হ'ল একটি সিস্টেম কল আহ্বান করা হয়; সঠিক সিস্টেম কল এবং তর্কগুলি নিবন্ধগুলির বিষয়বস্তু দ্বারা সংজ্ঞায়িত করা হয়। উদাহরণস্বরূপ, প্রস্থান () '% 0x80' এর পরে% eax 1 তে সেট করে ডাকা যাবে।
এটি সিপিইউকে বিঘ্নিত ভেক্টর 0x80 সক্রিয় করতে বলেছে, যা লিনাক্স ওএসে সিস্টেম-কল বিঘ্নিত হয় যা open()
ফাইলগুলির জন্য যেমন সিস্টেম ফাংশন আহ্বান করতে ব্যবহৃত হয় , এবং সেটির জন্য।
ইন্ট বাধা ব্যতীত কিছুই নয়, প্রসেসর এটির বর্তমান প্রয়োগটি ধরে রাখবে।
0x80 সিস্টেম কল বা কার্নেল কল ছাড়া কিছুই নয়। অর্থাৎ সিস্টেম ফাংশন কার্যকর করা হবে।
নির্দিষ্ট 0x80 হতে rt_sigtimedwait / init_module / restart_sys প্রতিনিধিত্ব করে এটি আর্কিটেকচার থেকে আর্কিটেকচারে পরিবর্তিত হয়।
আরও তথ্যের জন্য https: //chromium.googles Source.com/chromiumos/docs/+/master/constants/syscalls.md দেখুন