内存保护

wudongxu 2010-01-08 09:07:48
我是Linux的新手,最近在看内存保护方面的知识,以下是自己对Linux内
核空间与用户空间,进程间隔离的认识。不知道对否,希望有大侠能帮
忙指正。这里不胜感!

Linux内核与用户空间的隔离
在linux中内核空间与用户空间的隔离是利用它们使用不同的线性地址

空间.内核使用从3G~4G范围的虚拟地址空间.而用户空间使用0~3G的虚

拟地址空间.这两个空间使用不同的CPU特权级,当在用户空间运行的程

序直接访问内核空间的地址的话会因为特权级不够而被中止.但是因为

内核又必须向应用程序提供服务,所以就必须有一种机制实现,使得在用

户空间可以访问内核空间.linux使用系统调用来实现,通过操作系统提

供了一系列系统调用,应用程序可以调用它们以达到访问内核的目的.系

统调用会触发一个软中断,使CPU从用户态上升到内核态,从而达到访问

内核的条件.即linux内核空间与用户空间的隔离是根据使用两个不同的

地址空间,而这两个空间需要不同的CPU特权级来访问,从而达到隔离的

目的.同时又通过系统调用机制,实现用户空间访问内核的需求.

Linux进程间隔离
在Linux中进程间的隔离是利用:页表来实现.每个进程有自己的一张页

表,这张页表的所映射的虚拟地址就进程的地址空间.而在进程运行的时

候系统会把它的页表加载为当前的,即这个进程只能访问它自己页表映

射的内存空间,也就是它的进程地址空间.从而达到隔离的目的.
...全文
195 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
wudongxu 2010-01-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 deep_pro 的回复:]
lz的理解不错,Linux进程间隔离 确实如此


当在用户空间运行的程序直接访问内核空间的地址的话会因为特权级不够而被中止.但是因为

内核又必须向应用程序提供服务,所以就必须有一种机制实现,使得在用户空间可以访问内核空间
-----------------
这里有点狭隘了
用户空间对于硬件的操作必须通过系统调用进入内核才有权限,而不仅是因为需要访问内存。
就是一个printf都需要系统调用sys_write进入内核
而用户空间访问内核空间,可以通过驱动程序实现的mmap。内核也不应该随便访问用户空间内存。
用户和内核之间传递的内存地址参数,应该通过copy_from_user 、copy_to_user 实现转换
[/Quote]

楼上的谢谢。
还有一个问题:如何来比较特权级,是谁跟谁比较。
deep_pro 2010-01-08
  • 打赏
  • 举报
回复
lz的理解不错,Linux进程间隔离 确实如此


当在用户空间运行的程序直接访问内核空间的地址的话会因为特权级不够而被中止.但是因为

内核又必须向应用程序提供服务,所以就必须有一种机制实现,使得在用户空间可以访问内核空间
-----------------
这里有点狭隘了
用户空间对于硬件的操作必须通过系统调用进入内核才有权限,而不仅是因为需要访问内存。
就是一个printf都需要系统调用sys_write进入内核
而用户空间访问内核空间,可以通过驱动程序实现的mmap。内核也不应该随便访问用户空间内存。
用户和内核之间传递的内存地址参数,应该通过copy_from_user 、copy_to_user 实现转换
充电宝111 2010-01-08
  • 打赏
  • 举报
回复
特权级是段描述符里面的两个bit,叫做DPL,特权级比较就是当前的特权级CPL和调用门的描述符里面的DPL比较,是X86里面特有的,没必要研究的太清楚。

4,438

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧