ما معنى "int 0x80" يعني في الجمعية الرمز ؟
سؤال
يمكن للشخص أن يفسر ما يلي رمز التجميع ؟
int 0x80
المحلول
ويمر التحكم ليقطع ناقلات 0x80
http://en.wikipedia.org/wiki/Interrupt_vector
في لينكس، وإلقاء نظرة على هذا : انه كان يستخدم للتعامل مع system_call
. بالطبع على نظام تشغيل آخر وهذا يمكن أن يعني شيئا مختلفا تماما.
نصائح أخرى
وسائل int
المقاطعة، و0x80
عدد هو عدد المقاطعة.
ونقل المقاطعة تدفق البرنامج لمن هو التعامل مع تلك المقاطعة، وهو 0x80
المقاطعة في هذه الحالة.
في لينكس، معالج 0x80
المقاطعة هو النواة، ويستخدم لإجراء مكالمات النظام إلى نواة من قبل برامج أخرى.
ويتم إخطار نواة حول أي نظام استدعاء يريد برنامج لجعل، من خلال دراسة قيمة في %eax
التسجيل (تركيب الغاز، وEAX في جملة إنتل). كل استدعاء النظام لديها متطلبات مختلفة حول استخدام السجلات الأخرى. على سبيل المثال، قيمة 1
في %eax
تعني مكالمة نظام exit()
، والقيمة في %ebx
يحمل قيمة رمز الحالة لexit()
.
نضع في اعتبارنا أن 0x80 = 80h = 128
يمكنك أن ترى هنا أن الباحث هو مجرد واحدة من العديد من التعليمات (في الواقع لغة التجميع تمثيل (أو ينبغي أن أقول 'n')) مع أنه موجود في x86 مجموعة التعليمات.يمكنك أيضا العثور على مزيد من المعلومات عن هذه التعليمات في إنتل الخاصة دليل وجدت هنا.
تلخيص من PDF:
INT n/إلى/INT 3—الدعوة إلى المقاطعة الإجراء
INT n التعليمات يولد الدعوة إلى المقاطعة أو استثناء معالج تحديد الوجهة المعامل.الوجهة المعامل يحدد ناقلات من 0 إلى 255 ، ترميز 8-بت غير الموقعة قيمة الوسيطة.INT n التعليمات العامة ذاكري تنفيذ برنامج إنشاء دعوة إلى معالج المقاطعة.
كما ترون 0x80 هو الوجهة المعامل في سؤالك.عند هذه النقطة وحدة المعالجة المركزية يعلم أنه يجب تنفيذ بعض التعليمات البرمجية التي تتواجد في النواة ، ولكن أي قانون ؟ التي يتم تحديدها من قبل متجه المقاطعة في لينكس.
واحدة من الأكثر فائدة DOS البرامج المقاطعات كان يقطع 0x21.من خلال الاتصال مع معلمات مختلفة في السجلات (في الغالب آه و آل) يمكنك الوصول إلى مختلف IO العمليات, سلسلة الإنتاج أكثر.
معظم أنظمة Unix و المشتقات لا تستخدم برامج المقاطعات باستثناء المقاطعة 0x80 ، وتستخدم لجعل نظام المكالمات.ويتم إنجاز هذا عن طريق إدخال 32 بت القيمة المقابلة نواة وظيفة في EAX سجل المعالج ثم تنفيذ INT 0x80.
نلقي نظرة على هذا الرجاء الأخرى حيث القيم المتوفرة في معالج المقاطعة الجداول هو مبين:
كما ترون الطاولة نقطة وحدة المعالجة المركزية لتنفيذ نظام الاتصال.يمكنك العثور على نظام لينكس استدعاء الجدول هنا.
حتى عن طريق تحريك قيمة 0x1 إلى EAX سجل استدعاء INT 0x80 في البرنامج الخاص بك ، يمكنك جعل عملية الانتقال تنفيذ التعليمات البرمجية في النواة التي سوف تتوقف (مخرج) عملية التشغيل الحالية (على لينكس x86 من إنتل وحدة المعالجة المركزية).
مقاطعة الأجهزة يجب عدم الخلط مع برنامج المقاطعة. هنا هو إجابة جيدة جدا في هذا الصدد.
هذا هو أيضا مصدر جيد.
يمكنك أن ترى الباحث 80h في العمل هنا.
وكثافة 0x80 هو لغة التجميع التعليمات التي تستخدم لاستدعاء استدعاءات النظام في لينكس و x86 (أي، معالجات إنتل المتوافقة).
اقتباس فقرة>الحد الأدنى runnable نظام لينكس الاتصال سبيل المثال
لينكس يضع المقاطعة معالج 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
النتيجة:البرنامج يطبع المعياري:
hello world
ومخارج نظيفة.
لا يمكنك تعيين الخاص بك معالجات المقاطعة مباشرة من يوزرلاند لأنه لديك فقط حلقة 3 و لينكس يمنعك من القيام بذلك.
جيثب المنبع.اختبار على أوبونتو 16.04.
بدائل أفضل
int 0x80
وقد حلت محلها بدائل أفضل لصنع نظام المكالمات:أولا sysenter
, ثم VDSO.
وقد x86_64 جديد syscall
التعليمات.
انظر أيضا: ما هو أفضل "int 0x80" أو "syscall"?
الحد الأدنى من 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
:هذا هو جدول معالجات تسمى IVT, وكل إدخال 4 بايت.
الحد الأدنى سبيل المثال أن يفعل بعض IO لجعل معالجات مرئية.
الحد الأدنى الوضع المحمي سبيل المثال
أنظمة التشغيل الحديثة المدى في ما يسمى الوضع المحمي.
معالجة لديه المزيد من الخيارات في هذا الوضع, لذلك هو أكثر تعقيدا ، ولكن الروح نفسه.
الخطوة الأساسية هي استخدام LGDT و LIDT التعليمات التي تشير عنوان في الذاكرة بنية البيانات (المقاطعة جدول واصف) الذي يصف معالجات.
و "الباحث" تعليمات أسباب المقاطعة.
ما هو المقاطعة ؟
الإجابة بسيطة: مقاطعة ، ببساطة ، هو الحدث الذي يقطع وحدة المعالجة المركزية, ويقول لتشغيل مهمة محددة.
إجابة مفصلة:
وحدة المعالجة المركزية لديها جدول إجراءات خدمة المقاطعة (أو ISRs) المخزنة في الذاكرة.في الحقيقية (16-بت) وضع هذا يتم تخزينها كما IVT, أو أناnterrupt Vector Tقادرة على.IVT عادة ما يكون موجودا في 0x0000:0x0000
(العنوان الفعلي 0x00000
), و هو عبارة عن سلسلة من الجزء-تعويض العناوين التي تشير إلى تقارير البحث الدولي.نظام التشغيل قد تحل محل القائمة من قبل IVT الإدخالات الخاصة ISRs.
(ملاحظة:IVT حجم ثابت في 1024 (0x400) بايت.)
في محمية (32-بت) وضع وحدة المعالجة المركزية يستخدم IDT.IDT هو متغير طول الهيكل الذي يتكون من الواصفات (والمعروف باسم غيتس) الذي أخبر وحدة المعالجة المركزية عن معالجات المقاطعة.هيكل من هذه الواصفات هو أكثر تعقيدا بكثير من IVT بسيطة الجزء-تعويض مقالات;هنا هو:
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
*IDT قد يكون متغير الحجم ، ولكن يجب أن تكون متتابعة ، أيإذا كنت تقوم بتعريف IDT من 0x00 إلى 0x50 ، يجب أن يكون لديك كل مقاطعة من 0x00 إلى 0x50.نظام التشغيل ليس بالضرورة استخدام كل منها ، لذلك هذا الشيء يسمح وحدة المعالجة المركزية بشكل صحيح التعامل مع المقاطعات OS لا تنوي التعامل معها.
عند حدوث مقاطعة (إما خارجي الزناد (مثلا ، جهاز) في IRQ ، أو من قبل int
تعليمات برنامج) CPU يدفع EFLAGS ، ثم CS ومن ثم EIP.(هذه هي تلقائيا استعادة iret
, فإن عودة المقاطعة التعليمات.) نظام التشغيل وعادة ما يخزن المزيد من المعلومات حول حالة الجهاز, مقابض المقاطعة ، ويعيد آلة الدولة ، وتستمر.
في العديد من *NIX انظمة التشغيل (بما في ذلك لينكس), نظام دعوات المقاطعة على أساس.البرنامج يضع الحجج إلى استدعاء نظام في سجلات (EAX, EBX, ECX, EDX, الخ..), و دعوات المقاطعة 0x80.نواة بالفعل تعيين IDT يحتوي على معالج المقاطعة على 0x80 ، وهو ما يسمى عندما يتلقى يقطع 0x80.النواة ثم يقرأ حجج يحتج نواة وظيفة وفقا لذلك.قد مخزن العودة في EAX/EBX.نظام يدعو إلى حد كبير محلها sysenter
و sysexit
(أو syscall
و sysret
على AMD) التعليمات التي تسمح لسرعة الدخول في حلقة 0.
هذه المقاطعة يمكن أن يكون لها معنى مختلف في نظام تشغيل مختلف.تأكد من التحقق من الوثائق.
وكما ذكر، فإنه يتسبب السيطرة على القفز لوقف ناقلات 0x80. في الممارسة العملية ما يعني (على الأقل في لينكس) هو أن استدعاء نظام يتم استدعاء. يتم تعريف استدعاء النظام الدقيق والحجج التي كتبها محتويات السجلات. على سبيل المثال، الخروج () يمكن الاحتجاج من خلال وضع٪ EAX إلى 1 متبوعا '0x80 كثافة العمليات ".
وويحكي وحدة المعالجة المركزية لتفعيل متجه المقاطعة 0x80، والتي على لينكس انظمة التشغيل هو المقاطعة-استدعاء النظام، وتستخدم لاستدعاء وظائف النظام مثل open()
عن الملفات، وهلم جرا.