最近在安卓下实现一个new feature的时候,需要在驱动中读取sysfs中的一个文件的数据,经过计算后保存到另一个文件中。
在kernel中读写文件和在userspace下读取文件需要调用不同的interface。
全局变量:
#define FILE_PATH "/data/xxxx.cfg"
#define BUF_SIZE 128
char global_buf[BUF_SIZE];
struct file *fp;
读函数:
static int get_data_from_sysfs(const char *path, char *buf)
{
mm_segment_t fs;
fp = filp_open(path, O_RDONLY, 0644);
if (unlikely(IS_ERR(fp))) {
pr_info("Fail to open file \"%s\"\n", path);
return -1;
}
fp->f_pos = 0;
fs = get_fs();
set_fs(KERNEL_DS);
fp->f_op->read(fp, buf, BUF_SIZE, &(fp->f_pos));
set_fs(fs);
filp_close(fp, NULL);
return 0;
}
写函数
static int update_data_to_sysfs(void)
{
mm_segment_t fs;
sprintf(global_buf, "%u %u %u\n", aaa,
bbb, ccc);
fp = filp_open(FILE_PATH, O_RDWR | O_CREAT, 0644);
fp->f_pos = 0;
fs = get_fs();
set_fs(KERNEL_DS);
fp->f_op->write(fp, global_buf, sizeof(global_buf), &fp->f_pos);
set_fs(fs);
return 0;
}
函数原型中,fp->f_op->write和fp->f_op->read的第二个参数都是userspace下的数据,所以需要经过转换成内核态可用的,调用完成后在转换回用户态。
时间: 2024-10-01 11:31:37