perl - Perl 中的 OS 页面对齐分配
问题描述
驱动程序通过 ioctl 接口公开其 API。
ioctl 调用的参数是一个内存缓冲区,其地址必须与操作系统页面大小对齐。
例如,C 中的分配将调用 valloc(或 posix_memalign)
像这样简单的 Perl 缓冲区分配:
$buffer = "\0" x BUFFER_SIZE ;
还不够,因为标量的起始地址很可能不会与操作系统页面大小对齐。
有没有一种简单的方法可以实现这一目标?
注意:我将缓冲区转换为 C 地址,如下所示:
my $c_address = unpack('Q', pack('P', $buffer));
谢谢!埃亚尔
解决方案
有多种解决方案,但是按照书本,您可以使用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
将自动取消映射,或者您可以使用.undef
IO::AIO::munmap $buffer
您也可以通过调整一些更大的内存分配以其他方式自己执行此操作,但您至少需要查询页面大小,因此如果没有模块的帮助和/或浪费内存,纯 perl 解决方案无法便携完成。
推荐阅读
- python - python奇怪行为中的模板/通用用户定义类
- apache-flink - 如何使用 Kinesis + Flink 处理 AWS cloudwatch / VPC 流日志?
- relative-path - 程序写入 /tmp 时的 Snakemake 影子规则
- android - 如何将本地文件加载到webview
- antlr4 - ANTLR4 中括号周围至少有一个空格
- android - 如何从另一个模块访问测试类以在 junit 测试中使用?
- javascript - Angular:如何在将函数分配给子组件的输出时隐式推断类型
- c# - 如何使用中间跳转服务器在 C# 中建立与远程 SQL Server 的连接字符串?
- python - 如何在对象检测任务中将水平边界框转换为定向边界框
- javascript - CSS:在图标右侧对齐文本