(内核模块)内核中文件的读写 (linux c语言)

本文介绍了在Linux内核模块中如何进行文件的读写操作,包括不推荐使用sys_open,而是建议使用filp->open配合struct file的read/write方法。在调用读写操作前,需要设置FS,并通过set_fs(get_ds())处理内核空间的寻址限制。同时,文章提到了使用filp->f_op->llseek函数来改变文件指针的位置以便正确读取数据。
摘要由CSDN通过智能技术生成

一般有两种方式:

    1. 系统调用
    1. 用flip->open()等函数。
  1. 利用系统调用:
  • sys_open,sys_write,sys_read等。
    其实分析过sys_open可以知道,最后调用的也是filp->open。
    sys_open ==> do_sys_open ==> filp->open
    在linuxsir上的一个帖子,上面一个版主说:sys_open和进程紧密相关,往往不在内核中使用。
    而其实sys_open最后也是调用了filp->open。
    其实好像Linux2.6.20后面就不推荐使用sys_open,那我们这里就就后者进行详细的介绍
  1. flip->open 等函数:
    在模块中,用户空间的open,read,write,llseek等函数都是不可以使用的。应该使用其在内核中对应的函数。可以使用filp->open配合struct file里的read/write来进行对文件的读写操作。

直接上干货(内容自己悟!):

例1 :
filp->f_op->read
filp_open
filp->f_op->write

#include <linux/kernel.h> 
#include <linux/module.h> 
#include <linux/fs.h> 
#include <asm/uaccess.h> 
#include <linux/mm.h> 

MODULE_AUTHOR("Kenthy@163.com."); 
MODULE_DESCRIPTION("Kernel study and test."); 


void fileread(const char * filename) 
{ 
  struct file *filp; 
  struct inode *inode; 
  mm_segment_t fs; 
  off_t fsize; 
  char *buf; 
  unsigned long magic; 
  printk("<1>start....\n"); 
  filp=filp_open(filename,O_RDONLY,0); 
  inode=filp->f_dentry->d_inode;  
  
  magic=inode->i_sb->s_magic; 
  printk("<1>file system magic:%li \n",magic); 
  printk("<1>supe
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值