2012-02-03 44 views
6

Tôi đang cố gắng theo dõi cuộc gọi hàm mức cao chặn một quy trình nhất định. Một ví dụ như vậy là scanf, sẽ chặn thiết bị đầu cuối cho đến khi nó nhận được một '\ n'. Bây giờ tôi truy tìm scanf xuống đến getc (scanf sử dụng getc để có được các ký tự từ stdin). Câu hỏi của tôi là, quá trình diễn giải dữ liệu đến từ bàn phím là gì, tất cả các cách thức thông qua hạt nhân và sự trở lại của getc là gì? Cũng như thế nào scanf dừng thiết bị đầu cuối (là máy tính chạy không tải, hoặc làm việc trên một nhiệm vụ khác)? Cảm ơn BạnTruy tìm cuộc gọi hệ thống chặn C

+3

Bạn có yêu cầu chúng tôi chỉ cho bạn 'strace' hoặc bạn đang hỏi cách chặn cuộc gọi hệ thống trong công việc chung? – cha0site

+1

Nếu bạn quan tâm đến cách nó được thực hiện trên cấp độ lắp ráp: http://www.programmersheaven.com/mb/x86_asm/295346/295346/keyboard-input/ :) – Vyktor

+2

Hãy thử chạy nó dưới một trình gỡ rối như gdb. Nhấn control-C, sau đó nhập "bt". Scanf gọi getc, mà các cuộc gọi đọc, đó là một systemcall mà không trở lại cho đến khi có thực sự là somthing để đọc. Bạn bị chặn đọc. – wildplasser

Trả lời

5

Bất cứ khi nào một quá trình phát ra lời gọi hệ thống (chẳng hạn như chặn read(2)), quá trình bắt đầu thực thi ở chế độ hạt nhân, tức là mã hạt nhân xử lý cuộc gọi hệ thống cụ thể được gọi.

Sau đó, tùy thuộc vào thiết bị cơ bản và trình điều khiển, quy trình có thể bị tạm ngưng và đặt trong hàng chờ. Khi một phím được nhấn, mã hạt nhân xử lý các ngắt được gọi và từ đó nó được khấu trừ phím nào được nhấn.

Nhân sau đó tiếp tục quá trình đang đợi đầu vào này và cung cấp dữ liệu bằng cách sao chép nó từ không gian địa chỉ hạt nhân đến không gian địa chỉ của quy trình cụ thể.

1

Cuộc gọi hệ thống cho phép chương trình người dùng thực hiện ở chế độ ưu tiên. Khi chương trình người dùng thực hiện cuộc gọi hệ thống, nó sẽ tạo ra 0x80 ngắt. Khi hạt nhân nhận được ngắt, nó sẽ thực hiện tra cứu trên Bảng mô tả ngắt (IDT) cho 0x80 và thực thi trình xử lý tương ứng (syscall). Sau khi thực hiện xử lý này, điều khiển sẽ được chuyển sang chương trình người dùng sau khi sao chép thông tin từ bộ nhớ hạt nhân sang bộ nhớ người dùng.

Trong trường hợp này, scanf được ánh xạ tới hàm thư viện, "đã đọc". Cuộc gọi hệ thống "đọc" gọi "sys_read", sau đó đọc từ luồng đầu vào STDIN bằng cách sử dụng getc. Hi vọng điêu nay co ich!

+0

Nó không nhất thiết phải 'int 80h'. x86 cũng cung cấp 'SYSCALL/SYSENTER'. –

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