2010-07-20 32 views
6

Cách sử dụng chức năng find_module() của hạt nhân Linux? Tài liệu nói "phải giữ module_mutex".Cách sử dụng find_module?

  1. Điều đó có nghĩa là tôi nên mua khóa trong mã mô-đun trước khi tìm kiếm con trỏ đến mã khác?
  2. Khi đột biến này bị khóa mã nhân không phải là mô-đun?

Context

tôi gỡ lỗi một tập hợp các kernel module làm việc cùng nhau.

Mô-đun Một chức năng gọi của mô-đun B. Tại một số điểm trong hàm C của mô-đun A, số lượng sử dụng của mô-đun B không hợp lệ. Tôi đã determined rằng điều này không xảy ra trong chức năng của mô-đun B. Tôi muốn gỡ lỗi sử dụng số lượng mô-đun B từ C. Để làm điều này tôi sẽ sử dụng find_module() để có được một con trỏ đến B.

Trả lời

1

tôi xin đề nghị là nhiều hơn một chút phòng thủ trong mã của bạn:

#include <linux/module.h> 
#include <linux/capability.h> 

int do_my_work(void) 
{ 
    struct module *mod; 
    char name[MODULE_NAME_LEN]; 
    int ret, forced = 0; 

    if (!capable(CAP_SYS_MODULE) || modules_disabled) 
     return -EPERM; 

    /* Set up the name, yada yada */ 
    name[MODULE_NAME_LEN - 1] = '\0'; 

    /* Unless you absolutely need an uninterruptible wait, do this. */ 
    if (mutex_lock_interruptible(&module_mutex) != 0) { 
     ret = -EINTR; 
     goto out_stop; 
    } 

    mod = find_module(name); 
    if (!mod) { 
     ret = -ENOENT; 
     goto out; 
    } 

    if (!list_empty(&mod->modules_which_use_me)) { 
     /* Debug it. */ 
    } 

out: 
    mutex_unlock(&module_mutex); 
out_stop: 
    return(ret); 
} 

mô-đun_mutex được hạt nhân mua lại trong các thao tác khác nhau trên modu les. Tất cả trong số đó là ở /kernel/module.c và là:

  • Khi khởi tạo từng module riêng lẻ, cũng như tất cả các mô-đun (lúc khởi động, ví dụ).
  • Xóa mô-đun
  • Chờ cho đến khi mô-đun được tham chiếu (được sử dụng) bởi không có ai.
  • Khi hệ thống tập tin/proc cần một danh sách các mô-đun (oprofile và co. Làm cho việc sử dụng này).
  • Trong mã liên quan đến tracepoint; lặp qua và cập nhật tracepoints.
0

1) Có. Nhận module_mutex trong module của bạn trước khi gọi find_module()

2) Nó không được sử dụng bên ngoài mã mô-đun

Ví dụ:

struct module *mod; 

mutex_lock(&module_mutex); 

mod = find_module("MODULE_NAME"); 

if(!mod) { 
    printk("Could not find module\n"); 
    return; 
} 

mutex_unlock(&module_mutex);