O_DIRECT IO 与对齐堆栈缓冲区的问题

发布于 2024-11-13 06:02:07 字数 1112 浏览 2 评论 0原文

当缓冲区位于堆栈上时,以下代码会失败,但当缓冲区分配到堆上时,以下代码会成功。我在带有 Raid 驱动器的 RHEL 5.3 上对其进行了测试。是否可以将 O_DIRECT 与堆栈缓冲区一起使用?

#define _GNU_SOURCE
#include <stdio.h>
#include <assert.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <errno.h>
#include <sys/mman.h>
#include <malloc.h>


#define K 1024
#define ALIGNMENT (4*K)
#define RDSIZE (16*K)
#define BLOCKSIZE (512*K)

int main()
{
    int flags = O_RDONLY |  O_LARGEFILE;
    int n = 0;
    int fd = 0;
    char* buf = (char *) memalign(ALIGNMENT, BLOCKSIZE);
    //char buf[BLOCKSIZE] __attribute__((__aligned__(ALIGNMENT)));

    assert(((long)buf) % ALIGNMENT == 0);

    fd = open("test", flags | O_DIRECT);
    if (fd < 0) {
        perror("file open");
        return -1;
    }


    n = read(fd, buf, RDSIZE);

    if (n < 0) {
        perror("file read");
        return -1;
    }

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

    close(fd);

}

更新:使用 Intel CC 编译时相同的代码成功。

The following code fails when the buffer is on the stack, but succeeds when it's allocated on the heap. I tested it on RHEL 5.3 with a Raid drive. Is it possible to use O_DIRECT with stack buffers?

#define _GNU_SOURCE
#include <stdio.h>
#include <assert.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <errno.h>
#include <sys/mman.h>
#include <malloc.h>


#define K 1024
#define ALIGNMENT (4*K)
#define RDSIZE (16*K)
#define BLOCKSIZE (512*K)

int main()
{
    int flags = O_RDONLY |  O_LARGEFILE;
    int n = 0;
    int fd = 0;
    char* buf = (char *) memalign(ALIGNMENT, BLOCKSIZE);
    //char buf[BLOCKSIZE] __attribute__((__aligned__(ALIGNMENT)));

    assert(((long)buf) % ALIGNMENT == 0);

    fd = open("test", flags | O_DIRECT);
    if (fd < 0) {
        perror("file open");
        return -1;
    }


    n = read(fd, buf, RDSIZE);

    if (n < 0) {
        perror("file read");
        return -1;
    }

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

    close(fd);

}

UPDATE: Same code when compiled with Intel CC succeeds.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

情话难免假 2024-11-20 06:02:07

检查一下你的堆栈大小 512K 是不是很大了。

Check your stack size 512K is quite a lot.

笑叹一世浮沉 2024-11-20 06:02:07

如果问题是 gcc 未对齐 buf,请尝试使用此便携式版本:

char x_buf[BLOCKSIZE+PAGE_SIZE];
char *buf = buf + (PAGE_SIZE-1 & -(uintptr_t)x_buf);

If the problem is gcc misaligning buf, try this portable version instead:

char x_buf[BLOCKSIZE+PAGE_SIZE];
char *buf = buf + (PAGE_SIZE-1 & -(uintptr_t)x_buf);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文