9.8 系统调用 (上)
函数调用
自定义函数
C标准库
第三方库
框架
操作系统
ucos 多任务编程示例
void task1(void)
{
while(1)
{
;
}
}
void task2(void)
{
for(;1;)
{
;
}
}
OS_STK stack1[512];
OS_STK stack1[512];
int main(void)
{
serial_init();
board_init();
OSInit();
OSTaskCreate(task1,0,&stack1[511],3);
OSTaskCreate(task2,0,&stack2[511],5);
OSStart();
return 0;
}
操作系统组件
网络通信
进程管理
文件系统
内存管理
协议栈
设备管理
GUI
安全问题
硬件安全访问
资源访问冲突
系统稳定运行
厨师+排号
权限管理
函数调用权限
内存访问权限
资源访问权限
Linux设计哲学
对不同的操作赋予不同的执行等级
内核态可访问任意系统资源,用户态程序访问权受限
操作系统特权
- 用户态
- 内核态
系统调用:int 80h; swi
内部异常
外部中断
CPU的特权等级
- X86处理器
ring0:内核代码:15条特权指令 + I/O + 内存访问特权
ring1/ring2
ring3:应用程序:I/O等系统资源访问受限 - ARM处理器
特权模式:SYS、FIQ/IRQ、SVC、ABT、UND + 特权指令MSR、MRS等
用户模式:USR
系统调用基本概念
操作系统提供给应用程序调用的接口:如厨师+叫号
用户态:应用程序运行状态,CPU执行特权级为3的用户代码
内核态:通过系统调用,CPU执行特权级为0的内核代码
系统调用流程
准备参数,调用系统调用API接口:open
通过软中断进入内核态、控制权交给OS、参数放在寄存器中
CPU从系统调用表中查询open系统调用对应的代码内存地址
从寄存器获取参数、执行open对应的相关内核代码
执行结束,将运行结果复制到用户态,返回用户态
CPU执行用户态代码,继续在用户态执行
系统调用的优点
- 简化应用程序开发
为应用程序提供一个统一的硬件抽象接口
分离了用户程序和内核驱动的开发 - 权限管控,保证了系统的稳定和安全