2012-10-09 35 views
41

Tôi nghiên cứu hạt nhân Linux và phát hiện ra rằng đối với kiến ​​trúc x86_64, ngắt int 0x80 không hoạt động khi gọi cho cuộc gọi hệ thống."int 0x80" hoặc "syscall" tốt hơn là gì?

Câu hỏi đặt ra là: trong trường hợp của x86 kiến ​​trúc thích hợp hơn là gì syscall hoặc int 0x80 và tại sao?

EDIT: Tôi sử dụng kernel 3.4

+0

ở đâu Bạn đang tìm kiếm trong kernel mà bạn đang nhìn thấy việc sử dụng của 'int 0x80'? Bạn có thể chỉ định một số tệp không? – Mike

+0

@Mike Thật ra tôi đã tìm thấy một loại hướng dẫn vào hạt nhân Linux, nơi như một ví dụ nó đã được sử dụng. Nó là 2,6 dựa. – Alex

+0

Tương tự như http://stackoverflow.com/q/12776340/841108 câu hỏi –

Trả lời

55
  • syscall là cách mặc định để nhập chế độ hạt nhân trên x86-64. Hướng dẫn này không có sẵn ở chế độ hoạt động 32 bit trên bộ xử lý Intel.
  • sysenter là lệnh được sử dụng thường xuyên nhất để gọi các cuộc gọi hệ thống ở chế độ hoạt động 32 bit. Nó tương tự như syscall, một chút khó khăn hơn để sử dụng mặc dù, nhưng đó là mối quan tâm của hạt nhân.
  • int 0x80 là cách cũ để gọi một cuộc gọi hệ thống và cần tránh.

Cách thích hợp để gọi cuộc gọi hệ thống là sử dụng VDSO, một phần bộ nhớ được ánh xạ trong mỗi không gian địa chỉ quy trình cho phép sử dụng cuộc gọi hệ thống hiệu quả hơn (ví dụ, không nhập chế độ hạt nhân trong một số trường hợp). VDSO cũng chăm sóc khó khăn hơn, so với phương pháp int 0x80 cũ, xử lý các hướng dẫn syscall hoặc sysenter.

Ngoài ra, hãy xem thisthis.

+4

Các khuyến nghị để chọn một trong những khác là dành cho các nhà phát triển hạt nhân OS. Sự lựa chọn của họ sau đó là một phần của ABI, và nếu bạn đang phát triển cho một hệ điều hành nhất định, bạn phải tôn trọng ABI đó. Ví dụ, Linux/i386 sử dụng int 0x80 và chuyển đối số trong thanh ghi, trong khi MirBSD/i386 sử dụng int 0x80 và chuyển đối số trên stack, với một con trỏ khung ở giữa (có nghĩa là không có chi phí thiết lập trong không gian người dùng khi sử dụng cdecl). [Câu trả lời này chủ yếu dành cho những người được gửi ở đây nhưng không phải là nhà thiết kế hạt nhân hệ điều hành.] – mirabilos

+1

Câu hỏi đặt ra là về Linux và câu trả lời mô tả các phương tiện có thể gọi một syscall trên Linux (cả i386 và x86_64). Bạn cho rằng Linux/i386 chỉ sử dụng 'int 0x80' không đúng. Cách tốt nhất để tạo một syscall là sử dụng VDSO. –

-4

int 0x80 là một thuật ngữ tốt hơn để chỉ ra nó gọi hệ thống hạt nhân nói với nó để làm một cái gì đó.

Ý nghĩa và giải thích là interchangeble, 'tạo syscall' hoặc 'issue int 80h'.

Nó không khác gì với những ngày của DOS:

  • invoke int 21h để có được hệ điều hành DOS để làm điều gì đó depedning trên thanh ghi AX và tùy chọn ES: DX cặp đăng ký,
  • int 13h là BIOS xử lý đĩa cứng.
  • int 10h là màn hình EGA/VGA.
  • int 09h là trình xử lý bàn phím.

Chủ đề phổ biến ở đây là gì, khi ngắt/syscall được gọi, hạt nhân sẽ kiểm tra trạng thái của thanh ghi để xem loại cuộc gọi hệ thống nào là bắt buộc. Bằng cách xem ví dụ, ví dụ: eax đăng ký và xác định những gì cần thực hiện, ngữ cảnh nội bộ chuyển sang không gian hạt nhân, thực hiện quy trình và ngữ cảnh chuyển về không gian người dùng, với tùy chọn trả về kết quả cuộc gọi, tức là nó thành công hay thất bại.

+4

Trên thực tế, bộ chỉ lệnh x86_64 có lệnh 'syscall'. Về mặt này, 'int 0x80' chỉ được sử dụng cho một cuộc gọi hệ thống trong môi trường Linux 32 bit. –

+1

Vâng, trong sự công bằng, OP nên đã làm cho nó rõ ràng hơn * x86 kiến ​​trúc những gì là thích hợp hơn syscall hoặc int 0x80 * - nó là mơ hồ như OP gọi x86-64 và từ bối cảnh đó, được ngụ ý 32bit ... mà làm của tôi trả lời phần nào đi lạc lối hoặc bị gián đoạn ngoại lệ: P – t0mm13b

17

Câu trả lời của tôi here bao gồm câu hỏi của bạn.

Trong thực tế, các hạt nhân gần đây đang triển khai VDSO, đáng chú ý là để tối ưu hóa cuộc gọi hệ thống (hạt nhân đặt VDSO thành một số mã tốt nhất cho bộ xử lý hiện tại). Vì vậy, bạn nên sử dụng VDSO, và bạn sẽ sử dụng tốt hơn, cho các syscalls hiện có, giao diện được cung cấp bởi libc.

Lưu ý rằng, AFAIK, một phần đáng kể chi phí của các syscalls đơn giản là đi từ không gian người dùng đến hạt nhân và ngược lại. Do đó, đối với một số syscalls (có lẽ là gettimeofday, getpid ...) VDSO có thể tránh ngay cả điều đó (và về mặt kỹ thuật có thể tránh làm một syscall thực). Đối với hầu hết các syscalls (như open, read, send, mmap ....) chi phí hạt nhân của syscall đủ lớn để thực hiện bất kỳ cải tiến nào của không gian người dùng thành chuyển đổi không gian hạt nhân (ví dụ: sử dụng hướng dẫn máy SYSENTER hoặc SYSCALL thay vì INT) tầm thường.

+15

Quay lại trong 80386 ngày, cách nhanh nhất để nhập hạt nhân thực sự là [thực hiện lệnh không hợp lệ] (http://blogs.msdn.com/b/oldnewthing/archive/2004 /12/15/313250.aspx). –

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