Các module mã nguồn chỉnh sửa và thêm

Một phần của tài liệu Chương trình sửa mã nguồn hệ điều hành Linux báo cáo dung lượng Ram và thu hồi bộ nhớ theo cơ chế slab cache (Trang 29 - 33)

1. Mục đích

Nhóm em dự định tạo ra 1 file: KSTN-DTVT-K52 trong thư mục /proc/sys/kerne để có thể dễ dàng giao tiếp với không gian kernel, chỉ cần viết số 2 vào file này là kernel tự động thu hồi một phần bộ nhớ đã cấp cho slab cache.

Để làm được việc này, nhóm em tạo ra 2 file mới là kernel_sysctl.c và KSTN-DTVT- K52.c và sửa đổi 2 file sysctl.c và Makefile để tạo ra file KSTN-DTVT-K52 trong thư mục /proc/sys/kernel và biên dịch module.

2. Chi tiết

2.1. File kernel_sysctl.c

File này đăng kí 1 file “KSTN-DTVT-K52” dưới thư mục /proc/sys/kernel. Vì vậy ban đầu ta phải khai báo gốc rồi đến thư mục con bằng cách chỉ rõ trong trường chdir.

#include <linux/errno.h> #include <linux/init.h> #include <linux/kernel.h>

#include <linux/sysctl.h> extern int sysctl_slab_reclaim;

extern int slab_reclaim_sysctl_handler(ctl_table *table, int write, void __user *buffer, size_t *length, loff_t *ppos);

static ctl_table slab_table[] = {

{ .procname = "KSTN-DTVT-K52", .data = &sysctl_slab_reclaim, .maxlen = sizeof(int), .mode = 0644, .proc_handler = &proc_dointvec_minmax }, { } };

static ctl_table slab_root_table[] = { { .procname = "kernel", .mode = 0555, .child = slab_table }, { } };

Trường data của file “KSTN-DTVT-K52” trỏ đến địa chỉ của biến toàn cục sys_slab_reclaim để thực hiện việc ghi vào file này từ không gian người sử dụng

“0604” cho phép mọi người dùng đều có quyền đọc, nhưng chỉ có người dùng root mới có quyền ghi vào file này. Trường proc_handler được khởi tạo với hàm proc_dointvec_minmax cho phép đọc và ghi một dãy số hay nhiều số nguyên và đảm bảo đầu vào nằm trong khoảng min/max cho phép, giá trị không nằm trong khoảng này sẽ bị từ chối. Hàm này cho phép việc ghi số nguyên vào file để thông báo cho kernel biết hoạt động sẽ diễn ra.

Cuối cùng là việc đăng kí và giải phóng (register và unregister) ở thời điểm lúc đầu và lúc kết thúc cuộc gọi hệ thống sysctl.

static struct ctl_table_header *slab_table_header;

int __init slab_init_sysctl(void) { slab_table_header = register_sysctl_table(slab_root_table); if (!slab_table_header) return -ENOMEM; return 0; } void slab_exit_sysctl(void) { unregister_sysctl_table(slab_table_header); }

2.2. Sửa file sysctl.c

Sau khi đã khởi tạo file “KSTN-DTVT-K52” ta cần đăng kí nó dưới hệ thống file /proc/sys. Do file “KSTN-DTVT-K52” nằm trong thư mục kernel nên ta sẽ thêm vào bảng cấu trúc kern_table [] cấu trúc file “KSTN-DTVT-K52”:

{ .procname = "KSTN-DTVT-K52", .data = &sysctl_slab_reclaim, .maxlen = sizeof(int),

.mode = 0644,

.proc_handler = slab_reclaim_sysctl_handler, },

Trường proc_handler bây giờ sẽ trao quyền điều khiển cho thủ tục

slab_reclaim_sysctl_handler . Hàm nằm trong file KSTN-DTVT-K52 và nằm ngoài file sysctl.c nên ta phải thêm dòng chỉ dẫn cho kernel biết hàm này nằm ngoài file sysctl.c và phải được tham chiếu tới với dòng chỉ dẫn:

extern int sysctl_slab_reclaim;

extern int slab_reclaim_sysctl_handler(ctl_table *table, int write, void __user *buffer, size_t *length, loff_t *ppos);

2.3. File KSTN-DTVT-K52.c

Trong file này ta sẽ định nghĩa hàm sử dụng để điều khiển hoạt động của file KSTN-DTVT-K52 trong hệ thống file /proc/sys/kernel.

Hàm slab_reclaim_sysctl_handler() thực chất gọi đến hàm shrink_slab() sẽ thực hiện việc giải phóng page cache khi người sử dụng viết 2 vào file KSTN-DTVT- K52 trong thư mục /proc/sys/kernel.

2.4. Sửa file Makefile

Để có thể compile được module KSTN-DTVT-K52 trên kernel tree thì ta phải thêm kernel_sysctl.o và KSTN-DTVT-K52.o vào Makefile:

obj-y = kernel_sysctl.o sched.o fork.o exec_domain.o panic.o printk.o \ cpu.o exit.o itimer.o time.o softirq.o resource.o \

sysctl.o sysctl_binary.o capability.o ptrace.o timer.o user.o \ signal.o sys.o kmod.o workqueue.o pid.o \

rcupdate.o extable.o params.o posix-timers.o \

notifier.o ksysfs.o pm_qos_params.o sched_clock.o cred.o \ async.o range.o jump_label.o KSTN-DTVT-K52.o obj-y += groups.o

Một phần của tài liệu Chương trình sửa mã nguồn hệ điều hành Linux báo cáo dung lượng Ram và thu hồi bộ nhớ theo cơ chế slab cache (Trang 29 - 33)

Tải bản đầy đủ (DOC)

(37 trang)
w