"Int 0x80" এর সমাবেশ কোডটিতে কী বোঝায়?


91

কেউ কি নীচের সমাবেশ কোডটি ব্যাখ্যা করতে পারে?

 int 0x80  

উত্তর:


70

এটি ভেক্টর 0x80 বাধা দিতে নিয়ন্ত্রণ পাস করে

Http://en.wikedia.org/wiki/Interrupt_vector দেখুন

লিনাক্স এ, কটাক্ষপাত আছে এই : এটি পরিচালনা করতে ব্যবহৃত হয় system_call। অবশ্যই অন্য কোনও ওএসে এটির অর্থ সম্পূর্ণ আলাদা।


4
সংক্ষিপ্ত দীর্ঘ কাহিনী দ্বারা নির্দেশাবলী মানে নির্দেশের জন্য আইও আইটি আগে ছিল।
যুদা প্রবীরা

4
@ যুদাপ্রবির: আপনার রেজিস্টারগুলিতে আরগ স্থাপন এবং কর্নেলের কোনও কার্য ( int 0x80বিশেষভাবে callনির্বাচিত eax) বিশেষ ধরণের হিসাবে বিবেচনা করা উচিত of
পিটার কর্ডেস

আপনি কেন "WAS ব্যবহার করেছেন?" বলেছিলেন? এটি আর ব্যবহার করা হয় না?
লিগা

131

intমানে বাধা, এবং সংখ্যাটি 0x80হ'ল বাধা সংখ্যা। একটি বাধা প্রোগ্রাম প্রবাহকে যার কাছে এই বিঘ্নিত পরিচালনা করে, যা 0x80এই ক্ষেত্রে বাধা রয়েছে তা হস্তান্তর করে । লিনাক্সে, 0x80বিঘ্নিত হ্যান্ডলারটি কার্নেল হয় এবং অন্যান্য প্রোগ্রামগুলির দ্বারা কার্নেলে সিস্টেম কল করার জন্য ব্যবহৃত হয়।

কার্নেলটি রেজিষ্টারে %eax(এটিএন্ডটি সিনট্যাক্স এবং ইন্টেল সিনট্যাক্সে ইএএক্স) মূল্য পরীক্ষা করে প্রোগ্রামটি কোন সিস্টেমটি কল করতে চায় তা সম্পর্কে জানানো হয় । অন্যান্য রেজিস্টারগুলির ব্যবহার সম্পর্কে প্রতিটি সিস্টেম কলের বিভিন্ন প্রয়োজনীয়তা থাকে। উদাহরণস্বরূপ, 1ইন-এর মান %eaxমানে একটি সিস্টেম কল exit()and এবং এর মানটি %ebxস্থিতি কোডের মান ধরে exit()


47

মনে রাখবেন যে 0x80= 80h=128

আপনি এখানে দেখতে পাচ্ছেন যে INTx86 নির্দেশিকা সেটটিতে বিদ্যমান অনেকগুলি নির্দেশাবলীর (প্রকৃতপক্ষে বিধানসভা ভাষার প্রতিনিধিত্ব (বা এর 'স্মৃতিচারণক বলতে হবে)) এর মধ্যে একটি মাত্র। এছাড়াও আপনি ইন্টেলের নিজের ম্যানুয়াল পাওয়া যায় এই নির্দেশ সম্পর্কে আরও তথ্য পেতে পারেন এখানে

পিডিএফ থেকে সংক্ষিপ্তসার:

আইএনটি এন / ইন্টো / আইএনটি 3 Inter বিঘ্নিত পদ্ধতিতে কল করুন

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

যেহেতু আপনি দেখতে পারেন 0x80 হয় গন্তব্য প্রতীক আপনার প্রশ্নের হবে। এই মুহুর্তে সিপিইউ জানে যে এটি কার্নেলের মধ্যে থাকা কিছু কোড কার্যকর করতে হবে, তবে কী কোড? এটি লিনাক্সের ইন্টারপ্রেট ভেক্টর দ্বারা নির্ধারিত হয়।

সর্বাধিক দরকারী ডস সফ্টওয়্যার বিঘ্নিত 0x21 বাধা ছিল। নিবন্ধগুলিতে বিভিন্ন পরামিতিগুলির সাথে এটি কল করে (বেশিরভাগ আহ এবং আল) আপনি বিভিন্ন আইও অপারেশন, স্ট্রিং আউটপুট এবং আরও অনেক কিছুতে অ্যাক্সেস করতে পারেন।

বেশিরভাগ ইউনিক্স সিস্টেম এবং ডেরিভেটিভস সিস্টেম কল করতে ব্যবহৃত বিঘ্নিত 0x80 ব্যতীত সফ্টওয়্যার বিঘ্ন ব্যবহার করে না। এই প্রবেশ দ্বারা সম্পন্ন হয় প্রসেসর EAX রেজিস্টার মধ্যে একটি কার্নেল ফাংশন সংশ্লিষ্ট 32 বিট মান এবং তারপর INT 0x80 নির্বাহ।

এই দয়া করে একবার দেখুন যেখানে বাধা হ্যান্ডলার সারণীতে অন্যান্য উপলব্ধ মানগুলি প্রদর্শিত হয়:

এখানে চিত্র বর্ণনা লিখুন

আপনি দেখতে পাচ্ছেন যে টেবিলটি সিপিইউকে একটি সিস্টেম কল সম্পাদন করতে নির্দেশ করে। আপনি লিনাক্স সিস্টেম কল টেবিলটি এখানে পেতে পারেন ।

সুতরাং 0x1 এর মানটি EAX রেজিস্ট্রারে স্থানান্তরিত করে এবং আপনার প্রোগ্রামের INT 0x80 কল করে আপনি প্রসেসটি কার্নেলের কোডটি কার্যকর করতে পারেন যা বর্তমান চলমান প্রক্রিয়াটি (প্রস্থানকারী) বন্ধ হয়ে যাবে (লিনাক্স, x86 ইন্টেল সিপিইউতে)।

একটি হার্ডওয়্যার বিঘ্নিত একটি সফ্টওয়্যার বিঘ্ন সঙ্গে বিভ্রান্ত করা উচিত নয়। এই বিষয়ে একটি খুব ভাল উত্তর এখানে

এই ভালো উৎস।


4
লিনাক্স সিস্টেম কল টেবিলের লিঙ্কটি ভাঙা = \
মিগুয়েল অ্যাঞ্জেলো

4
বেশিরভাগ ইউনিক্স সিস্টেম এবং ডেরিভেটিভস সফ্টওয়্যার বিঘ্ন ব্যবহার করে না (int 0x80 ব্যতীত) এটি লাগানোর একটি অদ্ভুত উপায় বলে মনে হয়। int 0x80মধ্যে i386 লিনাক্স সিস্টেম কল ABI- র অত্যন্ত ডস অনুরূপ int 0x21ABI- র। একটি রেজিস্টারে একটি কল নম্বর রাখুন (ডস-এর জন্য এএইচ, লিনাক্সের জন্য ইএএক্স) এবং অন্যান্য রেজিস্টারে অন্যান্য আরোগুলি, তারপরে একটি সফ্টওয়্যার-বিঘ্নিত নির্দেশনা চালান। মূল পার্থক্য হ'ল সিস্টেম কল আপনাকে যা করতে দেয় তার মধ্যে (সরাসরি ডসগুলিতে হার্ডওয়্যার অ্যাক্সেস করুন তবে লিনাক্স নয়), আপনি কীভাবে অনুরোধ করবেন তা নয়।
পিটার কর্ডেস

এখানে একটি অ-ভাঙা সিস্টেল টেবিল লিঙ্ক। syscalls.kernelgrok.com শীর্ষে সমস্ত কল দেখানোর জন্য এটি কেবল প্রসারিত করুন।
ওলিয়েন

লিনাক্স bits৪ বিট ব্যবহার করার সময়, আপনি সিস্টেম কলটি উপলভ্য দেখতে পাবেন/usr/include/x86_64-linux-gnu/asm/unistd_64.h
টন

12

ন্যূনতম চলমান লিনাক্স সিস্টেম কল উদাহরণ

লিনাক্স 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 নির্দেশাবলী ব্যবহার করছে, যা হ্যান্ডলারের বর্ণনা দেয় এমন একটি ইন-মেমরি ডেটা স্ট্রাকচারের (ইন্ট্রিপেট ডিসক্রিপটর সারণি) নির্দেশ করে।

নূন্যতম উদাহরণ


9

ইন্ট 0x80 হ'ল এসেম্বলি ল্যাঙ্গুয়েজ ইন্সট্রাকশন যা x86 (যেমন, ইন্টেল-সামঞ্জস্যপূর্ণ) প্রসেসরে লিনাক্সে সিস্টেম কল আহ্বান করতে ব্যবহৃত হয়।

http://www.linfo.org/int_0x80.html


4

"ইনট" নির্দেশটি একটি বাধা সৃষ্টি করে।

বাধা কি?

সরল উত্তর: একটি বাধা, সহজভাবে বলা, এমন একটি ইভেন্ট যা সিপিইউকে বাধা দেয় এবং একটি নির্দিষ্ট টাস্ক চালাতে বলে।

বিস্তারিত উত্তর :

সিপিইউতে মেমোরিতে সঞ্চিত ইন্টারপ্রেট সার্ভিস রুটিনগুলির একটি টেবিল রয়েছে (বা আইএসআর)। রিয়াল (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 মধ্যে দ্রুত এন্ট্রি জন্য অনুমতি দেয়।

এই বাধাদানটির একটি ভিন্ন ওএসে আলাদা অর্থ হতে পারে। এর ডকুমেন্টেশন চেক করতে ভুলবেন না।


মজাদার ঘটনা: ফ্রিবিএসডি-র আই 386 সিস্টেম কল এবিআই ব্যবহারকারী-স্পেস স্ট্যাকের মধ্যে অর্গগুলি পাস করেছে। কেবল eaxসিস্কল নম্বরের জন্য ব্যবহৃত হয়। asm.sourceforge.net/intro/hello.html
পিটার কর্ডস

2

উল্লিখিত হিসাবে, এটি ভেক্টর 0x80 বাধা দিতে নিয়ন্ত্রণে ঝাঁপ দেয়। বাস্তবে এর অর্থ (অন্তত লিনাক্সের অধীনে) এর অর্থ হ'ল একটি সিস্টেম কল আহ্বান করা হয়; সঠিক সিস্টেম কল এবং তর্কগুলি নিবন্ধগুলির বিষয়বস্তু দ্বারা সংজ্ঞায়িত করা হয়। উদাহরণস্বরূপ, প্রস্থান () '% 0x80' এর পরে% eax 1 তে সেট করে ডাকা যাবে।


1

এটি সিপিইউকে বিঘ্নিত ভেক্টর 0x80 সক্রিয় করতে বলেছে, যা লিনাক্স ওএসে সিস্টেম-কল বিঘ্নিত হয় যা open()ফাইলগুলির জন্য যেমন সিস্টেম ফাংশন আহ্বান করতে ব্যবহৃত হয় , এবং সেটির জন্য।


9
কড়া কথা বলতে গেলে, এটি কার্নেলকে বলে না ... এটি সিপিইউকে বলেছে, যা আইডিটি-তে হ্যান্ডলারটি দেখায়, যা কিছু কার্নেল কোডের পয়েন্টার হিসাবে শেষ হয়।
asveikau

সত্য। আমি মনে করি আরও ভাল ফ্রেসিংটি হ'ল এটি সিপিইউকে ভেক্টরকে সক্রিয় করতে বলে, এবং ভেক্টর (কার্নেলের অংশ হিসাবে) ফাংশনটি শুরু করে।
অ্যাম্বার

যা এটি শেষ করে, কোনটি শেষ করে যা শেষ করে, যা পরে এটি করে, যা সেখানে বিভ্রান্ত হয় । : / অ্যাম্বার একটি উত্তর understandable..thats এটা .. যে হয়েছে
Afzaal আহমদ জিসান

1

ইন্ট বাধা ব্যতীত কিছুই নয়, প্রসেসর এটির বর্তমান প্রয়োগটি ধরে রাখবে।

0x80 সিস্টেম কল বা কার্নেল কল ছাড়া কিছুই নয়। অর্থাৎ সিস্টেম ফাংশন কার্যকর করা হবে।

নির্দিষ্ট 0x80 হতে rt_sigtimedwait / init_module / restart_sys প্রতিনিধিত্ব করে এটি আর্কিটেকচার থেকে আর্কিটেকচারে পরিবর্তিত হয়।

আরও তথ্যের জন্য https: //chromium.googles Source.com/chromiumos/docs/+/master/constants/syscalls.md দেখুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.