内核中写文件

基于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)    收藏  举报

导航