找回密码
 注册
关于网站域名变更的通知
查看: 311|回复: 2
打印 上一主题 下一主题

linux下用户程序通过mmap映射驱动的内存,使用O_DIRCTE模式创建文件,write到文件...

[复制链接]
  • TA的每日心情

    2019-11-19 15:29
  • 签到天数: 1 天

    [LV.1]初来乍到

    跳转到指定楼层
    1#
    发表于 2020-8-3 13:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

    EDA365欢迎您登录!

    您需要 登录 才可以下载或查看,没有帐号?注册

    x
    linux下用户程序通过mmap映射驱动的内存,使用O_DIRCTE模式创建文件,write到文件时报Bad addreee5 B' }0 g9 r  `8 }
    下面为用户层函数代码:; J( y$ P& g( q4 ?3 h8 Z
    3 X3 a- W9 d4 T. L4 q, S4 |/ _
    C/C++ code
    ( O9 z0 C1 `  Q8 H# p% P?" v& ^1 u4 D$ W9 S3 j1 e
    1
    8 F5 l: ?2 [' r! q, n1 W4 p2 b
    2
    ' R5 ?  q3 d: \# H6 d: p3 b
    3

    % p5 a, M, n, N0 I
    4

    # j/ T8 \, W1 Z) p! ^" I2 ?
    5

    ) q* L" X# m* f
    6
    $ L6 Z% T7 Y8 i( f
    7

    6 b5 i- h/ E- b: X
    8

    9 P9 H+ n8 E7 H' ?0 S: M# i! |
    9
    ! }2 }+ N* }. G9 G
    10

    9 O* Q% M+ |/ ?
    11

    3 L( q# L/ }& \+ a# E
    12
    $ J/ }  _  L, @2 k3 L8 ], s3 a7 C$ n9 F- y
    13
    6 s" n/ H7 l, q! }1 t5 q
    14
    ! \& Y/ i% y8 u) n! `) U
    15
    / I- [# @. `$ `) m1 I6 S
    16
    . p( W8 O- d& a) B/ }* \+ _
    17
    4 f' r3 H2 ~$ x- ?0 ?
    18
    ( e4 e' V6 r( a* ]2 k' ^1 \" `
    19

    - ~7 S; u9 n' Q; }1 K! Q. \
    20

    * S0 @. Y8 V/ }* Z: G9 G/ F( p
    21
    & j( z- Q+ w+ P
    22

    # M  U+ K1 i  D% W: V# _, G
    23

    ) I% m9 f0 X3 z4 @/ ]4 A
    24

    & y: w" r3 l( Z
    25

    3 A* w$ c( k3 \( g; \' Y+ Q
    26

    6 k. {: h' n+ i+ Y1 }
    27

    & m( ]; {+ t4 h! e% m; F
    28

    5 A( G! b5 H4 D# S- D' c- k
    29

    % y% ~, w# ]0 i5 m
    30

      K) s1 g8 ]4 c8 I( ]
    31

    . `( W, u+ X' C- E3 t6 \# K: A
    32
    / V+ l3 r8 o6 c4 y) }
    33

    * C  y3 w; T+ F7 v
    34
    9 G7 R7 D# v5 e
    void simple_test(char *filename, int dma_fd), P" P/ a1 t- F1 N& ~/ }
    {
    ' Z, v9 ?: U8 Z. ?    int file_fd; e7 t1 }  H. A; A- u- v
        void *user_mem = NULL;
    * I) }- ~; k1 U) E5 U    int pagesize = 0;
    / W$ U; E0 {; t+ ?    int rc;
    9 Z2 G3 u& K1 {9 t
    : b/ [0 T' X1 A5 e9 L8 D6 ]% x. V4 j    file_fd = open(filename, O_RDWR | O_CREAT | O_TRUNC | O_DIRECT, 0666);
    + ]2 N) j- p0 e/ ~: ~8 d    pagesize = getpagesize();
    $ {, T4 s5 `! @1 t8 g5 O    user_mem = mmap(0, pagesize, PROT_READ | PROT_WRITE, MAP_SHARED, dma_fd, 0);. Y' e# J* ]8 q' n9 O
        if (user_mem == (void*) -1)
    / r' Z7 Q2 X( C% {. `    {
    ! ~  B. A, [- T& L; y8 C        fprintf(stderr, "mmap: %s\n", strerror(errno));2 ]  {5 W6 E! m9 [1 h6 e
            exit(-1);
    ) ~& i) I& c- M* A" ~$ {    }
    ' T) K: c/ i8 I# H
    , I7 f/ I# S# w% o8 u    printf("user_mem %p\n", user_mem);/ h; D! L9 D9 m! p& F  @; s5 Y6 O# r
    * b5 s0 ?0 d. j% H( z1 p
        rc = write(file_fd, user_mem, pagesize);4 `& T4 m* X8 x
        if (rc < 0)
    - w* q* U& y; T, X    {: l* |6 s! X, [3 A7 d2 L
            perror("write file");/ j6 M2 F- q! E" e* X: T
        }
    & h( O3 A+ H2 Z0 Q" t- I2 Y    else if(rc != pagesize)8 l; ~: X, W: P7 R) m
        {, e6 d- W* Q8 A* {
            printf("Write file fail 0x%lx != 0x%lx.\n", rc, pagesize);
    # ?. t9 C" f3 b8 q    }   " k( X! d; \6 H: C9 N3 l* J

    " U- B1 |+ o/ H+ E' ~4 G9 C$ V    rc = munmap(user_mem, pagesize);
    * p1 e: x& v% l+ p2 v7 i) w, C    if (rc)3 t3 ?1 q( ^9 i' _1 r" \
        {' X& u, t' X4 B/ f
            perror("munmap");
    - V8 Q  M! p+ U5 y    }   ; x; {) Z9 P3 C% ]
    }
    5 J, {$ L) A; `
    : A/ V; ^- {) S6 G  u4 M: n0 @

    . |, h& k" C% x' B
    : A. g5 G" K/ x% p
    # E# j+ E8 Y5 [内核驱动使用dma_alloc_coherent分配的内存,使用dma_mmap_coherent映射到用户空间。
    ' _1 d' _5 f' Q( W/ y8 G. x* t执行测试函数simple_test时报write file: Bad addree
    0 u5 Q6 t$ g, p# B' R# s8 ]7 l) r, x# [
    映射的地址和长度都是页大小的整数倍。不使用O_DIRECT时没有错误。
    3 |$ ?0 H) w; I在用户态分配页对其的地址也没有问题, Q+ ~/ F5 }) X0 p. \
  • TA的每日心情

    2019-11-19 15:29
  • 签到天数: 1 天

    [LV.1]初来乍到

    2#
     楼主| 发表于 2020-8-3 15:11 | 只看该作者
    在内核中使用filp_open创建文件,用kernel_write写文件也有相同问题。现在看可能是direct IO不支持内核空间分配的地址。
    8 Y' q0 s' _; z) D6 R( \- n有什么方法可以规避该问题呢?
    ' k4 S. A4 i0 U- N& e
  • TA的每日心情

    2019-11-29 15:37
  • 签到天数: 1 天

    [LV.1]初来乍到

    3#
    发表于 2020-8-3 15:12 | 只看该作者
    路过啊,嘿嘿
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-6-28 12:14 , Processed in 0.093750 second(s), 23 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表