把文件写入内存linux,如何在Linux中为内存映射文件提供扩展写入功能?

这与我曾经做过的家庭作业非常相似.基本上我有一个“页面”列表和一个“框架”列表,以及相关信息.使用SIGSEGV我会捕获故障并根据需要更改内存保护位.我将包含您可能觉得有用的部分.

创建映射.最初它没有权限.

int w_create_mapping(size_t size,void **addr)

{

*addr = mmap(NULL,size * w_get_page_size(),PROT_NONE,MAP_ANONYMOUS | MAP_PRIVATE,-1,0

);

if (*addr == MAP_Failed) {

perror("mmap");

return FALSE;

}

return TRUE;

}

安装信号处理程序

int w_set_exception_handler(w_exception_handler_t handler)

{

static struct sigaction sa;

sa.sa_sigaction = handler;

sigemptyset(&sa.sa_mask);

sigaddset(&sa.sa_mask,SIGSEGV);

sa.sa_flags = SA_SIGINFO;

if (sigaction(SIGSEGV,&sa,&prevIoUs_action) < 0)

return FALSE;

return TRUE;

}

异常处理程序

static void fault_handler(int signum,siginfo_t *info,void *context)

{

void *address; /* the address that faulted */

/* Memory location which caused fault */

address = info->si_addr;

if (FALSE == page_fault(address)) {

_exit(1);

}

}

增加保护

int w_protect_mapping(void *addr,size_t num_pages,w_prot_t protection)

{

int prot;

switch (protection) {

case PROTECTION_NONE:

prot = PROT_NONE;

break;

case PROTECTION_READ:

prot = PROT_READ;

break;

case PROTECTION_WRITE:

prot = PROT_READ | PROT_WRITE;

break;

}

if (mprotect(addr,num_pages * w_get_page_size(),prot) < 0)

return FALSE;

return TRUE;

}

由于团队可能会再次使用相同的作业,因此我无法公开全部使用.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值