起因, 应用程序 运行时在内存中,操作系统也在内存中, 为什么应用程序想访问 操作系统的提供的功能函数,
为什么不能 直接去取从内存中去取呢?
答: 操作系统是一个重要的存在,
他掌控了计算机硬件这个国家中,重要的资源, 比方硬件资源, 和用户的密码和数据,
如果,随意的一个应用程序,就可以访问, 捞到用户的密码, 以及任意的掌控这个计算机的资源。
如果,这个应用程序有恶意的行为, 那么 对用户的信息安全,将会造成伤害, 对计算机的硬件资源也会造成伤害。
所以,不可以给应用程序直接访问 系统中的函数和功能。
所以系统调用的作用,
- 不让应用程序 随意的
jump,- 凭什么,使用什么手段不让应用程序
jump- 不让应用程序直接访问, 那么应用程序该如何使用操作系统提供的功能。
硬件上实现, 将内存隔成两个区域:
不同的态,他们所拥有的特权级别不同。
计算机对内存的使用,都是一段一段的使用;
所以用户态下的程序 属于 用户段;核心态下的程序属于内核段,
无论什么段, 都需要用到段寄存器;
0:内核态处于特权级别, 可以访问任何数据;
3: 用户态权限数值;
数值越低, 权限的级别越高。
数值越大, 权限级别越低,
所以只用当: 目标特权级的数值 >= 当前特权级的数值时, 才可以访问。
通过比较 DPL , CPL 的数值, 权限级别低的不可以访问权限级别高的。
只有当DPL >= CPL , 才可以访问内核态。
在系统初始化的时候,
head.S 执行的过程中,会针对内核的代码和内核态的数据建立 GDT表,
当时, 其中的DPL 初始化成 0,
在初始化完成后,进入用户态,
执行应用程序的过程中, cs 段寄存器中存放的当前应用程序的特权级别, 此时 CPL = 3, 当通过系统调用时, CPL 会短暂的变成0, 当返回用户态的时候, 又变成3;
而程序每次执行跳转 jmp, 还是 mov 这两个指令时,
都需要 访问 GDT 表, 因为访问了段寄存器了, 需要通过 段来进入 内核态。
访问 GDT 表时候, 所对应的数值
此时,比较 DPL >= CPL 是否成立,
中断的方式, int 0x80
上一篇:Java注解