系统调用

系统调用

要讲明白系统调用,就要明白以下的几个问题:

  1. 什么是系统调用?
  2. 为什么会有系统调用?
  3. 如何实现系统调用?

1. 什么是系统调用

系统调用就是操作系统提供的一些函数,可以用来访问硬件上的内容。系统调用和普通函数调用的区别就是系统调用会进入内核态,而普通的函数调用只在用户态。

2. 为什么会有系统调用

系统调用是为了将内核保护起来。内核中我们储存了如多重要的信息,比如用户的密码和各个用户的隐私记录等,如何应用程序可以随意的访问内核态的内存,那么计算机将没有隐私和保密可言。所以我们通过系统调用,对应用程序提供统一的接口,使它可以访问硬件资源。

3. 如何实现系统调用

为了实现系统调用,我们在计算机中我们将内存划分成了用户段和和内核段

  • 位于内核态时,cpu可以访问计算机所有的资源。
  • 位于用户态时,cpu只能访问用户段的资源,没法直接访问内核段的资源。

计算机通过硬件实现上面的功能。在cpu处于保护模式时,通过设置DPL(目的地的特权级)和CPL(当前程序的特权级)来阻止应用程序访问内核态的内存。内核段的DPL是0,用户段的DPL是3。只有当DPL>=CPL时,计算机才可以跳转来执行指令。举个🌰,当位于用户态的应用程序想要调用内核段的内存时,此时DPL=0,CPL=3,DPL<CPL,应用程序无法访问内核段的内存。

不过操作系统,提供了一些接口(系统调用)可以使应用程序可以进入内核,切换到内核态,来执行操作系统提供的一些功能。当我们使用系统调用时,系统调用通过0x80号中断,进入内核,从用户态切换到内核态,从而cpu可以访问内核段的内存

那么0x80号中断是如何完成内核态与用户态的切换的呢?

使用int 0x80中断后,内核段的DPL从0变成了3,此时DPL>=CPL,成功的切换到了内核态。切换到内核态之后,马上将内核段的DPL改成0,恢复原状。

DPL保存在DS寄存器中,CPL保存在CS寄存器中。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值