免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5254 | 回复: 8
打印 上一主题 下一主题

特权级,是CPU来管理还是操作系统来管理?怎么分工的呢 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-11-30 16:13 |只看该作者 |倒序浏览
CPU有四个特权等级,操作系统只用两个,一个是内核态另一个是用户态,
常常看到解释说:“在内核态下,CPU可执行任何指令,在用户态下CPU只能执行非特权指令”
这里说的非特权指令是CPU定义的概念还是OS的概念?
特权控制的主要任务是CPU还是OS?
对于inline特权指令的用户态程序,怎么限制它的越权操作?

求各位解惑


谢谢各位的回复,我大概明白我想要的东西了。

[ 本帖最后由 uriza 于 2009-11-30 17:27 编辑 ]

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
2 [报告]
发表于 2009-11-30 16:44 |只看该作者
当前进程的权限级别,是当前正在执行的代码所在的段的特权级,存在于cs寄存器的低两位
CPU里有个CPL设置,最低两位设置从0--3,Linuxkernel一般用两个

论坛徽章:
1
天蝎座
日期:2013-10-23 21:11:03
3 [报告]
发表于 2009-11-30 16:50 |只看该作者

回复 #1 uriza 的帖子

是OS利用了CPU的特权级这一特点
使得一些操作只能在内核态做
而用户态做不了

“对于inline特权指令的用户态程序,怎么限制它的越权操作?”
能举个例子吗?特权级不够的话,理论上是执行不了的,应该会产生一个异常,貌似是#GP(通用保护异常)

论坛徽章:
0
4 [报告]
发表于 2009-11-30 17:00 |只看该作者
CPU的特权级是CPU的属性,当CPU处于低特权级时有些指令是不能执行的。
操作系统利用CPU的特权级分出用户级和内核级
用户级代码属于低特权级,只能执行CPU有限的指令
内核级代码属于高特权级,可以执行CPU所有的指令

用户态只能通过系统调用进入内核态(int $80)
int $80执行的时候,CPU自动切换CS段的特权(在调用门定义的)

#define _set_gate(gate_addr,type,dpl,addr) \
do { \
int __d0, __d1; \
__asm__ __volatile__ ("movw %%dx,%%ax\n\t" \
"movw %4,%%dx\n\t" \
"movl %%eax,%0\n\t" \
"movl %%edx,%1" \
:"=m" (*((long *) (gate_addr))), \
"=m" (*(1+(long *) (gate_addr))), "=&a" (__d0), "=&d" (__d1) \
:"i" ((short) (0x8000+(dpl<<13)+(type<<)), \
"3" ((char *) (addr)),"2" (__KERNEL_CS << 16)); \
} while (0)

进入int $80之后有一段saveall的代码,saveall把DS段和ES段都设置为高特权
#define SAVE_ALL \
cld; \
pushl %es; \
pushl %ds; \
pushl %eax; \
pushl %ebp; \
pushl %edi; \
pushl %esi; \
pushl %edx; \
pushl %ecx; \
pushl %ebx; \
movl $(__KERNEL_DS),%edx; \
movl %edx,%ds; \
movl %edx,%es;

其中__KERNEL_CS和__KERNEL_DS的0和1位(RPL位)为0,就是特权0级

[ 本帖最后由 readkernel 于 2009-11-30 17:15 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2009-11-30 17:05 |只看该作者
原帖由 T-Bagwell 于 2009-11-30 16:44 发表
当前进程的权限级别,是当前正在执行的代码所在的段的特权级,存在于cs寄存器的低两位
CPU里有个CPL设置,最低两位设置从0--3,Linuxkernel一般用两个


谢谢你的指教。
我想问的是,在特权控制是怎么实现的,CPU在越权操作发生时,只是发出一个中断信息?
OS在越权发生时,只是进行进行中断处理?
还有,越权操作只的判断标准只是选择符的低两位这样的控制位是不是改变?
对于用户态进程直接执行了“特权指令”,而没有改变特权级控制位,这种情况,CPU或OS又有什么样有效的控制措施?

论坛徽章:
1
天蝎座
日期:2013-10-23 21:11:03
6 [报告]
发表于 2009-11-30 17:12 |只看该作者
“直接执行”前首先要寻址这条指令,要改变CS和EIP
这个地方就应该通不过
不知道LZ如何执行?

论坛徽章:
0
7 [报告]
发表于 2009-11-30 17:14 |只看该作者
原帖由 readkernel 于 2009-11-30 17:00 发表
CPU的特权级是CPU的属性,当CPU处于低特权级时有些指令是不能执行的。
操作系统利用CPU的特权级分出用户级和内核级
用户级代码属于低特权级,只能执行CPU有限的指令
内核级代码属于高特权级,可以执行CPU所有 ...


谢谢你的指教
我大概明白了,特权级的控制是CPU来完成的,比如inc 指令执行在所有特权级,out执行在0特权级,mul执行在2特权级(假设的),像这些都是CPU内部定制好的规则而已

论坛徽章:
0
8 [报告]
发表于 2009-11-30 17:16 |只看该作者

回复 #7 uriza 的帖子

看我在4楼重新编辑的回复

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
9 [报告]
发表于 2009-11-30 19:45 |只看该作者
原帖由 uriza 于 2009-11-30 16:13 发表
CPU有四个特权等级,操作系统只用两个,一个是内核态另一个是用户态,
常常看到解释说:“在内核态下,CPU可执行任何指令,在用户态下CPU只能执行非特权指令”
这里说的非特权指令是CPU定义的概念还是OS的概念 ...

由CPU支持,OS管理
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP