2016-10-03 10 views
8

Tôi đang viết một mô-đun hạt nhân để theo dõi một vài syscalls muốn trả về các đối số hàm cho người dùng (thông qua ổ cắm netlink) nếu cuộc gọi thành công.Nhân Linux - Làm thế nào để khớp một jprobe với kretprobe?

jprobe.kp.symbol_name = "rename"; 
jprobe.entry = rename_handler; 

kretprobe.kp.symbol_name = "rename"; 
kretprobe.handler = rename_ret_handler; 

static rename_obj_t _g_cur_rename = NULL; 

static void _rename_handler(const char *oldpath, const char *newpath) 
{ 
    _g_cur_rename = create_rename(oldpath, newpath); 
    jprobe_return(); 
} 

static void _rename_ret_handler(struct kretprobe_instance *ri, struct pt_regs *regs) 
{ 
    /* Send only if successful */ 
    if (regs_return_value(regs) == 0) { 
     add_send_queue(_g_cur_rename); 
    } 
    return 0; 
} 

Tôi lo ngại rằng một syscall đổi tên khác có thể preempt [1] giá trị hiện tại sau jprobe và tôi sẽ gửi các mã và đối số không chính xác.

jprobe: rename(a, b) 
    jprobe rename(c, d) 
    kretprobe 
kretprobe 

Edit: Bài viết này [2] khẳng định rằng ngắt bị vô hiệu hóa trong một handler kprobe. Nhưng điều đó có nghĩa là các ngắt bị vô hiệu hóa trong toàn bộ chuỗi (jprobe -> kprobe -> kretprobe) hoặc chỉ cho kprobe đơn?

  1. https://unix.stackexchange.com/questions/186355/few-questions-about-system-calls-and-kernel-modules-kernel-services-in-parallel
  2. https://lwn.net/Articles/132196/

Trả lời

1

ngắt bị vô hiệu hóa cho mỗi jprobe gọi: không cho toàn bộ chuỗi.

Bạn mong đợi bao nhiêu cuộc gọi trong thời gian ứng dụng xử lý chúng? Có phương pháp khác nhau tùy thuộc vào tốc độ bạn mong đợi các cuộc gọi đến. Phương pháp đơn giản nhất, nếu bạn chỉ mong đợi có thể vài trăm cuộc gọi trước khi bạn có thể xử lý chúng và bạn sẽ dành bộ nhớ tĩnh cho mục đích, là triển khai mảng tĩnh của rename_obj_t đối tượng trong bộ nhớ và sau đó sử dụng atomic_add từ hạt nhân asm bao gồm để trỏ đến mục nhập tiếp theo (mod kích thước của mảng của bạn).

Bằng cách này, bạn sẽ trả về một tham chiếu tĩnh duy nhất mỗi lần, miễn là bộ đếm không quấn quanh trước khi bạn xử lý giá trị trả về. atomic_add được đảm bảo có các rào cản bộ nhớ chính xác tại chỗ, do đó bạn không phải lo lắng về những thứ như kết hợp bộ nhớ cache.

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