我正在学习内核编程,我编写了一个小模块来在/proc
中创建一个条目,当我在该文件上使用cat
时,尝试从中读取内容。代码是:
#define PROC_DIR_NAME "driver/kernel_test_dir"
#define KERNEL_DATA "This is kernel test"
static int proc_entry_open(struct inode *inode, struct file *file) {
return 0;
}
static int proc_entry_close(struct inode *inode, struct file *file) {
return 0;
}
// Return temperature thresholds
static ssize_t proc_entry_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) {
ssize_t len = (ssize_t) strlen(KERNEL_DATA);
if(count > len)
{
count = len;
}
copy_to_user(buf,KERNEL_DATA,count);
*ppos += count;
return count;
}
static struct file_operations fops_proc_entry = {
.open = proc_entry_open,
.read = proc_entry_read,
.release = proc_entry_close,
};
static int __init init_test_kernel(void) {
proc_dir = proc_mkdir(PROC_DIR_NAME, NULL);
if(proc_dir == NULL) {
return -ENOMEM;
}
proc_entry_file = proc_create ("kernel_test_file", S_IRUSR, proc_dir,&fops_proc_entry);
if(!proc_entry_file) {
return -ENOMEM;
}
printk(KERN_INFO "kernel_test: Kernel Test module started\n");
return 0;
}
// Cleanup module
static void __exit cleanup_test_kernel(void) {
remove_proc_entry("kernel_test_file", proc_dir);
remove_proc_entry(PROC_DIR_NAME,NULL);
printk(KERN_INFO "kernel_test: Kernel Test module stopped\n");
}
module_init(init_test_kernel);
module_exit(cleanup_test_kernel);
当我做sudo cat /proc/driver/kernel_test_dir/kernel_test_file
时,控制台上没有显示任何内容。但是,如果我使用rmmod删除模块,控制台会刷新如下字符串:
This is kernel testThis is kernel testThis is kernel testThis is kernel test
等。
为什么这样工作?