禁用特定文件上的缓存/缓冲区(Linux)

恩恩

我目前在Yocto Linux构建中工作,并且正在尝试与FPGA上的硬件模块接口。该模块模仿的是带有FAT16文件系统的SD卡;包含一个文件(cam.raw)。该文件表示FPGA与linux系统之间的共享内存空间。因此,我希望能够将linux系统中的数据写入此内存,并取回FPGA可能进行的任何更改(当前,FPGA只是从内存空间中提取了一部分数据,并将6加到一个LSB​​的LSB中。像我写0x40302010一样的32位字,如果我读回数据,应该返回0x40302016)。但是,由于在某些地方进行了缓存,虽然我可以将数据写入FPGA,但无法立即取回结果。

我目前正在做这样的事情(使用python是因为它很容易):

% mount /dev/mmcblk1 /memstick
% python
>> import mmap
>> import os
>> f = os.open("/memstick/cam.raw", os.O_RDWR | os.O_DIRECT)
>> m = mmap.mmap(f, 0)
>> for i in xrange(1024):
...  m[i] = chr(i % 256)
...
>> m.flush() # Make sure data goes from linux to FPGA
>> hex(ord(m[0])) # Should be 0x6
'0x0'

我可以用dd确认数据已更改(尽管我也经常遇到这种问题),并使用FPGA工具(SignalTap / ChipScope)确实得到了正确答案(即第一个32位字)在这种情况下为0x03020106)。但是,有人,无论是python还是linux或两者都在缓冲文件,而不是再次从“ SD卡”(FPGA)中读取并将文件数据存储在内存中。我需要完全关闭它,以便所有读取都导致从FPGA读取数据。但我不确定在哪里进行缓冲或如何进行缓冲。

任何见识将不胜感激!(请注意,我可以使用mmap.flush()将我从python写入的任何数据转储到FPGA,但是我需要像反向刷新一样,或者需要某种东西使其将文件数据重新读入mmap!)

更新:

正如评论中所建议的那样,mmap方法可能不是实现我所需的最佳方法。但是,我现在在python和C中都尝试过,但是使用了O_DIRECT标志使用基本的I / O函数(在python中是os.read/write,在C中是read / write)。对于大多数这些操作,我最终都得到errno 22。

恩恩

进行挖掘后,我发现O_DIRECT标志做错了什么。在我的C和Python版本中,我没有使用memalign来创建缓冲区,并且没有进行块读/写。这篇文章有一个很好的解释:

如何在Linux上的C ++中使用read()和O_DIRECT读取文件?

因此,为了实现我正在做的事情,此C程序用作一个基本示例:

#include <stdio.h>
#include <fcntl.h>
#include <errno.h>

#define BLKSIZE 512

int main() {
  int fd;
  int x;
  char* buf;

  fd = open("/home/root/sd/fpga/cam.raw", O_RDWR | O_SYNC | O_DIRECT);
  if (!fd) {
    printf("Oh noes, no file!\n");
    return -1;
  }

  printf("%d %d\n", fd, errno);

  buf = (char*) memalign(BLKSIZE, BLKSIZE*2);

  if (!buf) {
    printf("Oh noes, no buf!\n");
    return -1;
  }

  x = read(fd, buf, BLKSIZE);
  printf("%d %d %x %x %x %x\n", x, errno, buf[0], buf[1], buf[2], buf[3]);

  lseek(fd, 0, 0);

  buf[0] = '1';
  buf[1] = '2';
  buf[2] = '3';
  buf[3] = '4';
  x = write(fd, buf, BLKSIZE);

  printf("%d %d\n", fd, errno);

  lseek(fd, 0, 0);

  x = read(fd, buf, BLKSIZE);
  printf("%d %d %x %x %x %x\n", x,errno, buf[0], buf[1], buf[2], buf[3]);

  return 0;
}

这将达到我的目的,我没有想到如何进行适当的内存对齐以类似方式使用Python的os.read/os.write函数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Linux中禁用USB大容量存储设备的读取缓存/缓冲区

来自分类Dev

Linux上的不可见内存泄漏-Ubuntu Server(不是磁盘缓存/缓冲区!)

来自分类Dev

限制Linux中缓冲区缓存的大小

来自分类Dev

Ubuntu文件系统缓冲区/缓存始终为空

来自分类Dev

如何禁用PHP的文件读/写缓冲区?

来自分类Dev

如何禁用PHP的文件读/写缓冲区?

来自分类Dev

在Linux上从char缓冲区写入二进制文件

来自分类Dev

在Linux上运行ssh时如何复制剪贴板缓冲区中的文件?

来自分类Dev

Linux和页面对齐缓冲区上的read()

来自分类Dev

64位Linux上的缓冲区溢出

来自分类Dev

如何在Linux上获取相机缓冲区?

来自分类Dev

如何减少缓冲区\缓存

来自分类Dev

-/ +缓冲区/缓存和交换

来自分类Dev

UNIX上的环形缓冲区日志文件

来自分类Dev

如何删除Emacs缓冲区上的文件修改跟踪?

来自分类Dev

Tmux,禁用缓冲区清除功能

来自分类Dev

禁用分区上的Linux读写文件缓存

来自分类Dev

有没有办法显示Linux缓冲区高速缓存未命中?

来自分类Dev

如何在Linux系统上清空缓冲区和缓存?

来自分类Dev

这台Linux机器几乎吞噬了所有内存和交换空间?(与缓冲区/缓存无关)

来自分类Dev

如何使非root用户清空Linux缓冲区高速缓存

来自分类Dev

Linux内存:/ proc / meminfo与免费之间的缓冲区+高速缓存差异?

来自分类Dev

“关闭设备上的Windows写缓存缓冲区刷新”的全部功能和效果是什么?

来自分类Dev

Emacs:对所有Lisp缓冲区禁用特定的次要模式

来自分类Dev

仅在特定缓冲区中禁用vim中的语法突出显示

来自分类Dev

当系统内存大于8GB时,为什么Linux禁用磁盘写缓冲区?

来自分类Dev

打开某些文件类型时如何禁用NERDTree缓冲区

来自分类Dev

渲染BufferedGraphics缓冲区的特定区域

来自分类Dev

Linux画像素缓冲区

Related 相关文章

  1. 1

    在Linux中禁用USB大容量存储设备的读取缓存/缓冲区

  2. 2

    Linux上的不可见内存泄漏-Ubuntu Server(不是磁盘缓存/缓冲区!)

  3. 3

    限制Linux中缓冲区缓存的大小

  4. 4

    Ubuntu文件系统缓冲区/缓存始终为空

  5. 5

    如何禁用PHP的文件读/写缓冲区?

  6. 6

    如何禁用PHP的文件读/写缓冲区?

  7. 7

    在Linux上从char缓冲区写入二进制文件

  8. 8

    在Linux上运行ssh时如何复制剪贴板缓冲区中的文件?

  9. 9

    Linux和页面对齐缓冲区上的read()

  10. 10

    64位Linux上的缓冲区溢出

  11. 11

    如何在Linux上获取相机缓冲区?

  12. 12

    如何减少缓冲区\缓存

  13. 13

    -/ +缓冲区/缓存和交换

  14. 14

    UNIX上的环形缓冲区日志文件

  15. 15

    如何删除Emacs缓冲区上的文件修改跟踪?

  16. 16

    Tmux,禁用缓冲区清除功能

  17. 17

    禁用分区上的Linux读写文件缓存

  18. 18

    有没有办法显示Linux缓冲区高速缓存未命中?

  19. 19

    如何在Linux系统上清空缓冲区和缓存?

  20. 20

    这台Linux机器几乎吞噬了所有内存和交换空间?(与缓冲区/缓存无关)

  21. 21

    如何使非root用户清空Linux缓冲区高速缓存

  22. 22

    Linux内存:/ proc / meminfo与免费之间的缓冲区+高速缓存差异?

  23. 23

    “关闭设备上的Windows写缓存缓冲区刷新”的全部功能和效果是什么?

  24. 24

    Emacs:对所有Lisp缓冲区禁用特定的次要模式

  25. 25

    仅在特定缓冲区中禁用vim中的语法突出显示

  26. 26

    当系统内存大于8GB时,为什么Linux禁用磁盘写缓冲区?

  27. 27

    打开某些文件类型时如何禁用NERDTree缓冲区

  28. 28

    渲染BufferedGraphics缓冲区的特定区域

  29. 29

    Linux画像素缓冲区

热门标签

归档