2012-04-13 36 views
22

Trong linux, nơi tôi có thể tìm thấy mã nguồn cho tất cả các cuộc gọi hệ thống cho rằng tôi có cây nguồn? Ngoài ra nếu tôi muốn tìm kiếm mã nguồn và lắp ráp cho một cuộc gọi hệ thống cụ thể là có cái gì mà tôi có thể gõ vào terminal như -my_system_call?Tôi có thể tìm mã nguồn cuộc gọi hệ thống ở đâu?

+2

http://kernel.org/ – TJD

Trả lời

29

Bạn sẽ cần nguồn hạt nhân Linux để xem nguồn thực tế của cuộc gọi hệ thống. Các trang hướng dẫn sử dụng, nếu được cài đặt trên hệ thống cục bộ của bạn, chỉ chứa tài liệu của các cuộc gọi chứ không phải bản thân nguồn của chúng.

Thật không may cho bạn, các cuộc gọi hệ thống không được lưu trữ chỉ trong một vị trí cụ thể trong toàn bộ cây hạt nhân. Điều này là do các cuộc gọi hệ thống khác nhau có thể tham chiếu đến các phần khác nhau của hệ thống (quản lý quy trình, quản lý hệ thống tệp, v.v.) và do đó sẽ không thể lưu trữ chúng ngoài phần của cây liên quan đến phần cụ thể đó của hệ thống.

Điều tốt nhất bạn có thể làm là tìm kiếm macro SYSCALL_DEFINE[0-6]. Nó được sử dụng (rõ ràng) để xác định khối mã đã cho như một cuộc gọi hệ thống. Ví dụ, fs/ioctl.c có đoạn mã sau:

SYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd, unsigned long, arg) 
{ 
/* do freaky ioctl stuff */ 
} 

một định nghĩa như vậy có nghĩa là ioctl syscall được khai báo và phải mất ba đối số. Số bên cạnh số SYSCALL_DEFINE có nghĩa là số lượng đối số. Ví dụ, trong trường hợp của getpid(void), khai báo trong kernel/timer.c, chúng tôi đã đoạn mã sau:

SYSCALL_DEFINE0(getpid) 
{ 
     return task_tgid_vnr(current); 
} 

Hy vọng rằng sẽ xóa mọi thứ lên một chút.

2

Từ quan điểm của ứng dụng, system call là hoạt động cơ bản và nguyên tử được thực hiện bởi kernel.

Assembly Howto giải thích những gì đang xảy ra, về hướng dẫn máy.

Tất nhiên, hạt nhân đang làm rất nhiều việc khi xử lý một syscall.

Thực ra, bạn hầu như có thể tin rằng toàn bộ mã nhân được dành để xử lý tất cả các cuộc gọi hệ thống (điều này không hoàn toàn đúng, nhưng hầu như từ quan điểm của ứng dụng, hạt nhân chỉ hiển thị các cuộc gọi hệ thống). answer khác của Daniel Kamil Kozar giải thích chức năng hạt nhân nào bắt đầu xử lý một số cuộc gọi hệ thống (nhưng rất thường xuyên, nhiều phần khác của hạt nhân gián tiếp tham gia vào các cuộc gọi hệ thống; quy trình con được tạo bởi một tòa nhà thành công fork).

1

Tôi biết đó là cũ, nhưng tôi đang tìm kiếm các nguồn cho _system_call() quá và thấy miếng ngon này

đang thực sự đối với điểm vào system_call có thể được tìm thấy trong/usr/src/linux/kernel/sys_call. S Mã thực tế cho nhiều cuộc gọi hệ thống có thể được tìm thấy trong /usr/src/linux/kernel/sys.c, và phần còn lại được tìm thấy ở nơi khác. tìm thấy là bạn của bạn.

Tôi cho rằng đây là ngày, vì tôi thậm chí không có tệp đó. Tuy nhiên, grep tìm thấy ENTRY(system_call) trong arch/x86/kernel/entry_64.S và dường như là thứ gọi các cuộc gọi hệ thống riêng lẻ. Tôi không lên trên intel-syntax x86 asm của tôi ngay bây giờ, vì vậy bạn sẽ phải xem và xem nếu đây là những gì bạn muốn.

+0

'entry_64.S' không còn tồn tại trong dòng chính 4.8. – sherrellbc

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