博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
内存空间切换:在内核写数据到用户空间的方法
阅读量:5083 次
发布时间:2019-06-13

本文共 887 字,大约阅读时间需要 2 分钟。

改变内存空间的方法,主要就是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);/*关闭*/

 

转载于:https://www.cnblogs.com/mingziday/p/3967215.html

你可能感兴趣的文章
django orm 优化
查看>>
Azure Queue 和 Service Bus Queue的比较
查看>>
select 对update 操作的阻塞试验
查看>>
WCF 跨域TCP绑定
查看>>
hsdfz -- 6.18 -- day3
查看>>
申请到新博客了好开心
查看>>
编写高质量代码改善C#程序的157个建议——建议16:元素数量可变的情况下不应使用数组...
查看>>
编写高质量代码改善C#程序的157个建议——建议152:最少,甚至是不要注释
查看>>
设计模式12: Proxy 代理模式(结构型模式)
查看>>
显示数据
查看>>
#define中的“#”和“##”的作用
查看>>
rapidminer学习笔记6-从MYSQL到微软SQL SERVER
查看>>
js获取当前页面url信息方法(JS获取当前网址信息)
查看>>
微信小程序开发--路由切换,页面重定向
查看>>
APDU指令返回码及其代表含义
查看>>
地理编码和反地理编码
查看>>
svn cleanup失败解决方法
查看>>
ionic框架对Android返回键的处理
查看>>
IntelliJIDEA永久注册使用
查看>>
Android开发AVD路径问题
查看>>