我创建了一个原始设备:
raw /dev/raw/raw1 /dev/sda3
我无法使用java中的RandomAccessFile
访问它。
File ssd=new File("/dev/raw/raw1");
RandomAccessFile randomaccess=new RandomAccessFile(ssd, "rw");
System.out.println("randomaccess file created");
randomaccess.write((byte)1);
System.out.println("wrote to file");
randomaccess.close();
当我使用sudo运行它时,我有适当的权限,但它失败了:
randomacces file created
java.io.IOException: Invalid argument
at java.io.RandomAccessFile.write0(Native Method)
at java.io.RandomAccessFile.write(RandomAccessFile.java:489)
at Randomacces.main(Randomacces.java:23)
是因为RandomAccessFile
需要块设备,但原始设备的行为类似于char设备吗?
如果我使用:
File ssd=new File("/dev/sda3");
它运行没有问题,但我想禁用页面缓存。有没有办法使它工作或我需要编写自己的设备驱动程序?
答案 0 :(得分:1)
由于原始I / O涉及对进程内存的直接硬件访问,因此必须遵守一些额外的限制。所有I / O必须在内存和磁盘上正确对齐:它们必须从磁盘上的扇区偏移开始,它们必须是精确的扇区数,并且虚拟内存中的数据缓冲区也必须与多个扇区对齐。行业规模。对于大多数设备,扇区大小为512字节。
如果您不遵守这些限制,则低级write(2) system call将返回EINVAL(无效参数)。
考虑到它与操作系统之间的多层抽象,你将很难让Java发出正确大小和对齐的写调用。最后一个要求特别棘手:“虚拟内存中的数据缓冲区也必须与扇区大小的倍数对齐。”没有保证,但使用java.nio
类而不是java.io
可能会有更好的运气。