使用libpmemblk能直接访问storage(DAX),支持 load/store access,不需要 paging blocks。
libpmemblk API说明:http://pmem.io/pmdk/manpages/linux/master/libpmemblk/libpmemblk.7.html
Key:
pmemblk_create() // 创建pmem的内存块
pmemblk_open() // 打开已创建的内存块
pmemblk_nblock() // 获得某内存块内分片元素数量
pmemblk_write() // 将数据写入某分片元素
pmemblk_read() // 从某分片元素中读出数据
pmemblk_set_zero() // 将某分片元素设置成0
pmemblk_close() // 关闭内存块
pmemblk_set_funcs() // 允许用户覆盖libpmemblk内的malloc、free等函数,实现自定义malloc、free等
例子:
#include <stdio.h>
#include <fcntl.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <libpmemblk.h>
#define POOL_SIZE ((size_t)(1024 * 1024 * 1024)) /* size of the pmemblk pool -- 1 GB */
#define ELEMENT_SIZE 1024 /* size of each element in the pmem pool */
int main(int argc, char *argv[])
{
const char path[] = "/root/hostnme/pmemblk.002";
char buf[ELEMENT_SIZE];
char rcv[ELEMENT_SIZE];
/* create the pmemblk pool or open it if it already exists */
PMEMblkpool *pbp = pmemblk_create(path, ELEMENT_SIZE, POOL_SIZE, 0666);
if (pbp == NULL)
pbp = pmemblk_open(path, ELEMENT_SIZE);
if (pbp == NULL) {
perror(path);
exit(1);
}
/* how many elements fit into the file? */
size_t nelements = pmemblk_nblock(pbp);
printf("file holds %zu elements\n", nelements);
/* store a block at index 5 */
strcpy(buf, "hello, world");
printf("buf: %s\n", buf);
if (pmemblk_write(pbp, buf, 0) < 0 ||
pmemblk_write(pbp, buf, 5) < 0 ||
pmemblk_write(pbp, buf, 6) < 0) {
perror("pmemblk_write");
exit(1);
}
/* read the block at index 5 */
if (pmemblk_read(pbp, rcv, 5) < 0) {
perror("pmemblk_read");
exit(1);
}