区分用户态和内核态
内核态可以访问任何数据,而用户态不能访问内核数据。当前指令为CS:IP用CS最低两位表示:0为内核态,3为用户态。在运行指令时会对权限进行检查。
如何进入内核态
使用中断指令INT(trap陷阱指令,linux为0x80)int指令将CS的cpl改变为0,进入内核态,这是用户态程序进入内核态的唯一方式。因此系统调用的具体过程实现如下:用户程序中包含int 0x80的代码,由os处理中断代码获取中断调用号,os根据编号执行相应的代码。
系统调用处理的过程
用户程序->system call 第i号程序->int 0x80 ->保护现场->取出现场调用号、查询入口地址、进入相应的地址->结束调用、恢复现场->返回用户态程序
系统调用的参数传递
- eax中存储系统调用号
- 最多直接传递3个参数:使用寄存器ebx、ecx、edx传递参数
- 传递参数的种类总结:
- 直接用寄存器传参,最多3个参数
- 指定内存块传参,可以用ebx、ecx、edx传递内存地址和参数数目
- 使用系统堆栈,可以传递任意多个参数,此时寄存器可用可不用
API和system call区别
API是系统调用的接口,API是system call的封装,System Call更加底层,使用需要知道更多的细节,API使用更加方便,可移植性高
系统调用的类别
- 进程控制
创建进程,进入可执行状态、唤醒进程、挂起进程、分配内存释放内存等。 - 文件管理
创建、删除、读写、打开关闭、属性获取设置、重定位等。 - 设备管理
请求、释放、读、写、重定位、属性获得、设置、连接与断开 - 信息维护
- 通信
系统结构
- 简单结构
整个操作系统似乎是个单一的整体,不注重模块的划分和接口与功能层次。 - 模块化
面向对象技术生成模块化的内核。使用动态加载模块,现代UNIX,Solaris,Linux, Mac os X - 分层结构
整个操作系统分为若干层,至底向上层层封装,优点是构造和调试的简单化。缺点:分层法主要困难是对层的详细定义,这是因为一层只能使用其下的较低层。封层结构效率低。 - 微内核结构
将最基本的功能作为内核存在,主要包括最小的进程管理、内存管理和通信功能,其他功能作为系统程序或用户程序出现。