• 内核态文件操作

在用户态,我们操作文件可以用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

下图是在内核中找到的一个场景:

第三个参数表明文件要读写的起始位置。

几点说明:(从网上查找的资料)

  1. Linux Kernel组成员不赞成在kernel中独立的读写文件(这样做可能会影响到策略和安全问题),对内核需要操作的文件内容,最好由应用层配合完成。
  2. 这些函数的正确运行需要依赖于进程环境,因此,有些函数不能在中断的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相关推荐

  1. linux下的系统调用函数到内核函数的追踪

    Original from: http://blog.chinaunix.net/uid-28458801-id-3468966.html 使用的 glibc : glibc-2.17 使用的 lin ...

  2. linux内核函数出错的返回值

    linux内核函数出错的返回值 1. 函数返回指针 2. 如何通过错误信息指针来返回错误信息 3. 出错代码返回指针在(-1000,0)区间 4. 错误的判断和错误原因的打印 4.1 错误的判断 4. ...

  3. Windows内核函数的命名

    <Windows内核情景分析--采用开源代码ReactOS(上.下册)>本书通过分析ReactOS的源代码介绍了Windows内核各个方面的结构.功能.算法与具体实现.本小节为大家介绍Wi ...

  4. Windows 驱动发展基金会(九)内核函数

    Windows 驱动发展基金会系列,转载请注明出处:http://blog.csdn.net/ikerpeng/article/details/38849861 这里主要介绍3类Windows的内核函 ...

  5. (49)逆向分析KiSystemService/KiFastCallEntry调用内核函数部分(SST,SSDT,SSPT)

    一.回顾 前两篇博客,我逆向分析了 KiSystemService 和 KiFastCallEntry 填充_KTRAP_FRAME 结构体的代码,二者大同小异,主要的区别是 sysenter 只改了 ...

  6. 内核函数 系统调用 系统命令 库函数

    内核函数 运行在内核态的,一般来说特权级较高. 系统调用 系统调用是程序进入内核函数的接口层,大量的内核函数被封装再系统调用中.再进入不同的系统调用之后,系统调用中的内核函数被称为该系统调用的服务例程 ...

  7. docker编译Linux内核,c – 如何编译在docker中使用内核函数的C代...

    我有一个Makefile,一些使用PCI设备的C代码 all: g++ -o executable main.cpp dragon.pb.cc -std=c++11 -O3 -I/usr/includ ...

  8. php thread linux,Linux_linux内核函数kernel_thread,设备驱动程序中,如果需要几 - phpStudy...

    linux内核函数kernel_thread 设备驱动程序中,如果需要几个并发执行的人物,可以启动内核线程,启动内和县城的函数为: int kernel_thread (int ( * fn )( v ...

  9. Windows内核函数

    字符串处理 在驱动中一般使用的是ANSI字符串和宽字节字符串,在驱动中我们仍然可以使用C中提供的字符串操作函数,但是在DDK中不提倡这样做,由于C函数容易导致缓冲区溢出漏洞,针对字符串的操作它提供了一 ...

  10. linux应用调用内核函数,Hooking linux内核函数(一):寻找完美解决方案

    前言 我们最近参与了一个Linux系统安全相关项目,需要hooking几个重要的Linux内核函数调用,例如打开文件和启动进程,并利用它来启用系统活动监控并抢先阻止可疑进程. 最后,我们发明了一种有效 ...

最新文章

  1. -16 | 12 等于多少
  2. 概述自动机器学习(AutoML)
  3. 学习 Git 玩转 GitHub
  4. golang 使用 http socks5 代理
  5. centos7 nat模式配置静态ip_Linux不进入网卡配置文件更改静态ip
  6. 昨天终于收到《.Net Web服务编程》
  7. 使用logminer分析日志文件
  8. JBoss 4.2.x Spring 3 JPA Hibernate教程第2部分
  9. python3连接oracle数据库真操蛋_为64位Windows7的Python3安装MySQLdb
  10. MyEclipse中Hibernate+C3P0连接池配置
  11. 两台设备有三条链路,请问如何添加?
  12. matlab 求区域中心坐标,Matlab求助,在一个坐标系中画四个球体,求相交区域的中心点坐标...
  13. 如何查看自己在CSDN积分
  14. 基于腾讯人口迁徙数据的全国城市网络结构特征分析
  15. XP系统清理优化工具箱
  16. DINO 自监督算法简介
  17. 【gazebo要素4】传感器插件(Velodyne)
  18. 可视监控对讲、楼宇对讲等领域中的回声消除、音频降噪
  19. Primo Ramdisk配置教程
  20. oracle强制停止执行,Oracle强制终止在执行的sql

热门文章

  1. Entry name *.xml collided终极解决方案
  2. 静态网页设计课后练习
  3. PCF8591 A/D转换模块
  4. html火焰字效果,如何用PS制作火焰字特效
  5. java如何接收键盘输入_java接收键盘输入(三种方法)
  6. Flutter 淡入淡出与逐渐出现动画
  7. HTML 图片热点map area使用方法
  8. PHP 毕生功力 图片,视听发烧网_汇集毕生功力的代表作:静神Monitor Acoustics KenStyle Silver Signature...
  9. Layim 聊天功能
  10. Android 代码设置默认输入法