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. mysql如何执行关联查询与优化

    mysql如何执行关联查询与优化 一.前言 在数据库中执行查询(select)在我们工作中是非常常见的,工作中离不开CRUD,在执行查询(select)时,多表关联也非常常见,我们用的也比较多,那么m ...

  2. Java学习笔记9---类静态成员变量的存储位置及JVM的内存划分

    笔记8提到了类静态成员变量的访问方式,但静态成员变量存储在哪里呢?在网上查阅不少资料,发现好多内容都是过时的了,其中主流观点是静态成员变量存放在方法区.JDK8之前,静态成员变量确实存放在方法区:但J ...

  3. Java学习笔记14(面向对象七:final、static)

    final:意为最终,不可变,是一个修饰词 有时候一个类地功能被开发好了,不想让子类重写,修改,这里就会用到final关键字 final修饰类: 不可以被继承,但是可以继承其他类 示例: public ...

  4. Updates were rejected because the remote contains work that you do(git报错解决方案)

    Updates were rejected because the remote contains work that you do(git报错解决方案) 今天向GitHub远程仓库提交本地项目文件时 ...

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

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

  6. js和native交互方法浅析

    一.背景 最近接触公司项目,需要和原生app做交互,由此业务需求,开始了学习探索之路. 二.解决方案之WebViewJavascriptBridge 想要和app交互,必须在app上先把bridge进 ...

  7. javascript初识

    1.什么是js 基于对象和事件驱动并且具有相对安全性的客户端脚本语言,由网景公司开发.     2.js数据类型   1.基本数据类型 undefined,null,number,boolean,st ...

  8. HDU 1312 Red and Black(DFS,板子题,详解,零基础教你代码实现DFS)

    Red and Black Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  9. 51Nod 1277 字符串中的最大值(KMP,裸题)

    1277 字符串中的最大值 题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 一个字符串的前缀是指包含该字符第一个字母的连续子串,例如: ...

  10. [Codeforces 696D] Legen...

    题目大意: 给出一些匹配串,要造一个长度不超过L的字符串,每个匹配串有自己的价值,匹配串每次出现在字符串里都会贡献一次价值...要求可能得到的最大价值. 匹配串总长不超200,L<=10^14, ...