内核模块编程对用户空间文件的访问

/*


* HOW TO READ\WRITE THE FILE IN KERNEL MODULE


*/


#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>


#include <linux/slab.h>




#define FILE_PATH_READ "/usr/module/file_read_test"


//打开文件路径(包括文件名),未来将要读的


#define FILE_PATH_WRITE "/usr/module/file_write_test"


//打开文件路径(包括文件名),未来将要写的


struct file *file = NULL; //保存打开文件的文件指针变量


struct inode *inode = NULL; //为了获取文件大小用的inode结构变量


int *file_buf; //保存开辟的内存空间的地址的指针变量


loff_t fsize; //保存文件大小的变量


mm_segment_t old_fs; //保存内存边界的变量


/*


* kernel_file_open封装了文件打开函数


* 参数为文件路径(包含文件名)。


* 操作file类型结构变量。


* 打开方式为读写(没有则创建)


*/


static int kernel_file_open(char *file_path)


{


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


    if (IS_ERR(file)) 


      {


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


        return 0;


      }


}


/*


* kernel_file_size封装了获取文件大小函数


* 参数为待获取大小的文件指针。


* 操作inode类型结构变量。


* 返回值为文件大小,单位字节


*/


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;


}


/*


* kernel_addr_limit_expend封装了内存边界扩展函数


* 参数无。


*/


static int kernel_addr_limit_expend(void)


{


    old_fs = get_fs();


    set_fs(KERNEL_DS);
 
    return 0;


}


/*


* kernel_addr_limit_resume封装了内存边界恢复函数


* 参数无。


*/


static int kernel_addr_limit_resume(void)


{


    set_fs(old_fs);


}


/*


* kernel_file_read封装了读文件函数


* 参数为open的文件指针,获取的文件大小


* 返回值为读入到内存中的首地址。


*/


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


{


    int *buf;


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


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


    vfs_read(file, buf, fsize, pos);
   
    printk("vfs_read=%s",buf);


    return buf;


}


/*


* kernel_file_ write封装了读文件函数


* 参数为open的文件指针,数据在内存中的地址,写入到文件的字节数


*/


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);


}


/*


* ko的主函数


*/


static int hello_init(void) //ko的主函数


{


    printk(KERN_ALERT "HOW TO ACCESEE THE FILE IN KERNEL MODULE/n");


    kernel_file_open(FILE_PATH_READ); //打开文件file_read_test


    kernel_file_size(file); //获取file_read_test的大小


    /*read file to mem*/


    kernel_addr_limit_expend(); //边界扩展


    file_buf = kernel_file_read(file,fsize); //读操作


    filp_close(file, NULL); //关闭文件file_read_test


    kernel_addr_limit_resume(); //边界恢复


    /*write mem to file*/


    kernel_file_open(FILE_PATH_WRITE); //打开文件new_file_test,没有则创建


    kernel_addr_limit_expend(); //边界扩展


    kernel_file_write(file,file_buf,fsize); //将前面读到内存中的数据,写入到文件new_file_test中


    filp_close(file, NULL); //关闭文件


    kernel_addr_limit_resume(); //边界恢复


    return 0;


}


static void hello_exit(void)


{


    printk(KERN_ALERT "CLEAN THE MODULE /n");


}


module_init(hello_init);


module_exit(hello_exit);


MODULE_LICENSE("GPL");


MODULE_AUTHOR("dead_angel");


MODULE_DESCRIPTION("ACCESS THE FILE IN KERNEL MODULE!");
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值