zoukankan      html  css  js  c++  java
  • 内存空间切换:在内核写数据到用户空间的方法

    改变内存空间的方法,主要就是set_fs(),get_ds()这两个函数来完成内存空间切换。一般定义的宏如下:
    #define BEGIN_KMEM {mm_segment_t old = get_fs();set_fs(get_ds())}
    #define END_KMEM {set_fs(old);}
    前面一个宏主要是先记录下内存空间的首地址,再设置内存空间的首地址为用户空间首地址,进行内存空间切换。
    后一个宏主要是将内存空间切换回去.

    举例如下:

    struct file *filep = NULL;
    int wsize;
    filep = filp_open("/opt/scst.dat",O_RDWR | O_APPEND,0);
    if(IS_ERR(filep))
        TRACE_DBG("Open file /opt/scst.dat error");
    
    csm_bvec = &bio->bi_io_vec[0];/*要写的page地址*/
    if(filep != NULL)
    {
        BEGIN_KMEM
        wsize  = vfs_write(filep,
        (const char __user *)(page_address(csm_bvec->bv_page) + csm_bvec->bv_offset),
        csm_bvec->bv_len,    &filep->f_pos);/*写数据到文件*/
    
        if(wsize != csm_bvec->bv_len)
            TRACE_DBG("write file error,size %d(should be %d)",size,csm_bvec->bv_len);
        else
            TRACE_DBG("write file ok,size %d",wsize);
        END_KMEM 
    }
    filp_close(filep,NULL);/*关闭*/
  • 相关阅读:
    [#]
    Windows 下配置 ApacheBench (AB) 压力测试
    [转载]
    Nginx 系列教程
    设置外接显示器顺序(哪个在左,哪个在右)的方法
    [.Net] 一句话Linq(递归查询)
    [Xamarin]
    [SVN]
    [SQL SERVER]
    [Oracle]
  • 原文地址:https://www.cnblogs.com/mingziday/p/3967215.html
Copyright © 2011-2022 走看看