1.什么是用户态和内核态?
用户态和内核态是操作系统中的两种运行模式或特权级别。
用户态:在用户态下,应用程序以及用户自己编写的代码运行,其权限受到限制,不能直接访问底层系统资源和执行特权操作。用户态只能受限地访问内存,且不允许访问外围设备,占用CPU的能力被剥夺,CPU资源可以被其他程序获取。
内核态:内核态是具有最高权限的运行模式,可以执行特权指令和直接访问硬件设备。在内核态下,CPU可以访问内存的所有数据,包括外围设备,例如硬盘、网卡等。CPU也可以将自己从一个程序切换到另一个程序。
内核态相比用户态拥有更高的特权级别,因此能够执行更底层、更敏感的操作。不过,由于进入内核态需要付出较高的开销(需要进行一系列的上下文切换和权限检查),应该尽量减少进入内核态的次数,以提高系统的性能和稳定性。
2.什么是系统调用
系统调用是操作系统提供给应用程序访问操作系统服务和资源的接口。应用程序通常运行在用户态,处于用户态的进程有诸多限制(如不能进行I/O操作),所以有些功能必须由内核代劳完成。因此,操作系统需要提供访问这些内核态运行的程序的接口,这些接口的集合就叫做系统调用。通过系统调用,应用程序可以请求操作系统执行特定的任务,如读写文件、创建进程、申请内存等。简要地说,系统调用是内核向用户进程提供服务的唯一方法。
3.你了解系统调用的过程吗?
系统调用是操作系统提供给应用程序用来访问操作系统服务和资源的接口12。在Linux中,系统调用是用户空间访问内核的唯一手段。以下是一个系统调用的基本过程:
(1)应用程序调用库函数(API):应用程序通常通过调用库函数来发起一个系统调用。
(2)API将系统调用号存入EAX:库函数会将对应的系统调用号存入EAX寄存器,并通过中断调用使系统进入内核态。
(3)内核中的中断处理函数根据系统调用号,调用对应的内核函数(系统调用):内核中的中断处理函数会根据EAX寄存器中的系统调用号,在系统调用表中找到并执行对应的内核函数。
(4)系统调用完成相应功能,将返回值存入EAX,返回到中断处理函数:内核函数执行完毕后,会将返回值存入EAX寄存器,并返回到中断处理函数。
(5)返回到用户态的wrapper函数中:最后,控制权会返回到用户态的wrapper函数中,继续执行系统调用之后的代码。
4.内存映射的原理
将一块内存空间映射到不同的进程空间中