2013-09-24 47 views
6

Sự khác biệt giữa SYS_exit, sys_exit() và exit() là gì?Cuộc gọi hệ thống: sự khác biệt giữa sys_exit(), SYS_exit và thoát()

Những gì tôi hiểu:

  • Các hạt nhân Linux cung cấp các cuộc gọi hệ thống, mà được liệt kê trong man 2 syscalls.
  • Có các hàm bao bọc của các syscalls này được cung cấp bởi glibc có các tên chủ yếu tương tự như các syscalls.

Câu hỏi của tôi: Trong man 2 syscalls, không có đề cập đến SYS_exit và sys_exit(), chẳng hạn. Họ là ai?

Lưu ý: syscall exit đây chỉ là ví dụ. Câu hỏi của tôi thực sự là: SYS_xxx và sys_xxx() là gì?

Trả lời

3

Tôi sẽ sử dụng exit() như trong ví dụ của bạn mặc dù điều này áp dụng cho tất cả các cuộc gọi hệ thống.

Các chức năng của biểu mẫu sys_exit() là các điểm vào thực tế đối với thường trình hạt nhân thực hiện hàm mà bạn nghĩ là exit(). Những biểu tượng này thậm chí không có sẵn cho người lập trình chế độ người dùng. Đó là, trừ khi bạn đang hack hạt nhân, bạn không thể liên kết đến các chức năng này bởi vì các biểu tượng của chúng không có sẵn bên ngoài hạt nhân. Nếu tôi đã viết libmsw.a có chức năng phạm vi tệp như

static int msw_func() {} 

được xác định trong đó, bạn sẽ không thành công khi cố gắng liên kết với nó vì nó không được xuất trong bảng biểu tượng libmsw; đó là:

cc your_program.c libmsw.a 

sẽ mang lại một lỗi như:

ld: cannot resolve symbol msw_func 

bởi vì nó không được xuất khẩu; cùng áp dụng cho sys_exit() như được chứa trong hạt nhân.

Để chương trình người dùng truy cập vào các thói quen hạt nhân, giao diện syscall (2) cần được sử dụng để thực hiện chuyển đổi từ chế độ người dùng sang chế độ hạt nhân. Khi chế độ đó chuyển đổi (somtimes gọi là một cái bẫy) xảy ra một số nguyên nhỏ được sử dụng để tìm kiếm các thói quen hạt nhân thích hợp trong một bảng hạt nhân bản đồ số nguyên để chức năng hạt nhân. Một mục trong bảng có dạng

{SYS_exit, sys_exit}, 

đâu SYS_exit là một vĩ mô Preprocessor đó là

#define SYS_exit (1) 

và đã được 1 kể từ trước khi bạn được sinh ra vì chưa có lý do gì để thay đổi nó. Nó cũng xảy ra là mục nhập đầu tiên trong bảng các cuộc gọi hệ thống mà làm cho tìm kiếm một chỉ mục mảng đơn giản.

Khi bạn lưu ý trong câu hỏi của mình, cách thích hợp để chương trình chế độ người dùng thông thường truy cập sys_exit là thông qua trình bao bọc mỏng trong glibc (hoặc thư viện lõi tương tự). Lý do duy nhất bạn cần làm với SYS_exit hoặc sys_exit là nếu bạn đang viết mã hạt nhân.

+0

glibc không cung cấp trình bao bọc cho mọi cuộc gọi hệ thống, vì vậy trong một số trường hợp, bạn có thể cần macro tiền xử lý 'SYS_' tương ứng để gọi trực tiếp hệ thống thông qua' syscall() 'trong mã vùng người dùng. Những trường hợp này là rất hiếm. –

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