2009-11-30 47 views

Trả lời

44

Nó chuyển điều khiển đến gián đoạn vector 0x80

Xem http://en.wikipedia.org/wiki/Interrupt_vector

Trên Linux, có một cái nhìn tại this: nó được sử dụng để xử lý system_call. Tất nhiên trên một hệ điều hành khác điều này có thể có nghĩa là một cái gì đó hoàn toàn khác nhau.

+3

bằng cách rút ngắn câu chuyện dài có nghĩa là ** CHỈ DẪN ** để được hướng dẫn trước đây. –

9

int 0x80 là ngôn ngữ lắp ráp hướng dẫn được sử dụng để gọi system call trong Linux trên x86 vi xử lý (ví dụ: Intel-tương thích).

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

+1

Đây là câu trả lời đúng. –

0

Nó kể về cpu để kích hoạt vector ngắt 0x80, mà trên Linux hệ điều hành là ngắt hệ thống gọi, được sử dụng để gọi chức năng hệ thống như open() cho các tập tin, vân vân.

+9

Nói đúng ra, nó không cho biết hạt nhân ... Nó báo cho CPU, tìm kiếm trình xử lý trong IDT, kết thúc là một con trỏ tới một số mã nhân. – asveikau

+0

Đúng.Tôi cho rằng các phrasing tốt hơn sẽ là nó nói với CPU để kích hoạt các vector, và các vector (như là một phần của hạt nhân) gọi hàm. – Amber

+0

Xuống cho "báo cho hạt nhân". – Andy

2

Như đã đề cập, nó gây ra sự kiểm soát để nhảy tới làm gián đoạn véc tơ 0x80. Trong thực tế, điều này có nghĩa là (ít nhất là dưới Linux) là một lời gọi hệ thống được gọi; cuộc gọi và đối số hệ thống chính xác được xác định bởi nội dung của thanh ghi. Ví dụ, exit() có thể được gọi bằng cách thiết lập% eax thành 1 theo sau là 'int 0x80'.

81

int nghĩa là ngắt và số 0x80 là số gián đoạn. Một gián đoạn chuyển luồng chương trình đến bất kỳ ai đang xử lý ngắt, ngắt 0x80 trong trường hợp này. Trong Linux, trình xử lý ngắt 0x80 là hạt nhân và được sử dụng để thực hiện các cuộc gọi hệ thống tới hạt nhân bằng các chương trình khác.

Hạt nhân được thông báo về hệ thống nào gọi chương trình muốn thực hiện, bằng cách kiểm tra giá trị trong thanh ghi% eax (cú pháp khí và cú pháp EAX trong Intel). Mỗi cuộc gọi hệ thống có các yêu cầu khác nhau về việc sử dụng các thanh ghi khác. Ví dụ: giá trị 1 trong% eax nghĩa là cuộc gọi hệ thống là exit() và giá trị bằng% ebx giữ giá trị của mã trạng thái cho exit().

+3

giải thích tốt .. – pradipta

+0

Aaah, một câu trả lời hoàn hảo :) tôi đã hiểu lầm rằng 'int' là số nguyên như trong HTML! : D –

+29

HTML là một ví dụ về "' int' là số nguyên "là rất ... vui, để nói rằng ít nhất: P – MestreLion

28

Hãy ghi nhớ rằng 0x80 = 80h = 128

Bạn có thể thấy here rằng INT chỉ là một trong rất nhiều hướng dẫn (thực sự là đại diện hội Ngôn ngữ (hay tôi nên nói 'ghi nhớ') của nó) tồn tại trong tập lệnh x86. Bạn cũng có thể tìm thêm thông tin về hướng dẫn này trong sách hướng dẫn riêng của Intel được tìm thấy here.

Để tóm tắt từ tiếng Anh PDF:

INT n/VÀO/INT 3 Gọi để Ngắt Thủ tục

Các n Lệnh INT tạo ra một cuộc gọi đến ngắt hoặc ngoại lệ xử lý theo quy định với các điểm đến toán hạng. Toán hạng đích chỉ định một vectơ từ 0 đến 255, được mã hóa dưới dạng giá trị trung giankhông dấu 8 bit. Lệnh int n là cách nhớ chung cho thực hiện cuộc gọi được tạo ra phần mềm tới trình xử lý ngắt.

Như bạn thấy 0x80 là toán hạng điểm đến trong câu hỏi của bạn. Tại thời điểm này, CPU biết rằng nó sẽ thực thi một số mã nằm trong Kernel, nhưng mã nào? Điều đó được xác định bởi Vector ngắt trong Linux.

Một trong những gián đoạn phần mềm DOS hữu ích nhất đã bị gián đoạn 0x21. Bằng cách gọi nó với các thông số khác nhau trong sổ đăng ký (chủ yếu là ah và al), bạn có thể truy cập các hoạt động IO khác nhau, đầu ra chuỗi và nhiều hơn nữa.

Hầu hết các hệ thống và dẫn xuất Unix không sử dụng ngắt phần mềm, ngoại trừ ngắt 0x80, được sử dụng để thực hiện cuộc gọi hệ thống. Điều này được thực hiện bằng cách nhập giá trị 32 bit 32 bit tương ứng với hàm hạt nhân vào thanh ghi EAX của bộ xử lý và sau đó thực thi INT 0x80.

Hãy xem này xin vui lòng nơi các giá trị khác còn trống của bảng điều khiển ngắt được hiển thị:

enter image description here

Như bạn có thể thấy những điểm bảng CPU để thực hiện một cuộc gọi hệ thống. Bạn có thể tìm thấy bảng Gọi hệ thống Linux here.

Vì vậy, bằng cách di chuyển giá trị 0x1 sang thanh ghi EAX và gọi INT 0x80 trong chương trình của bạn, bạn có thể thực hiện quá trình này bằng cách thực thi mã trong Kernel sẽ dừng (thoát) quy trình đang chạy (trên Linux, x86 Intel CPU).

Ngắt phần cứng không được nhầm lẫn với phần mềm gián đoạn. Here là một câu trả lời rất tốt về vấn đề này.

This cũng là nguồn tốt.

Bạn có thể xem int 80h trong hành động here.

+3

Bạn có câu trả lời sáng suốt nhất trên trang này. Cảm ơn! – crisron

+0

Hệ thống Linux Bảng liên kết cuộc gọi bị hỏng = \ –

+1

* Hầu hết các hệ thống và dẫn xuất Unix không sử dụng ngắt phần mềm (ngoại trừ int 0x80) * có vẻ như một cách kỳ lạ để đặt nó. Hệ thống 'int 0x80' i386 Linux gọi là ABI rất giống với hệ điều hành DOS 'int 0x21' ABI. Đặt một số gọi trong một thanh ghi (AH cho DOS, EAX cho Linux), và các arg khác trong các thanh ghi khác, sau đó chạy lệnh ngắt phần mềm. Sự khác biệt chính là những gì hệ thống gọi cho phép bạn làm (truy cập phần cứng trực tiếp trong DOS nhưng không phải Linux), không phải cách bạn gọi chúng. –

4

Minimal dụ 16-bit

Đầu tiên học cách để tạo ra một hệ điều hành bootloader tối thiểu và chạy nó trên QEMU và phần cứng thực như tôi đã giải thích ở đây: https://stackoverflow.com/a/32483545/895245

Bây giờ bạn có thể chạy trong 16 -bit chế độ thực:

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 

này sẽ làm theo thứ tự:

  • Do 0.
  • Do 1.
  • hlt: ngừng thực hiện

Lưu ý cách xử lý sẽ cho xử lý đầu tiên tại địa chỉ 0, và một trong những thứ hai tại 4: đó là một bảng xử lý gọi là IVT, và mỗi mục có 4 byte.

Minimal example that does some IO để hiển thị bộ xử lý.

chế độ bảo vệ tối thiểu

hệ điều hành hiện đại chạy ở chế độ bảo vệ cái gọi là.

Việc xử lý có nhiều tùy chọn hơn ở chế độ này, do đó phức tạp hơn, nhưng tinh thần thì giống nhau.

Bước quan trọng là sử dụng các hướng dẫn LGDT và LIDT, trỏ đến địa chỉ của cấu trúc dữ liệu trong bộ nhớ (Bảng mô tả ngắt) mô tả các trình xử lý.

Minimal example

Linux sử dụng 0x80

Linux thiết lập xử lý ngắt cho 0x80 như vậy mà nó thực hiện các cuộc gọi hệ thống, một cách cho các chương trình Userland để giao tiếp với kernel.

Bạn không thể đặt trình xử lý của riêng mình trực tiếp từ vùng người dùng vì bạn chỉ có vòng 3 và Linux ngăn bạn làm như vậy.

Hello world dụ:

.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 

Biên dịch và chạy với:

gcc main.S as -o main.o main.s 
ld -o main.out -s main.o 
./main.out 

lựa chọn thay thế tốt hơn

int 0x80 đã được thay thế bằng giải pháp thay thế tốt hơn: : thứ nhất sysenter, sau đó VDSO .

x86_64 có syscall.

Xem thêm: What is better "int 0x80" or "syscall"?

1

Lệnh "int" ném ngắt.

Khi nhận được ngắt, CPU tạm dừng. Sau đó kiểm tra IDT (hoặc tôi nterrupt D escriptor T thể), mà các cửa hàng gián đoạn thói quen (chức năng gọi khi một ngắt được nhận).

Trong nhiều * HĐH NIX, cuộc gọi hệ thống bị gián đoạn; có nghĩa là, sau khi các đối số được truyền tới thanh ghi (EAX, EBX, ECX, EDX, vv ..), ngắt 0x80 được gọi. Hạt nhân đã thiết lập IDT để chứa một trình xử lý ngắt trên 0x80, được gọi khi nó nhận int80h. Điều này xử lý các đối số và gọi hàm hạt nhân.

Chức năng này có thể có ý nghĩa khác trong một hệ điều hành khác. Hãy chắc chắn kiểm tra tài liệu của nó hoặc thử tách chương trình cho nền tảng đó

+0

Thực tế thú vị: Hệ thống i386 của FreeBSD gọi ABI chuyển args trên ngăn xếp không gian người dùng. Chỉ 'eax' được sử dụng cho số syscall. http://asm.sourceforge.net/intro/hello.html –

+0

thú vị .. tôi cho rằng nó cũng hoạt động. –

Các vấn đề liên quan