系统调用
概念
是操作系统提供给用户使其可以操作内核提供服务的一组函数接口
用户态和内核态
其中
ring 0
权限最高,可以使用所有
CPU
指令,
ring 3
权限最低,仅能使用
常规
CPU
指令,这个级别的权限不能使用访问硬件资源的指令,比如
IO
读写、网卡
访问、申请内存都不行,都没有权限
Linux
系统内核采用了:
ring 0
和
ring 3
这
2
个权限
ring 0:
内核态
,
完全在 操作系统内核 中运行,由专门的 内核线程 在
CPU
中
执行其任务
ring 3:
用户态
,
在 应用程序 中运行,由 用户线程 在
CPU
中执行其任务
Linux
系统中所有对硬件资源的操作都必须在 内核态 状态下执行,比如
IO
的
读写,网络的操作
区别:
1,
用户态的代码必须由 用户线程 去执行、内核态的代码必须由 内核线程 去执行
2,
用户态、内核态 或者说 用户线程、内核线程 可以使用的资源是不同的,尤体现在
内存资源上。
Linux
内核对每一个进程都会分配
4G
虚拟内存空间地址
用户态:
-->
只能操作
0-3G
的内存地址
内核态:
--> 0-4G
的内存地址都可以操作,尤其是对
3-4G
的高位地址必须由
内核态去操作,因为所有进程的
3-4G
的高位地址使用的都是同一块、专门留给 系统
内核 使用的
1G
物理内存
3.
所有对 硬件资源、系统内核数据 的访问都必须由内核态去执行
如何切换内核态
使用软件中断
软件中断与硬件中断
软件中断
软件中断是由软件程序触发的中断,如系统调用、软中断、异常等。软件中断不是
由硬件设备触发的,而是由软件程序主动发起的,一般用于系统调用、进程切换、异常
处理等任务。软件中断需要在程序中进行调用,其响应速度和实时性相对较差,但是具
有灵活性和可控性高的特点。
如程序中出现的内存溢出
,
数组下标越界等
硬件中断
硬件中断是由硬件设备触发的中断,如时钟中断、串口接收中断、外部中断等。当
硬件设备有数据或事件需要处理时,会向
CPU
发送一个中断请求,
CPU
在收到中断请求
后,会立即暂停当前正在执行的任务,进入中断处理程序中处理中断请求。硬件中断具
有实时性强、可靠性高、处理速度快等特点。
如当点击按钮扫描系统高低电频时等
系统调用与库函数的关系
库函数可以调用系统调用提供的接口,也可以不调用系统提供的接口
如
不调用系统调用的库函数
:strcpy,bzero
等
调用系统调用的库函数
:fread,printf
等
注意:
系统调用是需要时间的,程序中频繁的使用系统调用会降低程序的运行效率。当运行内核
代码时,
CPU
工作在内核态,在系统调用发生前需要保存用户态的栈和内存环境,然后转
入内核态工作。系统调用结束后,又要切换回用户态。这种环境的切换会消耗掉许多时
间。
文件操作
文件描述符概念
文件描述符是一个非负整数
,
代表已打开的文件。
每一个进程都会创建一张文件描述符表 记录的是当前进程打开的所有文件描述符。
每一个进程默认打开三个文件描述符:
0(
标准输入设备
scanf)
1(
标准输出设备
printf)
2(
标准错误输入设备
perror)
。
新打开的文件描述符 为最小可用文件描述符。
扩展
ulimit
是一个计算机命令,用于
shell
启动进程所占用的资源,可用于修改系统资源限
制。使用
ulimit
命令用于临时修改资源限制,如果需要永久修改需要将设置写入配置文
件
/etc/security/limits.conf
。
ulimit -a
查看
open files
打开的文件最大数。
ulimit -n
最大数 设置
open files
打开的文件最大数
文件读写
文件磁盘权限
第一位说是文件还是文件夹
2~4
位说明所有者权限
5~7
位说明同组用户权限
8~10
位说明其他用户权限
r 4
w 2
x 1
注意
man 2 系统调用函数
查看系统调用函数对应的头文件与函数信息
语法
open:打开文件
所需头文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
函数