内核中写文件
基于msm-5.4
1. 例子
#define GPU_FREQ_FILE "/sys/class/kgsl/kgsl-3d0/min_clock_mhz" static struct file *gpu_freq_fp = NULL; void set_gpu_min_freq(int freq) { static char freq_arry[2] = {'1', '\0'}; loff_t pos = 0; if (gpu_freq_fp == NULL) { gpu_freq_fp = filp_open(GPU_FREQ_FILE, O_RDWR, 0); if (IS_ERR(gpu_freq_fp)) { return; } } kernel_write(gpu_freq_fp, freq_arry, 2, &pos); }
2. 用户与内核操作文件的区别
(1) 系统调用操作文件
SYSCALL_DEFINE3(open, filename, flags, mode) do_sys_open //open.c fd = get_unused_fd_flags(flags); struct file *f = do_filp_open(dfd, tmp, &op); fd_install(fd, f);
(2) 内核读写文件
filp_open(filename, flags, mode) //返回 struct file 结构 file_open_name(name, flags, mode) do_filp_open(AT_FDCWD, name, &op)
可以看到,在用户空间读写文件,fd是每进程的,内核中读写文件就是全局的,没有fd install过程了。
3. 实验
在内核中的一个进程上下文中打开文件,这个进程的fd列表中并没有这个文件, 说明内核中操作的文件属于系统。
posted on 2025-03-24 13:51 Hello-World3 阅读(36) 评论(0) 收藏 举报