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
Trả lời
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ể.
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!
Nó không nhất thiết phải 'int 80h'. x86 cũng cung cấp 'SYSCALL/SYSENTER'. –
- 1. Cuộc gọi hệ thống trên Windows
- 2. Bỏ qua cuộc gọi hệ thống
- 3. Mutex truy cập và hệ thống gọi
- 4. Cách ngăn chặn cuộc gọi hệ thống được thực hiện với ptrace
- 5. Cách theo dõi quy trình cho cuộc gọi hệ thống?
- 6. Đây có phải là cách hay để chặn cuộc gọi hệ thống không?
- 7. Ngăn chặn các quá trình thực thi các cuộc gọi hệ thống nhất định
- 8. Nhận hệ thống phân cấp cuộc gọi trong java
- 9. Có thể thêm cuộc gọi hệ thống qua LKM không?
- 10. fork() - nhiều quy trình và cuộc gọi hệ thống
- 11. Cuộc gọi hệ thống mà không cần chuyển ngữ cảnh?
- 12. về ngã ba và thực hiện cuộc gọi hệ thống
- 13. Cách tạo thư mục hệ thống tệp trong cuộc gọi/truy vấn SQL Server 2005
- 14. Android: export = "false" có hạn chế các cuộc gọi/truy cập hệ thống không?
- 15. Tìm kiếm triển khai cuộc gọi hệ thống trên hạt nhân Linux
- 16. Tôi có thể tìm mã nguồn cuộc gọi hệ thống ở đâu?
- 17. Gọi hệ thống trong ARM
- 18. Tài nguyên để tìm hiểu cách phát triển hệ thống lịch biểu/cuộc hẹn trong C#?
- 19. hệ thống awk gọi
- 20. Trong Perl, làm thế nào tôi có thể chặn cho một loạt các cuộc gọi hệ thống để kết thúc?
- 21. Tìm hiểu hệ thống Java kế thừa
- 22. Cuộc gọi hệ thống bị gián đoạn khi nào và như thế nào?
- 23. Điều gì có thể khiến các cuộc gọi hệ thống Perl bắt đầu thất bại?
- 24. EINTR và các cuộc gọi không chặn
- 25. Sự khác biệt giữa "cuộc gọi hệ thống C" và "thói quen thư viện C" là gì?
- 26. Bàn điều khiển Supress khi gọi "hệ thống" trong C++
- 27. Cuộc gọi hệ thống bị gián đoạn bằng tín hiệu như thế nào?
- 28. Trình biên dịch biết rằng hàm bạn đã sử dụng là một cuộc gọi hệ thống?
- 29. open() gọi hệ thống đa hình
- 30. Công cụ tạo hệ thống phân cấp cuộc gọi của thư viện
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
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
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