巨页的实现,涉及到两个模块:hugetlb和hugetlbfs。
hugetlb相当于是huge page页面管理者,hugetlbfs则用于向用户提供一套基于文件系统的巨页使用界面,其下层功能的实现,则依赖于hugetlb。
使用巨页有两种方式,mmap方式和共享内存方式(shmget/shmat)。
但是,无论是通过哪种方式,最终都是通过对一个hugetlbfs类型的文件做内存映射而实现的(通过file->f_op->mmap完成)。
a. mmap方式
这种方式,需要先通过如下命令mount一个hugetlbfs文件系统,通过pagesize指定页面大小。
mount -t hugetlbfs none /mnt/path/to/hugetlbfs -o pagesize=2048K
这样的话,新挂载的文件系统,与页面大小为2048K的hstate相关联。。
接下来,在/mnt/path/to/hugetlbfs下面创建文件,然后打开文件并通过mmap进行内存映射即可。
b. 共享内存方式
这种方式,不需要上面提到的mount及创建文件操作。直接用shmget和shmat,即可使用巨页内存。
虽然用户没有mount及创建文件,但shmget内部还是创建了一个文件,并且是在上面提到的hugetlbfs_vfsmount挂载点下面。这样的话,就与mmap方式殊途同归了。hugetlbfs_vfsmount挂载点对应的是默认的hstate,因此所用巨页的页面大小也是默认的。
网友评论