下载搜学网app
查学校 查学区 查辅导 查饭桌 查询中考数据
logo 点击咨询

linux内核文件操作实例


android内核定制开发的过程中,定制了一个设备专用的驱动程序,其中用到了内核态的文件操作,原理代码列出来,供参考:





#include <linux/kernel.h> 

#include <linux/init.h> 

#include <linux/module.h> 

#include <linux/fs.h> 

#include <linux/string.h> 

#include <linux/mm.h> 

#include <linux/syscalls.h> 

#include <asm/unistd.h> 

#include <asm/uaccess.h> 

  

#define FILE_PATH_READ   "/home/guoyl/file_read_test"           //被读取的文件

#define FILE_PATH_WRITE "/home/guoyl/new_file_test"             //写入的目的文件

  

struct file *file = NULL; 

struct inode *inode = NULL; 

  

int *file_buf; 

loff_t fsize; 

mm_segment_t old_fs; 

  

/* 

 * 功能:内核文件打开函数 

 * file_path:文件路径 

 *  返回值:操作file类型结构变量 

 * 

 */

static int kernel_file_open(char *file_path) 

    file = filp_open(file_path,O_RDWR|O_CREAT,0777); 

    if(IS_ERR(file)){ 

        printk("Open file %s failed..\n",file_path); 

        return 0; 

    } 

  

    return 0; 

  

/* 

 * 功能:内核文件大小获取 

 * file:获得的文件file结构体 

 * 返回值:返回文件大小 

 * 

 */

static loff_t kernel_file_size(struct file *file) 

    inode = file->f_dentry->d_inode; 

    fsize = inode->i_size; 

    printk(KERN_ALERT "size = %d\n",(int)fsize); 

    return fsize; 

  

/* 

 * 功能:内核文件读函数 

 * 

 * 

 */

void *kernel_file_read(struct file *file,loff_t fsize) 

    int *buff; 

    loff_t *pos = &(file->f_pos); 

    buff = (int *)kmalloc(fsize+100,GFP_KERNEL); 

    vfs_read(file,buff,fsize,pos); 

    return buff; 

  

/* 

 * 功能:内核文件写函数 

 * 

 * 

 */

static int kernel_file_write(struct file *file,int *buf,loff_t fsize) 

    loff_t *pos = &(file->f_pos); 

    vfs_write(file,buf,fsize,pos); 

    return 0; 

  

static int hello_init(void) 

    printk(KERN_ALERT "hello alen's file-test in kernel module.\n"); 

    kernel_file_open(FILE_PATH_READ); 

    kernel_file_size(file); 

    old_fs = get_fs(); 

    set_fs(KERNEL_DS);             //扩展到用户空间 

    file_buf = kernel_file_read(file,fsize); 

    filp_close(file,NULL); 

    set_fs(old_fs);                     //恢复内核空间 

  

    kernel_file_open(FILE_PATH_WRITE); 

    old_fs = get_fs(); 

    set_fs(KERNEL_DS); 

    kernel_file_write(file,file_buf,fsize); 

    filp_close(file,NULL); 

    set_fs(old_fs); 

  

    return 0; 

  

static void hello_exit(void) 

    printk(KERN_ALERT "bye bye alen's kernel space..\n"); 

  

module_init(hello_init); 

module_exit(hello_exit); 

MODULE_LICENSE("Dual BSD/GPL");

下无代码!


评论