内核层读写应用层文件,使用filp_open函数。

2023-05-16

转载:http://soft.chinabyte.com/os/421/11398421.shtml

有时候需要在Linux kernel--大多是在需要调试的驱动程序--中读写文件数据。在kernel中操作文件没有标准库可用,需要利用kernel的一些函数,这些函数主要有: filp_open() filp_close(), vfs_read() vfs_write(),set_fs(),get_fs()等,这些函数在linux/fs.h和asm/uaccess.h头文件中声明。下面介绍主要步骤

  1. 打开文件

  filp_open()在kernel中可以打开文件,其原形如下:

  strcut file* filp_open(const char* filename, int open_mode, int mode);

  该函数返回strcut file*结构指针,供后继函数操作使用,该返回值用IS_ERR()来检验其有效性。

  参数说明

  filename: 表明要打开或创建文件的名称(包括路径部分)。在内核中打开的文件时需要注意打开的时机,很容易出现需要打开文件的驱动很早就加载并打开文件,但需要打开的文件所在设备还不有挂载到文件系统中,而导致打开失败。

  open_mode: 文件的打开方式,其取值与标准库中的open相应参数类似,可以取O_CREAT,O_RDWR,O_RDONLY等。

  mode: 创建文件时使用,设置创建文件的读写权限,其它情况可以匆略设为0

  2. 读写文件

  kernel中文件的读写操作可以使用vfs_read()和vfs_write,在使用这两个函数前需要说明一下get_fs()和 set_fs()这两个函数。

  vfs_read() vfs_write()两函数的原形如下:

  ssize_t vfs_read(struct file* filp, char __user* buffer, size_t len, loff_t* pos);

  ssize_t vfs_write(struct file* filp, const char __user* buffer, size_t len, loff_t* pos);

  注意这两个函数的第二个参数buffer,前面都有__user修饰符,这就要求这两个buffer指针都应该指向用空的内存,如果对该参数传递kernel空间的指针,这两个函数都会返回失败-EFAULT。但在Kernel中,我们一般不容易生成用户空间的指针,或者不方便独立使用用户空间内存。要使这两个读写函数使用kernel空间的buffer指针也能正确工作,需要使用set_fs()函数或宏(set_fs()可能是宏定义),如果为函数,其原形如下:

  void set_fs(mm_segment_t fs);

  该函数的作用是改变kernel对内存地址检查的处理方式,其实该函数的参数fs只有两个取值:USER_DS,KERNEL_DS,分别代表用户空间和内核空间,默认情况下,kernel取值为USER_DS,即对用户空间地址检查并做变换。那么要在这种对内存地址做检查变换的函数中使用内核空间地址,就需要使用set_fs(KERNEL_DS)进行设置。get_fs()一般也可能是宏定义,它的作用是取得当前的设置,这两个函数的一般用法为:

  mm_segment_t old_fs;

  old_fs = get_fs();

  set_fs(KERNEL_DS);

  ...... //与内存有关的操作

  set_fs(old_fs);

  还有一些其它的内核函数也有用__user修饰的参数,在kernel中需要用kernel空间的内存代替时,都可以使用类似办法。

  使用vfs_read()和vfs_write()最后需要注意的一点是最后的参数loff_t * pos,pos所指向的值要初始化,表明从文件的什么地方开始读写。

  3. 关闭读写文件

  int filp_close(struct file*filp, fl_owner_t id);

  该函数的使用很简单,第二个参数一般传递NULL值,也有用current->files作为实参的。

  使用以上函数的其它注意点:

  1. 其实Linux Kernel组成员不赞成在kernel中独立的读写文件(这样做可能会影响到策略和安全问题),对内核需要的文件内容,最好由应用层配合完成。

  2. 在可加载的kernel module中使用这种方式读写文件可能使模块加载失败,原因是内核可能没有EXPORT你所需要的所有这些函数。

  3. 分析以上某些函数的参数可以看出,这些函数的正确运行需要依赖于进程环境,因此,有些函数不能在中断的handle或Kernel中不属于任可进程的代码中执行,否则可能出现崩溃,要避免这种情况发生,可以在kernel中创建内核线程,将这些函数放在线程环境下执行(创建内核线程的方式请参数kernel_thread()函数)。


上面原文出自【比特网】,转载请保留原文链接:http://soft.chinabyte.com/os/421/11398421.shtml

 

例如:

#include <linux/module.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
static char buf[] ="5555";
static char buf1[10];
 
int __init hello_init(void)
{
    struct file *fp;
    mm_segment_t fs;
    loff_t pos;
    printk("hello enter/n");
    fp =filp_open("/system/kernel_file",O_RDWR | O_CREAT,0644);
    if (IS_ERR(fp)){
        printk("create file error/n");
        return -1;
    }
    fs =get_fs();
    set_fs(KERNEL_DS);
    pos =0;
    vfs_write(fp,buf, sizeof(buf), &pos);
    pos =0;
    vfs_read(fp,buf1, sizeof(buf), &pos);
    printk("read: %s/n",buf1);
    filp_close(fp,NULL);
    set_fs(fs);
    return 0;
}
void __exit hello_exit(void)
{
    printk("hello exit/n");
}
 
module_init(hello_init);
module_exit(hello_exit);
 
MODULE_LICENSE("GPL");

 

------------------

link:

make -C `pwd`/../../ ARCH=arm CC=arm-linux-gnueabi-gcc  M=`pwd` LD=arm-linux-gnueabi-ld modules
--------------------

Makefile:

obj-m := fpserial.o
clean:
 rm ./fpserial.*o* ./?odule*

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

内核层读写应用层文件,使用filp_open函数。 的相关文章

  • ros远程桌面使用x11vnc启动rviz办法

    元学习论文总结 小样本学习论文总结 2017 2019年计算机视觉顶会文章收录 AAAI2017 2019 CVPR2017 2019 ECCV2018 ICCV2017 2019 ICLR2017 2019 NIPS2017 2019 1
  • LaTeX教程(一)Tex Live 2018的使用教程

    元学习论文总结 小样本学习论文总结 2017 2019年计算机视觉顶会文章收录 AAAI2017 2019 CVPR2017 2019 ECCV2018 ICCV2017 2019 ICLR2017 2019 NIPS2017 2019 l
  • encoder-decoder模型

    元学习论文总结 小样本学习论文总结 2017 2019年计算机视觉顶会文章收录 AAAI2017 2019 CVPR2017 2019 ECCV2018 ICCV2017 2019 ICLR2017 2019 NIPS2017 2019 先
  • 元学习(Meta-Learning) 综述及五篇顶会论文推荐

    元学习论文总结 小样本学习论文总结 2017 2019年计算机视觉顶会文章收录 AAAI2017 2019 CVPR2017 2019 ECCV2018 ICCV2017 2019 ICLR2017 2019 NIPS2017 2019 元
  • FewRel数据集

    元学习论文总结 小样本学习论文总结 2017 2019年计算机视觉顶会文章收录 AAAI2017 2019 CVPR2017 2019 ECCV2018 ICCV2017 2019 ICLR2017 2019 NIPS2017 2019 F
  • python的字符串截取||取字符串前三位

    元学习论文总结 小样本学习论文总结 2017 2019年计算机视觉顶会文章收录 AAAI2017 2019 CVPR2017 2019 ECCV2018 ICCV2017 2019 ICLR2017 2019 NIPS2017 2019 s
  • Android系统启动流程 -- bootloader、linux kernel、android

    转载 xff1a http blog csdn net arnoldlu article details 8264721 目录 xff1a 第一部分 xff1a Bootloader启动 一 Bootloader的定义和种类 二 Arm特定
  • 小样本学习数据集||Omniglot和miniImagenet||MAML算法测试

    元学习论文总结 小样本学习论文总结 2017 2019年计算机视觉顶会文章收录 AAAI2017 2019 CVPR2017 2019 ECCV2018 ICCV2017 2019 ICLR2017 2019 NIPS2017 2019 小
  • 怎么撰写研究内容

    元学习论文总结 小样本学习论文总结 2017 2019年计算机视觉顶会文章收录 AAAI2017 2019 CVPR2017 2019 ECCV2018 ICCV2017 2019 ICLR2017 2019 NIPS2017 2019 在
  • element 树形表格报Error: for nested data item, row-key is required

    element树形表格报以上这个错 xff0c 按网上的说法改 roke key 去掉element版本号前的 都不行 xff0c 最后发现在每条数据里加上一个id属性就可以了 xff0c 我数据本身没有id这个字段
  • Js 中的定时器

    定时器 前言一 定时器二 定时器具体内容三 定时器实例总结 前言 通过定时器自动的做一些事情 xff0c 例如发送网络请求 一 定时器 定时器 xff1a 定时器可以设定时间自动的做某件事情 定时器是一种方法 xff0c 不是对象 xff0
  • 【面经】常见机考类型汇总

    一 筑基篇 xff08 掌握数组 xff0c 字符串操作等基本操作 xff09 1 数组 目标 xff1a 掌握数组的正序遍历 xff0c 逆序遍历 xff0c 数组的排序等 典型例题 xff1a 提取不重复的整数 牛客题霸 牛客网 2 字
  • ONOS架构中的YANG、P4 Runtime

    本文总结自毛健炜的 ONOS架构中的YANG P4 Runtime 的演讲 ONOS xff0c 全称是开放网络操作系统 xff0c 通常以控制器的身份为人所知 它是由ON LAB组织发起的一个开源项目 xff0c 在与ONF组织合并之后
  • PID控制算法的原理剖析

    我的微信公众号 xff08 ID xff1a 00后开发者 xff09 从00后的角度出发 xff0c 专注但不局限于分享电气 嵌入式 机器视觉以及芯片行业的算法 技术文章和最新资讯 如果想查看更多内容 xff0c 可以关注我的微信公众号
  • flask 报错 sqlalchemy.exc.ArgumentError: Mapper mapped class BaseModel->base_model could not assemble

    报错信息 sqlalchemy exc ArgumentError Mapper mapped class BaseModel gt base model could not assemble any primary key columns
  • rospy-编写简单的服务端和客户端

    最近一直在实习公司做课程 xff0c 记录一些笔记和自己写的代码 基础知识和代码解释参考wiki 创客制造和其他博客 xff0c 侵删 背景知识 服务 service ROS中的通信方式有四种 主题 topic 服务 service 参数服
  • 树莓派 3B+ 蓝牙无法使用问题

    最近想用树莓派3B 43 做个小玩意 xff0c 结果发现蓝牙功能不可用 xff0c 图标消失且不能发现设备 xff0c 几乎试了网上所有方法都不行 最后参考了这个帖子恢复了蓝牙功能 xff1a SOLVED Bluetooth icon
  • 电源管理芯片之 Regulator用法。

    有问题请加 xff1a Q群 xff1a 241359063 共同走向创业学习之旅 原创 xff1a kylin zeng http blog chinaunix net uid 23795897 html 转载请注明原创出处 xff0c
  • 如何查看ssh登录日志信息

    less var log secure grep 39 Accepted 39 正常登录日志信息 正常退出 密码错误登录 三次密码登陆失败 输入密码时 xff0c 主动退出 为了安全期间 xff1a 我们只允许xxx xxx xxx xxx
  • C语言笔记-25-网络-TCP网络编程

    C语言笔记 25 网络 TCP网络编程 文章目录 C语言笔记 25 网络 TCP网络编程前言一 TCP编程模型概括二 inet工具htonlinet pton 三 TCP编程模型代码TCP服务端TCP客户端 总结 前言 自学笔记 xff0c

随机推荐

  • Failed to load nodelet [/camera/realsense2_camera] of type [realsense2_camera/RealSenseNodeFactory]

    输入 xff1a roslaunch realsense2 camera rs rgbd launch 报错 xff1a 报错原因 xff1a 是找不到realsense2 camera包 xff0c 在安装D435的包时 xff0c 以为
  • 十七、基于软核和CAN搭建FPGA在线升级系统设计

    1 系统搭建 系统主要包含 xff1a MicroBlaze软核处理器 xff0c Axi Can控制器 xff0c Axi lite user用户通信接口 xff0c MIG DDR3控制器 xff0c 中断控制器等 设计使用Can接收上
  • 【OpenCV】cv::Mat位深和通道,CV_8UC1等

    位深 每个像素由多少位来存储 是一个精度问题 xff0c 一般图片是8bit xff08 位 xff09 的 xff0c 则深度是8 通道 每个像素点能存放多少个数 类似于RGB彩色图中的每个像素点有三个值 xff0c 即三通道 一个图像的
  • darknet_ros编译报错以及在RVIZ中显示乱码

    最近在arm平台上部署 darknet ros 出现了一些错误 xff0c 这里记录一下 首先在ARM平台上部署和在AMD平台上部署是不同的 xff0c 首先应该考虑算力问题 xff0c 在ARM下 xff0c 加载yolov3 weigh
  • 萌新改代码系列(一)--VINS+GPS

    VINS与GPS组合 距离上次写博客过去了快一年了 xff0c 这一年来我一直忙于与SLAM方向几乎没有关系的科研工作 xff0c 说来惭愧 xff0c 最终也没研究出个啥 最近得空 xff0c 就把我之前开源的代码整理了一下 xff0c
  • GVINS论文阅读(VINS-MONO + gnss 紧耦合)

    原文 x1f517 https arxiv org pdf 2103 07899 pdf github x1f517 https github com HKUST Aerial Robotics GVINS 港科大 沈老师团队 在vins
  • 萌新学VINS-Fusion(一)------特征跟踪

    VINS FUSION代码心得 新人小白 xff0c 第一次写博客 xff0c 主要相当于自己做一个关于学习VINS的笔记 xff0c 不喜勿喷 xff0c 转载请注明出处 其实我之前也尝试着在VINS MONO基础上改写双目的 xff0c
  • 萌新学VINS-Fusion(二)------初始化

    最近在忙别的事情 xff0c 博客迟迟没更新 xff0c 现在终于放假了 xff0c 今天把初始化部分来分析一下 源码 xff1a https github com HKUST Aerial Robotics VINS Fusion pro
  • c 语言中 %d,%lu等区别

    转载至 xff1a http blog sina com cn s blog 7d94c35c01019f96 html d 有符号10进制整数 ld 长整型 hd短整型 hu 无符号短整形 u无符号整形 lu无符号长整形 i 有符号10进
  • 萌新学VINS-Fusion(三)------双目和GPS融合

    虽然要过年了 xff0c 而且每天还要在家里小店打工 xff0c 但是网红之路不能停对吧 xff0c 这篇博客写关于VINS Fusion和GPS的融合 其实我之前改出过一个加了GPS的VIO xff0c 并且也开源了 xff0c 之前没有
  • nuxt cookie-universal-nuxt 搭配 vuex-persistedstate 做数据持久化

    前言 因为服务端不存在 Local Storage 和 Session Storage 所以 便使用了 cookie universal nuxt 这个插件 在做Nuxt项目的时候 发现Vuex 在刷新页面后 储存的数据丢失 用 vuex
  • ROS学习(一):Navigation中GNSS与IMU数据融合定位

    1 参考博客 主要参考以下博客 感谢各位博主的分享 link https blog csdn net qinqinxiansheng article details 107108475 utm medium 61 distribute pc
  • msOS学习之路(1)

    msOS学习之路 xff08 1 xff09 1 msOS的初步认识 刚刚拿到msOS开发板的时候 xff0c 看了一下开发板 xff0c 感觉非常高端 xff0c 再看一下芯片 xff0c 用的是stm32 当时我就觉得我得先学习stm3
  • msOS学习之路(2)

    基于msOS自动回火机的实现 1 简介 1 1 背景 基于msOS自动回火机的实现的实例是学习msOS比较好的入门实例 xff0c 它包括msOS界面的设计 数据库的使用 系统节拍的使用 按键的使用 系统节拍使用等 xff0c 通过这个例子
  • msOS学习之路(4)

    设备层简单理解 1 设备层相关定义 设备层的相关定义是在device h文件中定义的 xff0c 包括按键 模拟量输入 数字量输入 输出枚举或者类型定义等 xff0c 对于一些结构体的理解 xff0c 例如 xff1a ADC结构体 xff
  • 【STM32】STM32CubeIDE HAL库Ring-buffer例程

    板子G474RE STM32HAL库Ring buffer使用 注意 xff1a HAL库中 xff0c 中断每执行一次 xff0c 就关闭 xff0c 所以需要重新开启中断 第一次开启在main函数中 HAL UART Receive I
  • 【ROS】多机协同ROS安装使用

    目录 通信框架ROS 安装ROS 测试ROS 控制协同 协同感知 通信框架ROS ROS是一种分布式软件框架 xff0c 节点之间通过松耦合的方式进行组合 xff0c 在很多应用场景下 xff0c 节点可以运行在不同的计算平台上 xff0c
  • 【无人机】PX4,ROS,Ubuntu20仿真运行

    参考 xff1a https docs px4 io master en ros mavros installation html https docs px4 io master en dev setup dev env linux ub
  • 【无人机】PX4,源码简要分析

    看看源码目的很单纯 xff0c 就是想有没有控制方面的代码可以移植到其它地方 无人机 PX4 xff0c ubuntu18仿真运行 从官网可能下载代码不全 xff0c 这是编译完成的源码 xff0c 有点大 xff01 xff01 xff0
  • 内核层读写应用层文件,使用filp_open函数。

    转载 xff1a http soft chinabyte com os 421 11398421 shtml 有时候需要在Linux kernel 大多是在需要调试的驱动程序 中读写文件数据 在kernel中操作文件没有标准库可用 xff0