几个内核函数:filp_open、filp_read、IS_ERR、ERR_PTR、PTR_ERR
- 内核态文件操作
在用户态,我们操作文件可以用C库函数:open()、read()、write()等,但是在内核态没有库函数可用,这时就需要用内核的一些函数:filp_open、filp_close、vfs_read、vfs_write、
set_fs、get_fs等函数,在linux/fs.h和asm/uaccess.h中声明。
参数说明:
第一个参数表明要打开或创建文件的名称(包括路径部分)。
第二个参数文件的打开方式,其取值与标准库中的open相应参数类似,可以取O_CREAT,O_RDWR,O_RDONLY等。
第三个参数创建文件时使用,设置创建文件的读写权限,其它情况可以设为0
该函数返回strcut file*结构指针,供后继函数操作使用,该返回值用IS_ERR()来检验其有效性。
参数说明:
第一个参数是filp_open返回的file结构体指针
第二个参数基本上都是NULL
参数说明:
第一个参数是filp_open返回的file结构体指针
第二个参数是buf,注意,这个参数有用__user修饰,表明buf指向用户空间的地址,如果传入内核空间的地址,就会报错,并返回-EFAULT,但在kernel中,要使这两个读写函数使用kernel空间的buf指针也能正确工作,需要使用set_fs()。该函数的作用是改变kernel对内存地址检查的处理方式,其实该函数的参数fs只有两个取值:USER_DS,KERNEL_DS,分别代表用户空间和内核空间,默认情况下,kernel取值为USER_DS,即对用户空间地址检查并做变换。那么要在这种对内存地址做检查变换的函数中使用内核空间地址,就需要使用set_fs(KERNEL_DS)进行设置,它的作用是取得当前的设置,这两个函数的一般用法为:
filp_open()
mm_segment_t old_fs;
old_fs = get_fs();
set_fs(KERNEL_DS);
...... //与内存有关的操作
set_fs(old_fs);
filp_close
下图是在内核中找到的一个场景:
第三个参数表明文件要读写的起始位置。
几点说明:(从网上查找的资料)
- Linux Kernel组成员不赞成在kernel中独立的读写文件(这样做可能会影响到策略和安全问题),对内核需要操作的文件内容,最好由应用层配合完成。
- 这些函数的正确运行需要依赖于进程环境,因此,有些函数不能在中断的handle或Kernel中不属于任何进程的代码中执行,否则可能出现崩溃,要避免这种情况发生,可以在kernel中创建内核线程,将这些函数放在线程环境下执行。
二.IS_ERR()、ERR_PTR()、PTR_ERR()小解
内核中的函数常常返回指针,问题是如果出错,也希望能够通过返回的指针体现出来。 总体来说,如果内核返回一个指针,那么有三种情况:合法指针,NULL指针和非法指针。在linux中有很多错误,内核错误可以参考include/asm-generic/errno-base.h。MAX_ERRNO定义了最大的错误号4095,刚好是4k-1,所以内核地址保留了0xfffffffffffff000~0xffffffffffffffff(64位系统)用来记录错误号,也就是说这段地址和Linux的错误号是一一对应的,可以用上面的内敛函数相互转化。比如说我们上面的filp_open函数返回值,用IS_ERR函数去检查,如果地址落在0xfffffffffffff000~0xffffffffffffffff范围,表示filp_open函数失败,IS_ERR为1,同时filp_open返回的错误地址对应一个linux的错误号,如果想知道是哪个错误号,就用PTR_ERR函数来转化。错误的返回地址和错误号是可以根据截图中的ERR_PTR、PTR_ERR相互转化的。
几个内核函数:filp_open、filp_read、IS_ERR、ERR_PTR、PTR_ERR相关推荐
- linux下的系统调用函数到内核函数的追踪
Original from: http://blog.chinaunix.net/uid-28458801-id-3468966.html 使用的 glibc : glibc-2.17 使用的 lin ...
- linux内核函数出错的返回值
linux内核函数出错的返回值 1. 函数返回指针 2. 如何通过错误信息指针来返回错误信息 3. 出错代码返回指针在(-1000,0)区间 4. 错误的判断和错误原因的打印 4.1 错误的判断 4. ...
- Windows内核函数的命名
<Windows内核情景分析--采用开源代码ReactOS(上.下册)>本书通过分析ReactOS的源代码介绍了Windows内核各个方面的结构.功能.算法与具体实现.本小节为大家介绍Wi ...
- Windows 驱动发展基金会(九)内核函数
Windows 驱动发展基金会系列,转载请注明出处:http://blog.csdn.net/ikerpeng/article/details/38849861 这里主要介绍3类Windows的内核函 ...
- (49)逆向分析KiSystemService/KiFastCallEntry调用内核函数部分(SST,SSDT,SSPT)
一.回顾 前两篇博客,我逆向分析了 KiSystemService 和 KiFastCallEntry 填充_KTRAP_FRAME 结构体的代码,二者大同小异,主要的区别是 sysenter 只改了 ...
- 内核函数 系统调用 系统命令 库函数
内核函数 运行在内核态的,一般来说特权级较高. 系统调用 系统调用是程序进入内核函数的接口层,大量的内核函数被封装再系统调用中.再进入不同的系统调用之后,系统调用中的内核函数被称为该系统调用的服务例程 ...
- docker编译Linux内核,c – 如何编译在docker中使用内核函数的C代...
我有一个Makefile,一些使用PCI设备的C代码 all: g++ -o executable main.cpp dragon.pb.cc -std=c++11 -O3 -I/usr/includ ...
- php thread linux,Linux_linux内核函数kernel_thread,设备驱动程序中,如果需要几 - phpStudy...
linux内核函数kernel_thread 设备驱动程序中,如果需要几个并发执行的人物,可以启动内核线程,启动内和县城的函数为: int kernel_thread (int ( * fn )( v ...
- Windows内核函数
字符串处理 在驱动中一般使用的是ANSI字符串和宽字节字符串,在驱动中我们仍然可以使用C中提供的字符串操作函数,但是在DDK中不提倡这样做,由于C函数容易导致缓冲区溢出漏洞,针对字符串的操作它提供了一 ...
- linux应用调用内核函数,Hooking linux内核函数(一):寻找完美解决方案
前言 我们最近参与了一个Linux系统安全相关项目,需要hooking几个重要的Linux内核函数调用,例如打开文件和启动进程,并利用它来启用系统活动监控并抢先阻止可疑进程. 最后,我们发明了一种有效 ...
最新文章
- -16 | 12 等于多少
- 概述自动机器学习(AutoML)
- 学习 Git 玩转 GitHub
- golang 使用 http socks5 代理
- centos7 nat模式配置静态ip_Linux不进入网卡配置文件更改静态ip
- 昨天终于收到《.Net Web服务编程》
- 使用logminer分析日志文件
- JBoss 4.2.x Spring 3 JPA Hibernate教程第2部分
- python3连接oracle数据库真操蛋_为64位Windows7的Python3安装MySQLdb
- MyEclipse中Hibernate+C3P0连接池配置
- 两台设备有三条链路,请问如何添加?
- matlab 求区域中心坐标,Matlab求助,在一个坐标系中画四个球体,求相交区域的中心点坐标...
- 如何查看自己在CSDN积分
- 基于腾讯人口迁徙数据的全国城市网络结构特征分析
- XP系统清理优化工具箱
- DINO 自监督算法简介
- 【gazebo要素4】传感器插件(Velodyne)
- 可视监控对讲、楼宇对讲等领域中的回声消除、音频降噪
- Primo Ramdisk配置教程
- oracle强制停止执行,Oracle强制终止在执行的sql
热门文章
- Entry name *.xml collided终极解决方案
- 静态网页设计课后练习
- PCF8591 A/D转换模块
- html火焰字效果,如何用PS制作火焰字特效
- java如何接收键盘输入_java接收键盘输入(三种方法)
- Flutter 淡入淡出与逐渐出现动画
- HTML 图片热点map area使用方法
- PHP 毕生功力 图片,视听发烧网_汇集毕生功力的代表作:静神Monitor Acoustics KenStyle Silver Signature...
- Layim 聊天功能
- Android 代码设置默认输入法