profile.c
来自「底层驱动开发」· C语言 代码 · 共 74 行
C
74 行
#include <linux/init.h>#include <linux/errno.h>#include <linux/kernel.h>#include <linux/proc_fs.h>#include <linux/types.h>#include <asm/ptrace.h>#include <asm/uaccess.h>#define SAMPLE_BUFFER_SIZE 8192static char* sample_buffer;static char* sample_buffer_pos;static int prof_running = 0;voidcris_profile_sample(struct pt_regs* regs){ if (!prof_running) return; if (user_mode(regs)) *(unsigned int*)sample_buffer_pos = current->pid; else *(unsigned int*)sample_buffer_pos = 0; *(unsigned int*)(sample_buffer_pos + 4) = instruction_pointer(regs); sample_buffer_pos += 8; if (sample_buffer_pos == sample_buffer + SAMPLE_BUFFER_SIZE) sample_buffer_pos = sample_buffer;}static ssize_tread_cris_profile(struct file *file, char __user *buf, size_t count, loff_t *ppos){ unsigned long p = *ppos; if (p > SAMPLE_BUFFER_SIZE) return 0; if (p + count > SAMPLE_BUFFER_SIZE) count = SAMPLE_BUFFER_SIZE - p; if (copy_to_user(buf, sample_buffer + p,count)) return -EFAULT; memset(sample_buffer + p, 0, count); *ppos += count; return count;}static ssize_twrite_cris_profile(struct file *file, const char __user *buf, size_t count, loff_t *ppos){ sample_buffer_pos = sample_buffer; memset(sample_buffer, 0, SAMPLE_BUFFER_SIZE);}static struct file_operations cris_proc_profile_operations = { .read = read_cris_profile, .write = write_cris_profile,};static int__init init_cris_profile(void){ struct proc_dir_entry *entry; sample_buffer = (char*)kmalloc(SAMPLE_BUFFER_SIZE, GFP_KERNEL); sample_buffer_pos = sample_buffer; entry = create_proc_entry("system_profile", S_IWUSR | S_IRUGO, NULL); if (entry) { entry->proc_fops = &cris_proc_profile_operations; entry->size = SAMPLE_BUFFER_SIZE; } prof_running = 1; return 0;}__initcall(init_cris_profile);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?