编译出错,出现 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万+

ZYNQ裸机双网口通信实战:手把手教你用SDK和LWIP配置PS+PL以太网(附完整源码)

本文详细介绍了在ZYNQ裸机环境下实现双网口通信的全流程,包括硬件配置、LWIP协议栈优化及TCP通信实现。通过Vivado SDK和LWIP协议栈,开发者可以高效配置PS端内置网口与PL端扩展网口,提升嵌入式网络应用的灵活性和性能。附完整源码,助力快速开发。

weixin_30831529的博客 419

Linux内核文件读取流程

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

嵌入式Linux内核的博客 2798

TEM图像处理实战指南:从基础操作到金属材料分析

本文提供了一份全面的透射电镜(TEM)图像处理实战指南,涵盖从基础操作到金属材料深度分析的全流程。重点讲解了TEM图像预处理、选区电子衍射(SAED)标定、高分辨像(HRTEM)分析及STEM图像应用等核心技能,并结合金属材料(如铝合金、钢)的析出相鉴定、位错分析和界面结构研究等实际案例,帮助研究者从原始数据中准确提取晶体结构、缺陷及成分信息。

weixin_29284201的博客 206

开题报告该怎么写

考研即将来临,而一般很多大学都会选择在考研结束之后开始安排选题和开题报考(考研之前一般都不谈,老师也很人性化的,不愿意耽误你的复习) 但无论怎么推迟,我们最终都需要去面对并完成这些任务。 现在我就要教大家该如何写一个完整的开题报告! 准备模板。不同的学校有不同的格式,一般情况你的导师会给你们一个学校的标准格式,这个不用太费心。有了模板我们就可以按照模板的“线索”一步一步填充完成即可! 一般大致格式可谓: 研究背景/论文的目的、背景和意义 我们需要写明选择该题目的...

wuyueweifeng的博客 1094

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

Nginx反向代理MinIO私有桶签名失效?一招解决Host头校验问题

本文详细解析了Nginx反向代理MinIO私有桶时出现的签名失效问题,重点解决了Host头校验导致的"SignatureDoesNotMatch"错误。通过精准配置proxy_set_header保持Host头一致性,并提供了二级目录代理和调试指南,帮助开发者高效解决这一常见技术难题。

weixin_29201313的博客 320

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

【Ablation Studies 理解】深度学习模型组件的对比实验/性能分析

Ablation Study 用于检测深度学习/机器学习模型中各部分构件对于整体的重要性。 可以理解为为:组件\tricks重要性测试、组件性能系统性分析、控制变量法、组件去除对比实验、性能敏感性测试、性能因子分析等 Ablation Studies 一些新颖的深度学习模型在论文中都会进行AblationStudy,这部分的主要意义在于系统性的移除模型中的各种组件/trick等因子或者是创新的...

TomRen 4586

【推荐算法】召回模型总结

【推荐算法】召回模型总结

m0_48086806的博客 6237

内核态的文件操作函数: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

LTE信令流程实战:从Attach到Service Request的完整解析(附常见问题排查)

本文深入解析LTE信令流程中的Attach和Service Request关键环节,提供从基础原理到实战排查的完整指南。涵盖鉴权、承载建立等核心步骤,分析常见故障模式及优化方案,并附赠信令跟踪工具使用技巧,助力通信工程师提升网络运维效率。

alpha的博客 316

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

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

ListQ的博客 1229

【ARFoundation自学04】AR Tracked Image 图像追踪识别与对应类的调用

1.添加组件 2.创建图像识别库 3.创建识别后追踪的物体(UI、模型等)

leoysq的博客 2560

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

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

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

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

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

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

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

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、付费专栏及课程。

余额充值