ioctl的最大缓冲区大小是多少?

时间:2014-04-03 19:55:58

标签: rhel ioctl

我正在使用ioctl()从块设备读取数据(scsi。)

我注意到当我阅读1024个扇区时,ioctl完成没有问题。当我阅读2048后,经过一段时间后,它会返回ENOMEMerrno=12),这甚至没有列在可能的错误列表中(请参阅http://man7.org/linux/man-pages/man2/ioctl.2.html

我已经检查过我正在传递适当的缓冲区大小,所以情况并非如此 - 没有缓冲区溢出。

如何使用ioctl来学习要读取的最大缓冲区大小?

编辑1

其他一些信息可能会有所帮助:

Enterprise Linux Enterprise Linux Server release 5.3 (Carthage)
Red Hat Enterprise Linux Server release 5.3 (Tikanga)
2.6.18-128.el5

1 个答案:

答案 0 :(得分:0)

错误发生在Linux内存管理的默认行为上,即#34;过度使用"。这意味着内核声称成功分配了内存,但实际上并没有在您尝试访问内存之前分配内存。如果内核发现它分配了太多内存,它就会杀死一个进程,其中包括ENOMEM(Out Of Memory)杀手"释放一些记忆。它选择杀死进程的方式很复杂,但是如果你刚刚在系统中分配了大部分内存,那么它可能就是你的进程可以解决问题。

要更改此行为,请尝试以下操作:

echo "2" > /proc/sys/vm/overcommit_memory

在Linux 2.6及更高版本中,可以修改内核的行为,以便它不会过度使用"记忆。尽管此设置不会阻止OOM杀手完全被调用,但它会显着降低机会,从而导致更强大的系统行为。这是通过sysctl选择严格过度使用模式来完成的:

sysctl -w vm.overcommit_memory=2