Linux0.11内核--内核空间、用户空间之间的数据传输
来源:互联网 发布:unity3d汉化版 编辑:程序博客网 时间:2024/05/22 06:25
内核空间、用户空间之间的数据传输
内核空间数据段的选择符为0x10,用户空间数据段选择符为0x17。内核空间、用户空间之间的数据传输,是段间数据传输。C语言中的赋值语句编译成汇编后,“=”两边的变量默认段选择符都是DS,因此只能用于同一段内数据传输。
在segment.h中定义了一系列用于内核空间和用户空间传输数据的函数。从用户空间取得数据的函数中, mov指令的源操作数段寄存器都明确指出是fs,向用户空间写数据的函数中, mov指令的目的操作数段寄存器都是fs。当系统调用发生时,int 0x80处理函数会把fs设成用户数据段选择符(0x17),参见中断异常处理和系统调用一章。
下面分析一组对byte操作的函数,其他的对word和long操作的函数与之类似。
<!-- @page { margin: 0.79in } P { margin-bottom: 0.08in } -->
get_fs_byte()
- // 功能:从用户空间中addr地址处取出一个字节
- // 参数:addr 用户空间中的逻辑地址
- // 返回:fs:[addr]处的一个字节内容
- extern inline unsigned char get_fs_byte(const char * addr)
- {
- unsigned register char _v;
- // addr是逻辑地址,也就是用户数据段内的偏移。
- // 而当前数据段为内核数据段,所以要写成fs:[addr],这是虚拟地址
- __asm__ ("movb %%fs:%1,%0":"=r" (_v):"m" (*addr));
- return _v;
- }
put_fs_byte()
- // 功能:向用户空间中addr地址处写一个字节的内容
- // 参数:val 要写入的数据
- // addr 用户空间中的逻辑地址
- // 返回:(无)
- extern inline void put_fs_byte(char val,char *addr)
- { // addr是相对于用户数据段的偏移,而当前数据段为内核数据段
- // 所以要写成fs:[addr]的形式
- __asm__ ("movb %0,%%fs:%1"::"r" (val),"m" (*addr));
- }
0 0
- Linux0.11内核--内核空间、用户空间之间的数据传输
- Linux0.11内核--内核空间、用户空间之间的数据传输
- linux0.11内核空间与用户空间数据交换
- Relay:一种内核到用户空间的高效数据传输技术
- Relay:一种内核到用户空间的高效数据传输技术
- Relay:一种内核到用户空间的高效数据传输技术
- Relay:一种内核到用户空间的高效数据传输技术
- Relay:一种内核到用户空间的高效数据传输技术
- Relay:一种内核到用户空间的高效数据传输技术
- 内核空间&用户空间
- 用户空间 & 内核空间
- 用户空间和内核空间的详解
- Linux用户和内核空间之间的通信实现
- 内核空间与用户空间
- 用户空间存取内核空间
- 内核空间与用户空间
- 内核空间与用户空间
- 用户空间_内核空间
- 网络编程
- 在VirtualBox上安装OS X 10.10
- cocos2d-x 3.0 触摸机制的使用
- 移动互联网第一步
- java 的builder模式——设计思想
- Linux0.11内核--内核空间、用户空间之间的数据传输
- MVC北京络捷斯特第三方物流系统技术解析(九)到货通知
- 使用HDFS API列出目录下的所有文件
- mac中brew的安装使用及卸载详细教程
- Xcode 6.3.2 bug:编辑界面乱跳问题
- IIS6 部署 mvc 404
- error C2011: “XXX”:“class”类型重定义
- loadView、viewDidLoad、initWithCoder、initWithNibName、awakeFromNib的用法
- 形参长度可变的方法