2012-02-20 35 views
6

Tôi đang tìm các triển khai của open(), close(), write()unlink(), nhưng tôi không thể tìm thấy chúng ở bất kỳ đâu! Mỗi hàm tôi tìm thấy giống như sys_open, do_open, etc_open ... nhưng không có gì với giao diện chúng tôi sử dụng. Bạn có thể giúp tôi được không?Tìm kiếm triển khai cuộc gọi hệ thống trên hạt nhân Linux

tôi cần phải khám phá những loại kiểm tra an ninh họ làm

Trả lời

5

Bạn cần tìm kiếm macro SYSCALL_DEFINE trong nguồn hạt nhân. Ví dụ, grepping cho unlink tại /fs đưa ra sau đây:

$ grep -r -n SYSCALL_DEFINE *.c | grep unlink

namei.c:2811:SYSCALL_DEFINE3(unlinkat, int, dfd, const char __user *, pathname, int, flag) 
namei.c:2822:SYSCALL_DEFINE1(unlink, const char __user *, pathname) 

Lưu ý rằng số sau SYSCALL_DEFINE là đếm luận syscall.

5

Nếu bạn có nghĩa là thư viện cuộc gọi như những mặt hàng trong fcntl.h, họ không nằm trong hạt nhân, chúng là một phần của glibc.

Nếu bạn đề cập đến các cuộc gọi hạt nhân thực, hệ thống gọi xyzzy thường được xử lý theo chức năng sys_xyzzy.

File entry.S, ít nhất là trong 2.4 (Tôi đã không nhìn hạt nhân sau), đã tổ chức một hệ thống bản đồ bảng số cuộc gọi đến các chức năng:

.data 
    ENTRY(sys_call_table) 
     .long SYMBOL_NAME(sys_ni_syscall)  /* 0 - old "setup()" system call*/ 
     .long SYMBOL_NAME(sys_exit) 
     .long SYMBOL_NAME(sys_fork) 
     .long SYMBOL_NAME(sys_read) 
     .long SYMBOL_NAME(sys_write) 
     .long SYMBOL_NAME(sys_open)    /* 5 */ 
     .long SYMBOL_NAME(sys_close) 
     .long SYMBOL_NAME(sys_waitpid) 
     .long SYMBOL_NAME(sys_creat) 
     .long SYMBOL_NAME(sys_link) 
     .long SYMBOL_NAME(sys_unlink)   /* 10 */ 
     .long SYMBOL_NAME(sys_execve) 
     .long SYMBOL_NAME(sys_chdir) 
     .long SYMBOL_NAME(sys_time) 
     .long SYMBOL_NAME(sys_mknod) 
     .long SYMBOL_NAME(sys_chmod)   /* 15 */ 
     : 
     .long SYMBOL_NAME(sys_ni_syscall)  /* sys_remap_file_pages */ 
     .long SYMBOL_NAME(sys_ni_syscall)  /* sys_set_tid_address */ 

KernelGrok dường như có một trang hữu ích cho thấy hệ thống cuộc gọi, tên, thông số và nơi tìm nguồn. Ví dụ: (hơi định dạng lại):

0 sys_restart_syscall 
     eax = 0x00 
     kernel/signal.c:2058 
    1 sys_exit 
     eax = 0x01 
     ebx = int error_code 
     kernel/exit.c:1046 
    2 sys_fork 
     eax = 0x02 
     ebx = struct pt_regs * 
     arch/alpha/kernel/entry.S:716 
    3 sys_read 
     eax = 0x03 
     ebx = unsigned int fd 
     ecx = char __user *buf 
     edx = size_t count 
     fs/read_write.c:391 
    4 sys_write 
     eax = 0x04 
     ebx = unsigned int fd 
     ecx = const char __user *buf 
     edx = size_t count 
     fs/read_write.c:408 
    : 

v.v. Nhưng, là trường cũ, tôi thích giữ nguồn hạt nhân địa phương và chỉ sử dụng grep :-)

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