码迷,mamicode.com
首页 > 其他好文 > 详细

[操作系统理论] 2, 系统调用的实现

时间:2015-08-20 01:05:08      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:

一, 操作系统的保护机制

1, 直观的想法

  假设有一个系统调用whoami(), 这个系统调用的功能是显示出当前计算机的所有者. 假设这台计算机是我的, 那么在操作系统的内核部分的内存中的某一个地方存放着我的名字: "aixiangfei", 假设这个内存的地址是100. 

  对于whoami()的实现, 最直观的想法就是: 直接把地址100处的字符串复制过来, 然后打印到到屏幕上. 

  如果真的是这种实现方法, 那么这个操作系统是非常不安全的! 比如说: 我们的密码肯定也是被保存在了操作系统的内存中, 那么任何人都可以轻松地获取系统的密码. 这样肯定是不行的.

 2, 内核态和用户态

  为了操作系统的安全, 一定不能让应用程序直接访问操作系统内核中的数据. 要实现这种想法, 必须通过硬件来实现. 实际上, CPU可以把内存分割成两个部分: 用户态和内核态. 内核态的程序可以访问内存的任何数据, 而用户态不能访问内核的数据. 

  这样表述可能有些抽象, 具体来说, 就是通过段寄存器和GDT表来实现的. ecs寄存器的低两位, 叫做CPL (current Privilege Level 当前特权级). 虽然2个位可以表示4种状态, 但是在linux 0.11中,只用到了两种状态, 就是0和3. 用0表示内核态, 用3表示用户态. 而代码段GDT描述符表中的13位和14位, 叫做DPL(Descriptor Privilege Level目标特权级). 只有当DPL>=CPL时, CPU才允许应用程序进入到内核中. 比如说: 当CPL=0, DPL=0 或者 CPL=0, DPL=3, 应用程序就可以进入到内核中了. 而cs寄存器的值是不能够随意更改的, 只有int 0x80中断指令才能使CPL才会变成0, 这时就可以进入到内核了! 这是用户程序发起调用内核代码的唯一方式. 

  所以, 用户程序想要访问内核数据的方法是:

  (1) 用户程序中包含一段包含int 0x80中断指令的代码

  (2) 操作系统写中断处理

  (3) 操作系统根据编号执行相应代码

  这就是操作系统的基本的保护机制

二, printf()函数的实现

[操作系统理论] 2, 系统调用的实现

标签:

原文地址:http://www.cnblogs.com/XiangfeiAi/p/4743860.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!