用户态、内核态指的是我们的程序所处于的一个状态。
通俗点说,我们写了一段程序,它在运行过程中有可能处于内核态或用户态。假如当前处于内核态,下一时刻就可能切换为用户态。
用户态与内核态的切换:
切换的触发条件:
- 程序需要去申请外部资源。【系统调用、中断、异常】这里说的是用户态切换到内核态,当内核态相关操作执行完毕后就会退回用户态。
外部资源:
- 内存条
- 网卡
- 磁盘
- 声卡
- 网卡
- usb
- LED
- 等
e.g:
1.读写文件就会触发用户态到内核态。
这个时候会进行系统调用:open/read/write
2.申请堆内存:c语言中的malloc()本身不是系统调用,其分为2种实现方式:
- brk
- mmap(小于128k的内存申请的时候会调用)
brk和mmap申请的是虚拟内存空间,并没有申请到主存上的物理内存空间。
想要拿到主存上的物理内存空间还要在第一次访问的时候,它会发现虚拟内存地址没有映射到物理内存地址,于是触发“缺页中断/缺页异常”。
触发条件系统调用、中断、异常中最常见的就是:系统调用
系统调用System Call:分5大类型:
- 进程控制相关
- 文件管理相关
- 设备相关
- 信息相关(获取操作系统、CPU信息等)
- 通信相关【进程间的通信,例如管道pip等】
每一种类型中的系统调用都有哪些?
打开一台机器,看当前linux机器的内核中到底有多少个系统调用:
Ubuntu默认是没有完全安装man手册的:
apt-get install manpages-de manpages-de-dev manpages-dev glibc-doc manpages-posix-dev manpages-posix
为了显示中文手册,还需要下载manpages-zh包:
sudo apt-get install manpages-zh
然后输入man syscalls,会出现系统调用表格:
按↓键可以看见表格:
以上就是内核中所具有的所有的系统调用了。
比如上面的accept就是套接字的客户端去连接套接字。
通过表格就可查看系统调用的5大类别的具体调用。