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这个数据库大概快要两年了,不过由于没有特别深入系统的去学习,大多也是停留在一知半解的状态.今天在工作中刚好碰到了表设计的问题,顺便写篇博客,把MySQL中数据类型和字段类型选择这方面给弄 ...

  2. Ubuntu 搭建简单的git server

    Git 可以使用四种主要的协议来传输资料:本地协议(Local),HTTP 协议,SSH(Secure Shell)协议及 Git 协议. 在此,我们将会讨论那些协议及哪些情形应该使用(或避免使用)他 ...

  3. 摸索出来的chrom调试前后台数据(Java&&Ajax)交互的方法分享一下咯!!!

    1:开始没想分享的,后来看到有大佬分享如何使用Chrom的工具进行调试,哈哈哈哼,我就借着他的博客写一下我摸索的如何进行前后台数据交互吧(注:反正是自己瞎 捣鼓出来的,也许适合我,and我脑补一下吧, ...

  4. windows编程学习笔记(三)ListBox的使用方法

    ListBox是Windows中的一种控件,一般被当做子窗口使用,Windows中所有子窗口都是通过发送一个通知码到父窗口父窗口通过WM_COMMAND消息接收,并在此消息中处理,并控制子窗口,Lis ...

  5. HTML知识点总结之img、scirpt、link标签

    <img>元素 使用<img>可以在网页插入一个图片,但实际上<img>标签并不会在网页中直接插入图像,而是从网页上链接图像. <img>的主要属性 ( ...

  6. 跟我一起读postgresql源码(十)——Executor(查询执行模块之——Scan节点(下))

    接前文跟我一起读postgresql源码(九)--Executor(查询执行模块之--Scan节点(上)) ,本篇把剩下的七个Scan节点结束掉. T_SubqueryScanState, T_Fun ...

  7. python的流程控制学习

    _username= 'haozheyu' _password= ' username = input("请输入用户:") password = input("请输入密码 ...

  8. ORA-28002 -- oracle密码过期

    1.登录oracle 2.查看密码有效期时长 SELECT * FROM dba_profiles s WHERE s.profile='DEFAULT' AND resource_name='PAS ...

  9. Maven适配多种运行环境的打包方案

    项目从开发到部署会历经多个运行环境,如开发环境.测试环境和生产环境,不同环境中项目的配置文件通常也会不同,典型的如数据库连接配置.我们当然不希望每次部署打包前都去修改配置文件以适配环境,利用Maven ...

  10. Linux批量处理文件脚本

    Linux shell字符串截取与拼接 一 Linux 的字符串截取很有用.有八种方法. 假设有变量 var=http://www.linuxidc.com/123.htm 1  # 号截取,删除左边 ...