找回密码
 注册
关于网站域名变更的通知
查看: 334|回复: 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 addreee
    % F: B' h. d6 l' A下面为用户层函数代码:( S  O, k0 S. ~; h! }0 Y* o
    7 y* k2 n3 K7 s- H6 J
    C/C++ code/ x1 m6 Q2 e  D- J" N0 I9 \
    ?- v$ X' p( C9 R) o( g  ~9 w( r
    1

    & c3 w! f; k/ \& F: z
    2

    4 k6 V: L" u& d/ Q- K3 a  B! j
    3

    3 |6 A5 n2 H% N9 }
    4

    # A! }9 w- g  A1 m9 X# D! l( I/ u
    5
    ( T9 ]& S7 g4 F% N- H( \4 V0 _
    6

    9 O6 u' h4 \. t3 l# b2 @
    7
    7 M; w' s  x. y0 l2 t
    8

    + l" a( ?( z: F% T) k6 f1 c  l
    9
    2 ^- Q9 I. J$ U2 g
    10

    : `4 g6 N1 x- P/ [( K
    11

    $ o# F( a3 W6 T* W
    12
    6 O) x0 z8 c8 q% \  l2 {
    13

    ' K- O% g+ q- [3 @* U( l; L
    14
    $ J1 o% @! K) m9 w+ ^) B
    15
    : M$ G6 J; }* g% U& ?. ?! s, r
    16

    & ]$ {8 a+ Y6 ~1 H# R2 ^8 p! G
    17
    0 z* {# W# U  Y/ [+ y
    18

    % a; {3 @* v' X% |
    19

    & }: ^2 y9 c  I  |4 Y
    20

    / N8 w4 S1 G+ P
    21

    " |; z8 n: G8 E1 ]9 m
    22

    4 R. L0 `& x8 P- y, E$ ^: r2 p
    23

    8 T" C, t! c" R+ Y) @  u: D& k6 u
    24

    . P1 F7 \- Q% N6 u
    25
    # l, f) h' |: c- }$ z% B
    26
    - H6 s" L$ S, }) a# p  K
    27
    # L0 h$ }4 @- }. T0 J1 f! ]
    28

    0 s  S+ w1 P1 R
    29

    ; C7 q9 S0 Y: y9 M2 B
    30
    ) O0 \# O* ^& h9 R
    31

    $ D0 u5 }1 n# L( C, X: L8 e9 A( k: W
    32
    9 S! u. m' {) f" T/ `* L" l0 u
    33

    5 x5 t( X# _+ z; J# l9 M# t
    34
    - i/ X) W, o) N
    void simple_test(char *filename, int dma_fd)  k( m1 l. F* O' @
    {! Q1 h' D/ o/ b+ h
        int file_fd' ]. k4 p3 s9 h3 y
        void *user_mem = NULL;
    ; |% _  G. t6 C, j2 e    int pagesize = 0;+ F( k9 `/ o/ d4 d
        int rc;
    6 [8 z; i+ I5 }) f4 Q: A  w$ w6 W2 T% K( c5 m- D6 g
        file_fd = open(filename, O_RDWR | O_CREAT | O_TRUNC | O_DIRECT, 0666);" D5 Y$ y* R5 W5 {
        pagesize = getpagesize();* j9 d% z  U) e4 H1 @  {4 t
        user_mem = mmap(0, pagesize, PROT_READ | PROT_WRITE, MAP_SHARED, dma_fd, 0);
    0 i/ x- a, k) h4 D    if (user_mem == (void*) -1) + W7 x8 X8 C' q* @3 a+ w: g% M
        {% ]' G' g6 |' h
            fprintf(stderr, "mmap: %s\n", strerror(errno));
    / u% v6 L4 k' q3 _; m( e        exit(-1);
    ' k' ?6 X# V+ O( ]    }
    5 m; _. \0 w, i0 A0 c7 S' }
    . A, v3 P: F* W3 s    printf("user_mem %p\n", user_mem);# G6 H0 q( \# Q
    $ P6 P# ~. H1 [7 T
        rc = write(file_fd, user_mem, pagesize);
    / o, [! S$ T- a( s, ]3 n  ]9 X: |    if (rc < 0)
    " C2 j& W- G8 w1 b# @7 D    {
    + p* P# W8 W5 t% B4 a8 G        perror("write file");! R( c* |3 i! i1 k* w
        }( f: N; q/ H# Z2 b) u+ t0 W/ R
        else if(rc != pagesize)
    " ?* r1 ^! y5 B% N( _  s' O  E" \    {* c' F" _  G7 B/ w5 f
            printf("Write file fail 0x%lx != 0x%lx.\n", rc, pagesize);$ k6 E/ l( p* S, }
        }   
    : x! ~/ c' S- R; ?) }3 {0 X8 U4 j
        rc = munmap(user_mem, pagesize); " D3 H; C% A& c. P3 A
        if (rc)
    # B2 ^+ w8 z; X    {5 G3 v: w8 U3 G5 o6 V7 r
            perror("munmap");" F; W  U( I- }7 c( W3 A
        }   
    0 k! F0 x$ e9 K; s6 w2 p0 a: e& O}
    + p$ r) i( l7 I0 j$ G! |
    # x- ^; g5 k" V. I; U
    , t  ~+ [& ]+ O$ P2 q* q

    2 H% @% T" j6 c$ Q! a& {( d/ i7 x# @8 ?
    内核驱动使用dma_alloc_coherent分配的内存,使用dma_mmap_coherent映射到用户空间。
      z7 z# J( f! |; ?* k4 }执行测试函数simple_test时报write file: Bad addree
    5 H& ?/ d) Y6 ?( h. `+ l% k, B) ^. i" H8 |
    映射的地址和长度都是页大小的整数倍。不使用O_DIRECT时没有错误。" [) n$ v' R* Y# V$ i( F( Y' L( T
    在用户态分配页对其的地址也没有问题
    : ?6 e. l: Y- R5 y+ x% q$ ~! {
  • TA的每日心情

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

    [LV.1]初来乍到

    2#
     楼主| 发表于 2020-8-3 15:11 | 只看该作者
    在内核中使用filp_open创建文件,用kernel_write写文件也有相同问题。现在看可能是direct IO不支持内核空间分配的地址。
    * g) M! d- _" u' c4 C7 z) q" g有什么方法可以规避该问题呢?
    % ]$ ?. w4 V% T" a/ }( M( J2 J
  • TA的每日心情

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

    [LV.1]初来乍到

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

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-11-25 01:37 , Processed in 0.171875 second(s), 23 queries , Gzip On.

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

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

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