庞大资源库的计算机教程网站!
设为首页
加入收藏
总编信箱
投稿或申请专栏请先 [登 陆]
首页 操作系统 程序设计 图形图像 媒体动画 机械电子 WEB开发 数 据 库 办公系列 路由技术 网络原理 网络应用
认证考试 安全技术
首页>操作系统>Linux>系统管理>正文
资料搜索
Google搜索
Google
返回上级列表

推荐文章

快速保存网页中所有图片的方法
Windows中让光驱巧妙“隐身”技
防范非法用户入侵Win 2000/XP系
两款比较典型的ASP木马防范方法
有关表格边框的css语法整理
Windows XP中可以被禁用的服务
SQL Server导出导入数据方法
Javascript所有对象的属性的获
网页(HTML)中的特殊字符
与篮球共舞,尽显模式本色
QQ病毒的手工清除方法
Photoshop为极品美女打造性感睫
天衣无缝:IIS与PHP水火也相容
SQL Server存储过程编写和优化

谈谈Linux中的存储保护

 作者:本站收集   日期:2005-4-12
字号选择〖 〗/ 双击滚屏 单击停止   
以下讨论的内容是以i386平台为基础的




Linux将4G的地址划分为用户空间和内核空间两部分。在Linux内核的低版本中(2。0。X),通常0-3G为用户空间,3G-4G为内核空间。这个分界点是可以可以改动的。


正是这个分界点的存在,限制了Linux可用的最大内存为2G.而且要通过重编内核,调整这个分界点才能达到。


实际上还可以有更好的方法来解决这个问题。由于内核空间与用户空间互不重合,所以可以用段机制提供的保护功能来保护内核级代码。以下为2。0。X的部分代码:


/usr/src/linux/arch/i386/kernel/entry.S


A: .quad 0xc0c39a000000ffff /* 0x10 kernel 1GB code at 0xC0000000 *


B: .quad 0xc0c392000000ffff /* 0x18 kernel 1GB data at 0xC0000000 *


C: .quad 0x00cbfa000000ffff /* 0x23 user 3GB code at 0x00000000 *


D: .quad 0x00cbf2000000ffff /* 0x2b user 3GB data at 0x00000000 *




A,B为内核代码段及数据段的描述符。C,D为用户代码及数据段的描述符从以上,我们可以清楚的看到A,B的特权级为0,而C,D的特权级为3。当内核存取用户空间的内容时,他借助于fs寄存器,同过将FS寄存器的内容置为D来达到访问用户空间的目的。


2。2。X版的 内核对此进行了改动。这样内核空间扩张到了4G,所以可以直接进行拷贝了




.quad 0x00cf9a000000ffff /* 0x10 kernel 4GB code at 0x00000000 *


.quad 0x00cf92000000ffff /* 0x18 kernel 4GB data at 0x00000000 *


.quad 0x00cffa000000ffff /* 0x23 user 4GB code at 0x00000000 *


.quad 0x00cff2000000ffff /* 0x2b user 4GB data at 0x00000000 *


从表面上看内核的基地址变为了0,但实际上,内核通常仍在虚址3G以上。其中奥妙在与 不同的连接描述文件:


2。2。X:


. = 0xC0000000 + 0x100000;


_text = .; /* Text and read-only data */


.text : {


*(.text)


*(.fixup)


*(.gnu.warning)


} = 0x9090


.text.lock : { *(.text.lock) } /* out-of-line lock text */


.rodata : { *(.rodata) }


.kstrtab : { *(.kstrtab) }


。。。。




2。0。X:




faint,2。0内核被删除了。 :(






不管怎莫说,请大家相信我,2。0。X的起址为0x100000。这样一来,二者就相等了。都是0xC0000000 + 0x100000




用户空间在2。2。X中从直观上变为0-4G,让人迷惑:其不是可以直接访问内核了?其实不然, 同过使用页机制提供的保护,阻止了用户程序访问内核空间。




这样,存取用户空间实际上已不需要FS,GS的支持。但在内核中仍保留set_fs(X)等宏上你设的值用来验证随后的操作是否合适。是否超过设定的X。此处X不再是一个段描述符,而是一个具体的值。


此处就有一个陷阱:如果你将Set_fs的值设置为Kernel_DS,而没有将其该回去,当用户通过系统调用将一个Buffer的地址(应该在用户空间)设置为一个内核空间,而内核在访问该地址前认为默认当前的阀值仍为User_DS,事情就大大?了。
上一篇:系统启动进程:init    下一篇:linux上用户、用户组及私有用户组  
[发送给好友]  [关闭窗口]  [返回顶部]   转载请注明来源:www.it00.com   
特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
责任编辑: 原点 投稿作者: 本站收集
信息来源: 网络 录入时间: 2005-4-12
关于我们 - 广告服务 - 版权申明 - 网站地图 - 联系方式 - 总编信箱 - 会员投稿