编译出错,出现 vfs_read[******.ko] undefined !

vfs读写流程梳理 vfs read,系统调用流程: 在/fs/read_write.c中实现。 SYSCALL_DEFINE3(read, unsigned int, fd, char __user *, buf, size_t, count) {     struct file *file;     ssize_t ret = -EBADF;     int fput_needed;     f 阅读详情

出现类似问题的原因是所使用的函数在内核中没有被导出符号。在linux-4.0以后的版本中,vfs_read()的符号没有被导出,也就是早期版本中的EXPORT_SYMBOL(vfs_read)这句话没有了。
解决办法:
(1)使用fp->f_op->read()函数,但是使用这个,虽然可以编译通过,但是在加载时,fp->f_op->read的返回值是NULL,原因未找到;
(2)使用修改内核(不建议,会污染内核):在vfs_read()函数后添加EXPORT_SYMBOL(vfs_read);导出符号表
(3)(推荐)使用int kernel_read(struct file *file, loff_t offset, char *addr, unsigned long count)函数:
file:文件; offset:读位址; addr:地址指针; count:读的字节数,返回值是成功返回字节数,失败返回负值;
理由:vfs_read()的定义为ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos),其中,参数__user 表示buf是用户态指针,在内核中是无法使用,因此需要设置使用环境,如下(也就是说,你想直接使用vfs_read这个一句话是不行的,它要用一个代码块才能满足从文件里面读取一些字节的需求,而这个代码块主要是解决__user *buf的使用的问题。),代码块一般如下所示:

        mm_segment_t old_fs;
        old_fs = get_fs();
        set_fs(get_ds());
        vfs_read(file, (void __user *)addr, count, &pos);
        set_fs(old_fs);

相比于vfs_read(),kernel_read()就是通上述操作进行封装(也就是说,kernel_read()把上面代码块组合成了一个新函数,可以给用户直接使用,不需要用户再把上面代码块抄一遍了),因此使用kernel_read更便捷。此外,在linux-4.0以后的版本中取消了对vfs_read()的符号导出,因此无法在编译成模块时使用,而kernel_read()有符号导出,可以在编译成模块时使用。

在linux内核源码linux-4.19.90/fs目录下搜索vfs_read的出处(grep -rn "vfs_read" ./*),得到在

ok@u20:~/data/linux-4.19.90/fs$ grep -rn "vfs_read" ./*
./9p/vfs_addr.c:91: * v9fs_vfs_readpage - read an entire page in from 9P
./9p/vfs_addr.c:98:static int v9fs_vfs_readpage(struct file *filp, struct page *page)
./9p/vfs_addr.c:104: * v9fs_vfs_readpages - read a set of pages from 9P
./9p/vfs_addr.c:113:static int v9fs_vfs_readpages(struct file *filp, struct address_space *mapping,
./9p/vfs_addr.c:341:	.readpage = v9fs_vfs_readpage,
./9p/vfs_addr.c:342:	.readpages = v9fs_vfs_readpages,
./9p/cache.c:242:static void v9fs_vfs_readpage_complete(struct page *page, void *data,
./9p/cache.c:269:					 v9fs_vfs_readpage_complete,
./9p/cache.c:307:					  v9fs_vfs_readpage_complete,
匹配到二进制文件 ./9p/vfs_addr.o
./dax.c:1254:		 * validated via access_ok() in either vfs_read() or
./exec.c:999:	ssize_t res = vfs_read(file, (void __user *)addr, len, &pos);
匹配到二进制文件 ./exec.o
./namei.c:4705: * vfs_readlink - copy symlink body into userspace buffer
./namei.c:4714:int vfs_readlink(struct dentry *dentry, char __user *buffer, int buflen)
./namei.c:4743:EXPORT_SYMBOL(vfs_readlink);
匹配到二进制文件 ./namei.o
./nfsd/nfs4xdr.c:3640:	 * XXX: By default, vfs_readlink() will truncate symlinks if they
./nfsd/nfs4xdr.c:3642:	 * easy fix is: if vfs_readlink() precisely fills the buffer, assume
./read_write.c:412:ssize_t __vfs_read(struct file *file, char __user *buf, size_t count,
./read_write.c:431:	result = vfs_read(file, (void __user *)buf, count, pos);
./read_write.c:437:ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
./read_write.c:452:		ret = __vfs_read(file, buf, count, pos);
./read_write.c:579:		ret = vfs_read(f.file, buf, count, &pos);
./read_write.c:627:			ret = vfs_read(f.file, buf, count, &pos);
./read_write.c:977:ssize_t vfs_readv(struct file *file, const struct iovec __user *vec,
./read_write.c:1020:		ret = vfs_readv(f.file, vec, vlen, &pos, flags);
./read_write.c:1071:			ret = vfs_readv(f.file, vec, vlen, &pos, flags);
匹配到二进制文件 ./read_write.o
./splice.c:362:	res = vfs_readv(file, (const struct iovec __user *)vec, vlen, &pos, 0);
匹配到二进制文件 ./splice.o
./stat.c:406:				error = vfs_readlink(path.dentry, buf, bufsiz);
匹配到二进制文件 ./stat.o
./xfs/xfs_ioctl.c:292:	error = vfs_readlink(dentry, hreq->ohandle, olen);

得到其定义在read_write.c文件中定义: 


可以发现,vfs_read确实没有导出,而kernel_read导出符号了。
原文链接:https://blog.youkuaiyun.com/MM_man/article/details/100603683

Linux Kernel VFS-Read(2) I choose the cover pic just because it's silly and got read in it. In this part, we'll talk about how read in vfs is connected to that in file systems. 阅读详情

相关推荐

VFS中的read/write系统调用

VFS中的read/write系统调用 ​ VFS所隐含的主要思想在于引入了一个通用的文件模型(common file model),这个模型能够表示所有支持的文件系统。VFS是所有文件系统的抽象。 ​ linux内核对每个文件读写操作都必须使用一个指针,指向要访问的具体文件系统的适当函数。换句话说,当应用程序对read()或是write()调用引起内核调用相应的sys_read()或...

jasonLee的博客 1729

linux文件系统四 VFS数据读取vfs_read

一、vfs_read的调用流程: 二、VFS层调用流程 1、系统调用sys_read会调用到vfs层的__vfs_read接口如下,在vfs层接口会调用大具体的文件系统的 操作接口: //kernel-4.9/fs/read_write.c ssize_t __vfs_read(struct file *file, char __user *buf, size_t count, ...

frank_zyp的博客 1万+

sql server安装并SSMS连接

  SQL Server是一种广泛应用于网络业务数据处理的关系型数据库管理系统。SQL Server 2016是微软公司研发的新一代旗舰级数据库和分析平台,突出高级分析和丰富可视化,并融合了关键创新功能。其可提供对企业基础架构最高级别的支持,专门针对关键业务应用的多种功能与解决方案提供最高级别的可用性,并提供更多、更全面的功能以满足不同人群对数据的需求,包括支持来自不同网络环境的数据交互、全面的自助分析等创新功能。百度搜索sql server,在官网下载 地址是:SQL Server 下载| Microso

jiankang66的博客 5184

Linux内核文件读取流程

本文代码基于Linux5.10。当上层调用read函数读取一个文件时, Linux 内核究竟如何处理?本文主要介绍这个问题。

嵌入式Linux内核的博客 2798

从BIN文件到可烧录程序:深入理解ADI DSP程序读取背后的原理与安全边界

本文深入探讨了ADI DSP程序从BIN文件到可烧录程序的转换原理与安全边界,详细解析了JTAG接口、仿真器工作流程及Flash存储结构。通过Visual DSP++工具,开发者可以理解程序读取的底层机制,同时强调了知识产权保护的重要性,为嵌入式开发提供了实用建议。

weixin_27956639的博客 261

如何在Ubuntu 22.04上为AlphaFold3配置NVIDIA A100 GPU(含驱动安装避坑指南)

本文提供了在Ubuntu 22.04系统上为AlphaFold3部署NVIDIA A100 GPU的完整安装教程。内容涵盖从系统环境准备、NVIDIA驱动安装与避坑指南,到Docker容器化部署、数据库获取以及最终构建运行AlphaFold3的详细步骤,旨在帮助研究者和开发者高效配置高性能计算环境,充分发挥A100的硬件潜力。

nft7creator的博客 468

Linux5.4版本内核编译内核模块时出错,出现 vfs_read[******.ko] undefined !或者 vfs_write[******.ko] undefined !

()的定义为ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos),其中,参数__user 表示buf是用户态指针,在内核中是无法使用,因此需要设置使用环境,如下(也就是说,你想直接使用vfs_read这个一句话是不行的,它要用一个代码块才能满足从文件里面读取一些字节的需求,而这个代码块主要是解决__user *buf的使用的问题。count:读的字节数,返回值是成功返回字节数,失败返回负值;

zhanzheng520的专栏 835

单片机通信总述——理论部分(CAN、串口、SPI、I2C等)

并行通信:传输原理:数据各个位同时传输;优点:速度快; 缺点:占用引脚资源多。是指使用 8、16、32 及 64 根或更多的数据线(有多少信号为就需要多少信号位)进行传输的通讯方式,可以同一时刻传输多个数据位的数据。串行通信: 传输原理:数据按位顺序传输;优点:占用引脚资源少; 缺点:速度相对较慢。是指设备之间通过一根数据信号线,地线以及控制信号线,按数据位形式一位一位地传输数据的通讯方式,同一时刻只能传输一位(bit)数据。 单工: 数据传输只支持数据在一个方向上传输。信息只能单方向传输的工作方式,一

qq_42475191的博客 1万+

kernel中文件的读写操作可以使用vfs_read()和vfs_write

需要在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..

idward307的专栏 5669

Unity UI适配实战:从Canvas Scaler到主流游戏适配方案解析

本文深入解析Unity UI适配的核心技术,重点介绍Canvas Scaler组件的关键参数如Reference Resolution和Screen Match Mode,并提供主流游戏适配方案实战分析。通过九宫格拉伸、动态调整等技巧,帮助开发者解决多设备适配难题,提升游戏UI在不同分辨率下的表现。

weixin_29001419的博客 970

PyTorch强化学习实战(3)——Gymnasium API扩展功能

我们已经学习了编写智能体必需的 Gymnasium 核心功能,其余 API 功能部分虽然非必需,但能显著提升开发效率和代码整洁度。在本节中,我们简要地介绍了 Gymnasium API 的扩展功能,学习了如何以模块化的方式扩展现有环境的功能,并熟悉了使用包装器可视化智能体活动的方法。

盼小辉丶的博客 1190

内核态的文件操作函数:filp_open、filp_close、vfs_read、vfs_write、set_fs、get_fs

关于用户态的文件操作函数我们知道有open、read、write这些。但是这些的实现都是依赖于库的实现,但是在内核态是没有库函数可用的。最近做测试,在内核态中,需要学习一下在内核态里面的文件操作函数。分为三对出现。感谢前辈的优秀文章,参考链接在文末这些的函数就在linux/fs.h和asm/uaccess.h中存在。 filp_close 2、第二对:vfs_read、vfs_write–文件读写操作 3、第三队:set_fs、get_fs 在buffer前面都有一个__user修饰符,这要求bu

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 7886

rk3588主板PDM接口接数字MIC录音

本文介绍了Rockchip 3588平台上6麦克风PDM接口的硬件连接与软件调试过程。硬件方面展示了PDM0_CLK0_M0时钟脚和三组数据脚的连接方案。软件配置包括设备树修改,生成声卡节点,并提供了6通道录音命令示例。文章重点分析了两个常见问题:录音无声(需检查供电、接线和波形)和通道数据缺失(需正确配置rockchip,path-map寄存器映射)。最后通过Audition工具验证录音文件,确认各通道工作正常。调试过程完整展现了从硬件连接到软件配置的完整流程。

m0_60805802的博客 1011

Linux文件系统4(基于6.1内核)

Linux文件系统4(基于6.1内核)---VFS数据读取vfs_read和写入vfs_write

ListQ的博客 1229

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

kernel_write/kernel_read 和 vfs_write/vfs_read 的区别

Linux内核读写文件有两个常用的函数,分别是vfs_write/vfs_read、kernel_write/kernel_read,两个也都内核导出函数(EXPORT_SYMBOL)。两者有什么区别呢?分别在什么场景下使用?两者都在 kernel/fs/read_write.c 中实现,我们直接打开源码(基于kernel5.4)分析下。

4963

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Linux VFS文件系统之读写(read/write)文件

------------------------------------------------ #纯属个人理解,如有问题敬请谅解! #kernel version: 2.6.26 #Author: andy wang ------------------------------------------------- 一: 概述   在上文中讨论了VFS层是如何打开一个文件的,本文

zhuangshu_feng'‘每天进步一点点 1万+

linux内核文件读写 set_fs get_fs

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

weixin_34372728的博客 1018

vfs_read、VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver报错

vfs_read、VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver报错

qq_41448779的博客 4648

Linux VFS文件系统分析6

Linux VFS文件系统分析6(基于Linux6.6)---VFS与read接口介绍

ListQ的博客 984

read

正文read函数功能描述:从文件读取数据。 函数原型ssize_t read(int fd, void *buf, size_t count); 参数fd:将要读取数据的文件描述词。 buf:指缓冲区,即读取的数据会被放到这个缓冲区中去。 count:表示调用一次read操作,应该读多少数量的字符。 返回值(1)返回所读取的字节数; (2)0(读到EOF); (3)-1(出错); 以下几种情况会导致

包子入侵优快云 790

解析Linux中的VFS文件系统

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010424605/article/details/41842877 Vfs文件系统详解 前言: 本文基于linux kernel 3.14.17来讨论VFS机制,以及内核对VFS的支持,试图从源代码的角度来理解,所以在阅读本文之前需要读者对linuxVFS的基本的数据结构有所了解,(super_b...

hbcbgcx的博客 691

编译驱动:WARNING: 某函数名 [某驱动名.ko] undefined!

问题:WARNING: “cfg80211_put_bss” [/…/wlan_driver/xx.ko] undefined! 原因:编译时指定的内核没有将相应的选项配置打开,导致编译驱动时没找到对应的函数原型。 解决:查找该函数原型(如cfg80211_put_bss)所在文件及路径之后,在该内核执行make menuconfig将相应的功能配置打开重新编译即可消除警告 ...

weixin_44498318的博客 2391
上一篇: 从 2.4 到 2.6:Linux 内核可装载模块机制的改变对设备驱动的影响
下一篇: 深度解析linux内核模块编译makefile
土豆西瓜大芝麻
博客等级 码龄18年 1189粉丝 238原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值