找回密码
 注册
关于网站域名变更的通知
查看: 333|回复: 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) U# @9 a: k# N3 b6 ]
    下面为用户层函数代码:
    % q. |2 N5 H7 o; E0 o% Q" c" U7 z: z( S' z1 Z1 f3 o% z$ m- x7 S/ ]' R: R
    C/C++ code. p  r& P- d4 [! H
    ?; A7 m' i% M7 @- P" G4 K
    1

    & h& |3 L, u+ J; Q7 k* m
    2

    * S* N- E; K% e. S; B+ A# Q
    3

    ! i2 x8 q1 v1 p. w: P4 d
    4
    8 ]8 ~$ q7 x* c% t2 ?
    5
    , u. U: F; d( q$ G3 o" t
    6
    ! e! T) F$ e/ N( D3 K, S
    7
    - _# V0 a$ R6 h+ F/ ?8 w
    8
    : w% A+ p' T0 y+ `7 u) u
    9

    # p' L' @$ D$ |; M$ i( }
    10
    6 g7 s0 H. y3 [
    11

    ( S" X! K" d$ p  W6 {" [
    12
    + L6 y+ `" [, E* ]0 J* w
    13

    0 W; X7 u+ O8 w) Z, Y
    14
    1 T& R2 D; R4 _3 r
    15
    ! r; C. E# d' O+ y7 l8 }7 U4 }
    16
    ; P( }# G9 T# f1 ^  U) g) w
    17

    4 `' J  p: Y: U& r
    18
    $ L3 `- T8 _' I1 q$ J
    19

    ! `5 ^2 ^( _8 q7 z# Q
    20

    7 `* a% t; V% Y
    21

    6 a3 O; b/ ?7 I
    22

    # A7 Y2 U, A; D% x5 V
    23
    ; S$ ^) n; k) q* Y; ^( `
    24
    ( _% X/ E: p! [" H
    25
    $ C7 [# I% D7 Y' L* r6 `
    26

    $ l5 p& H# _1 s( G/ \+ X* }
    27
    3 P0 A8 S: T4 b& D: z) x
    28

    ) m! j- e( B0 }/ n4 a
    29

    4 d( a; z; Z/ H, u# b5 O5 u7 X
    30

    ; I: `- r: r3 T+ r9 c' o
    31

    2 y1 D5 |9 L7 h
    32
    ! r! ^; e9 e! b
    33
    ; O/ M0 ^: f6 G7 H2 B' f  A5 ?. t
    34

    3 V( d: r4 t! Z% u
    void simple_test(char *filename, int dma_fd)
    ' }9 I/ x. T( G8 r* W{6 C) p2 i# ]' H
        int file_fd
    4 k: o6 k& r: a7 R8 u5 h    void *user_mem = NULL;% b: ]! x# j1 X5 Q
        int pagesize = 0;0 Y2 ^: ?' C6 O9 ]2 o% @6 y/ p
        int rc;. l! h: J) v+ A& w' W
    # p5 E% O" g$ f% E1 ^
        file_fd = open(filename, O_RDWR | O_CREAT | O_TRUNC | O_DIRECT, 0666);; m* ~. f5 ^  e4 \# R2 X6 O; f* O
        pagesize = getpagesize();* X9 A  q! {# m5 B, `1 q
        user_mem = mmap(0, pagesize, PROT_READ | PROT_WRITE, MAP_SHARED, dma_fd, 0);
    6 c( m# J4 c* T    if (user_mem == (void*) -1) , z9 h7 x6 N& d, k( P/ X
        {
    8 ]$ {7 v5 b8 Q( `) Q        fprintf(stderr, "mmap: %s\n", strerror(errno));
    9 z' ~7 ?7 e9 I1 V! k        exit(-1);- h! K: N' L) G4 e$ E1 U* ^( s
        }% r+ M& f6 T8 U$ Q+ `: B! y
    / Z3 e+ v9 f, s* r) t) }2 n
        printf("user_mem %p\n", user_mem);. {( \. [& F1 |+ ], \( [

    1 }  S8 w* [' ~5 ?7 I3 }    rc = write(file_fd, user_mem, pagesize);7 b* }3 k- _% L+ \0 V; m: r
        if (rc < 0)2 H! Z3 e, B' A; @- H, s
        {8 ]1 R* k- z$ C1 R
            perror("write file");
    8 v: Y7 R6 ]  f* g2 A    }( h# C  Q2 j* e$ P2 a, m
        else if(rc != pagesize)
    - v! N. M% {+ t& D    {
    7 @( o7 S! x( A6 i( l) |: {        printf("Write file fail 0x%lx != 0x%lx.\n", rc, pagesize);
    & f+ K) D2 k8 t5 a# q5 Q; O    }   
    # y) G4 r# [2 I+ |8 V8 `; }& e- u- b6 E! C0 V7 m
        rc = munmap(user_mem, pagesize);
    # z, V7 u+ d" d9 O    if (rc)
    / u% x% Q% f" j    {
    . s- a' K/ k. ?& F        perror("munmap");
    . H- {/ |- z( t  t' E# P8 Y" k! ^    }   - }* m" h! H. W( Y
    }1 \1 y7 T8 z9 h5 `+ r

    / J  P) m% l4 v8 P3 A" x% e% N# q
    * j* B# `6 A# @0 b8 g

    5 o  \* c# V9 U( f4 ^* Z! t+ ~* Q( V2 J# h( v1 @5 v2 f; F
    内核驱动使用dma_alloc_coherent分配的内存,使用dma_mmap_coherent映射到用户空间。
    ; ^. W' c) I4 x! v  A" c执行测试函数simple_test时报write file: Bad addree
    , r, w) m3 |1 d6 _% Q
    / q+ W2 ~9 e4 X; H映射的地址和长度都是页大小的整数倍。不使用O_DIRECT时没有错误。
    & U! m. K0 t& \' q  C* y4 I在用户态分配页对其的地址也没有问题  c: g, ~$ [. j9 D/ o2 w8 Q% V
  • TA的每日心情

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

    [LV.1]初来乍到

    2#
     楼主| 发表于 2020-8-3 15:11 | 只看该作者
    在内核中使用filp_open创建文件,用kernel_write写文件也有相同问题。现在看可能是direct IO不支持内核空间分配的地址。! I; D. M7 r# P4 o
    有什么方法可以规避该问题呢?
    + N; Y( a- ?# s0 z' k
  • 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:22 , Processed in 0.156250 second(s), 23 queries , Gzip On.

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

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

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