linux使用hugetlbfs的方式来支持巨页,也成为大页。

网上看到有人说巨页不支持read,和write调用,只支持mmap,但是看3.10内核代码的时候发现:

const struct file_operations hugetlbfs_file_operations = {
.read = hugetlbfs_read,--------------------------------初始化了。
.mmap = hugetlbfs_file_mmap,
.fsync = noop_fsync,
.get_unmapped_area = hugetlb_get_unmapped_area,
.llseek = default_llseek,
};

查看vfs_read代码,要确定下是否hugetlbfs_read就是file->f_op->read

ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
{
ssize_t ret;

if (!(file->f_mode & FMODE_READ))
return -EBADF;
if (!file->f_op || (!file->f_op->read && !file->f_op->aio_read))
return -EINVAL;
if (unlikely(!access_ok(VERIFY_WRITE, buf, count)))
return -EFAULT;

ret = rw_verify_area(READ, file, pos, count);
if (ret >= 0) {
count = ret;
if (file->f_op->read)
ret = file->f_op->read(file, buf, count, pos);

使用如下测试代码分别测试:

#include <fcntl.h>
#include <sys/mman.h>
#include <errno.h>
#include <unistd.h>
#include <stdio.h>

#define MAP_LENGTH (10*1024*1024)
#define TEST_PATH ("/mnt/huge_caq/test")
#define TEST_READ 1
#define TEST_WRITE 0
#define TEST_MMAP 1

int main()
{
int fd;
void * addr;
ssize_t ret=0;

/* create a file in hugetlb fs */
fd = open(TEST_PATH, O_CREAT | O_RDWR);
if(fd < 0){
perror("Err: ");
return -1;
}
#if 0
#if TEST_WRITE
ret = write(fd,"hello\r\n",7);
perror("Err: ");
#endif
#endif
#if TEST_READ
char buf[10];
ret = read(fd,buf,7);
printf("read ret=%d\r\n",ret);
#endif
#if TEST_MMAP
/* map the file into address space of current application process */
addr = mmap(0, MAP_LENGTH, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if(addr == MAP_FAILED){
perror("Err: ");
close(fd);
unlink(TEST_PATH);
return -1;
}

/* from now on, you can store application data on huage pages via addr */
memcpy(addr,"hello\r\n",7);
#if TEST_WRITE
ret = write(fd,"hello\r\n",7);
perror("Err: ");
#endif

#if TEST_READ
memset(buf,0,10);
ret = read(fd,buf,7);
if(ret)
{
printf("read ret=%d,buf=%s\r\n",ret,buf);
}
#endif
munmap(addr, MAP_LENGTH);
#if TEST_READ
memset(buf,0,10);
ret = read(fd,buf,7);
printf("read ret=%d\r\n",ret);
#endif
#endif
close(fd);
unlink(TEST_PATH);
return 0;
}

然后gdb跟踪如下,发现是可以读的,读出来数据也是正常的。

54 memset(buf,0,10);
(gdb)
55 ret = read(fd,buf,7);
(gdb)
56 if(ret)
(gdb) p ret
$1 = 7
(gdb) p buf
$2 = "hello\r\n\000\000"

使用如下脚本确定file->f_op->read的对应函数

probe kernel.function("vfs_read").return
{
#print_backtrace();
if(($count==7)&&($file->f_op)&&($file->f_op->read))
{
printf("begin pid=%d,execname=%s,f_op=%s,read=%s,aio=%x\r\n",pid(),execname(),symname($file->f_op),symname($file->f_op->read),$file->f_op->aio_read);
}
}

begin pid=30371,execname=main.o,f_op=hugetlbfs_file_operations,read=hugetlbfs_read,aio=0,没错,就是hugetlbfs_read。

从测试结果看,是支持read的。至于从哪个内核版本支持的,没有继续研究,有兴趣的同学可以跟一下git的记录。

linux 巨页使用测试以及勘误1的更多相关文章

  1. linux 巨页使用测试

    这里记录测试巨页的mmap使用,测试代码和<linux 巨页使用测试以及勘误1>类似. 跟踪脚本如下: probe kernel.function("hugetlb_reserv ...

  2. 【Debian百科】巨页

    巨页 为什么使用巨页? 当一个进程使用一些内存的时候,CPU就把那部分内存标记成已被该进程使用的.为了提高效率,CPU会按4K字节块(它在很多平台上是默认值)分配内存.这些块被称作页.这些页可以被交换 ...

  3. Thermostat:双层存储结构的透明巨页内存管理机制

    这是一篇由密歇根大学的Neha Agarwal 和 Thomas F. Wenisch,发表在计算机系统顶会ASLOS的论文,Thermostat: Application-transparent P ...

  4. [转贴]LTP--linux稳定性测试 linux性能测试 ltp压力测试 ---IBM 的 linux test project

    https://blog.csdn.net/melody157398/article/details/24354415   LTP--linux稳定性测试 linux性能测试 ltp压力测试 ---I ...

  5. 对Linux系统内核版本稳定性测试介绍

    对Linux系统内核版本稳定性测试介绍 在对 Linux 内核版本稳定性的测试中,需要明确地声明并证明为什么版本是稳定的或者是不稳定的. 然而还没有被证明和证实当前现有的系统范围内的压力测试可以测试 ...

  6. LTP--linux稳定性测试 linux性能测试 ltp压力测试 ---IBM 的 linux test project

    LTP--linux稳定性测试 linux性能测试 ltp压力测试 ---IBM 的 linux test project Peter盼 2014-04-23 11:25:49  20302  收藏  ...

  7. LTP--linux稳定性测试 linux性能测试 ltp压力测试 内核更新 稳定性测试

    LTP--linux稳定性测试 linux性能测试 ltp压力测试 zhangzj1030关注14人评论33721人阅读2011-12-09 12:07:45   说明:在写这篇文章之前,本人也不曾了 ...

  8. LTP--linux稳定性测试 linux性能测试 ltp压力测试 ltp-pan

    LTP--linux稳定性测试 linux性能测试 ltp压力测试 zhangzj1030关注14人评论33710人阅读2011-12-09 12:07:45   说明:在写这篇文章之前,本人也不曾了 ...

  9. 【NO.13】Jmeter - 在Linux整理和计算测试结果

    我们现在描述的是:在Linux系统使用Jmeter执行性能测试. 所以当执行完测试以后,就要计算一下测试结果,反馈给开发人员嘛. 在Linux系统使用Jmeter执行性能测试都包含哪些步骤,来,回顾一 ...

随机推荐

  1. Java工程读取resources中资源文件路径问题

    正常在Java工程中读取某路径下的文件时,可以采用绝对路径和相对路径,绝对路径没什么好说的,相对路径,即相对于当前类的路径.在本地工程和服务器中读取文件的方式有所不同,以下图配置文件为例. 本地读取资 ...

  2. MicroPython可视化编程开发板—TurnipBit自制MP3教程实例

    转载请以链接形式注明文章来源(MicroPythonQQ技术交流群:157816561,公众号:MicroPython玩家汇) 当前我们都生活在一个有声有色的社会当中,欣赏美丽的景色,享受动人的音乐, ...

  3. php 事务处理transaction

    MySQL 事务主要用于处理操作量大,复杂度高的数据.比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成 ...

  4. jquery tips简易使用方法 新手必看

    使用jquery1.12.4以上版本 使用jquery插件 tips .beg-pull-right 点击时的选择器 在这里写的是一个类选择器   记得引入jquery $(".beg-pu ...

  5. 深入学习Java8 Lambda (default method, lambda, function reference, java.util.function 包)

    Java 8 Lambda .MethodReference.function包 多年前,学校讲述C#时,就已经知道有Lambda,也惊喜于它的方便,将函数式编程方式和面向对象式编程基于一身.此外在使 ...

  6. C语言中处理结构体的原理

    汇编中有几种寻址方式,分别是直接寻址:(ds:[idata]).寄存器间接寻址(ds:[bx]).寄存器相对寻址(ds:[bx + idata].ds:[bx + si])基址变址寻址(ds:[bx ...

  7. 日期插件-flatpickr

    github的仓库地址:https://github.com/chmln/flatpickr 手册地址:http://www.htmleaf.com/Demo/201608213895.html    ...

  8. 使用socket实现的ftp文件传输服务器

    服务端: # encoding:utf-8 # Author:"richie" # Date:8/23/2017 from socket import * import pickl ...

  9. 移动web开发之touch事件

    前面的话 iOS版Safari为了向开发人员传达一些特殊信息,新增了一些专有事件.因为iOS设备既没有鼠标也没有键盘,所以在为移动Safari开发交互性网页时,常规的鼠标和键盘事件根本不够用.随着An ...

  10. WCF(一):初识WCF

    目录: 一.什么是WCF 二.WCF能做什么 三.WCF的模型 四.WCF的基本概念 五.WCF的快速创建 1.WCF是什么 A.WindowsCommunication Foundation(WCF ...