#include // Needed by all modules #include // KERN_INFO #include // for_each_process, pr_info #include #include #include // For proc filesystem ssize_t read_info(struct file *filp, char *buf, size_t count, loff_t *offp) { size_t sofar = 0; struct task_struct* task_list; size_t process_counter = 0; if(!offp || *offp != 0) return 0; for_each_process(task_list) { if(sofar == count) goto out; ++process_counter; if(!task_list){ printk("task_list was 0!\n"); goto out; } if(!task_list->comm){ printk("task_list->comm was 0!\n"); goto out; }if(!task_list->mm){ printk("task_list->mm was 0!\n"); sofar += snprintf(buf + sofar, count - sofar, "Task %s: has no mm!\n", task_list->comm); continue; } sofar += snprintf(buf + sofar, count - sofar, "Task %s: %lu\n", task_list->comm, task_list->mm->hiwater_rss); } out: *offp = sofar; return sofar; } struct file_operations proc_fops = { read: read_info }; int init_module(void) { proc_create("print_mem_info_output", 0, NULL, &proc_fops); return 0; } void cleanup_module(void) { remove_proc_entry("print_mem_info_output", NULL); } MODULE_LICENSE("MIT");