首页 > 解决方案 > Perl 中的 OS 页面对齐分配

问题描述

驱动程序通过 ioctl 接口公开其 API。

ioctl 调用的参数是一个内存缓冲区,其地址必须与操作系统页面大小对齐。

例如,C 中的分配将调用 valloc(或 posix_memalign)

像这样简单的 Perl 缓冲区分配:

 $buffer = "\0" x  BUFFER_SIZE ;

还不够,因为标量的起始地址很可能不会与操作系统页面大小对齐。

有没有一种简单的方法可以实现这一目标?

注意:我将缓冲区转换为 C 地址,如下所示:

 my $c_address = unpack('Q', pack('P', $buffer));

谢谢!埃亚尔

标签: perlmmapioctl

解决方案


有多种解决方案,但是按照书本,您可以使用IO::AIO具有IO::AIO::mmap功能的模块。基本上,你会做这样的事情(未经测试):

    use IO::AIO

    IO::AIO::mmap
          my $buffer, BUFFER_SIZE, IO::AIO::PROT_READ | IO::AIO::PROT_WRITE,
          IO::AIO::MAP_PRIVATE | IO::AIO::MAP_ANONYMOUS, undef
       or die "mmap failure: $!";

当您或超出范围时,$buffer将自动取消映射,或者您可以使用.undefIO::AIO::munmap $buffer

您也可以通过调整一些更大的内存分配以其他方式自己执行此操作,但您至少需要查询页面大小,因此如果没有模块的帮助和/或浪费内存,纯 perl 解决方案无法便携完成。


推荐阅读