سؤال

يمكن للشخص أن يفسر ما يلي رمز التجميع ؟

 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.

نلقي نظرة على هذا الرجاء الأخرى حيث القيم المتوفرة في معالج المقاطعة الجداول هو مبين:

enter image description here

كما ترون الطاولة نقطة وحدة المعالجة المركزية لتنفيذ نظام الاتصال.يمكنك العثور على نظام لينكس استدعاء الجدول هنا.

حتى عن طريق تحريك قيمة 0x1 إلى EAX سجل استدعاء INT 0x80 في البرنامج الخاص بك ، يمكنك جعل عملية الانتقال تنفيذ التعليمات البرمجية في النواة التي سوف تتوقف (مخرج) عملية التشغيل الحالية (على لينكس x86 من إنتل وحدة المعالجة المركزية).

مقاطعة الأجهزة يجب عدم الخلط مع برنامج المقاطعة. هنا هو إجابة جيدة جدا في هذا الصدد.

هذا هو أيضا مصدر جيد.

يمكنك أن ترى الباحث 80h في العمل هنا.

<اقتباس فقرة>   

وكثافة 0x80 هو لغة التجميع   التعليمات التي تستخدم لاستدعاء   استدعاءات النظام في لينكس و x86 (أي،   معالجات إنتل المتوافقة).

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

الحد الأدنى 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() عن الملفات، وهلم جرا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top