在探究“Go语言中调用time.Now()时有没有发生系统调用?”这个问题之前,我们先复习下什么是系统调用。
什么是系统调用?
系统调用(system call)指的是运行在用户空间的程序向操作系统内核请求具有更高权限的服务。究竟是哪些服务呢?这些服务指的是由操作系统内核进行管理的服务,比如进程管理,存储,内存,网络等。以打开文件为例子,用户程序需要调用open
和read
这两个系统调用,在c语言中要么使用libc库实现(底层也是系统调用),要么直接使用系统调用实现。
Linux系统中为什么一定要经过系统调用才能访问特资源呢,难道就不能在用户空间完成调用访问功能吗?之所以这么设计是考虑到系统隔离性,提高系统安全性和容错性,避免恶意攻击。操作系统把CPU访问资源的安全级别分为4个级别,这些级别称为特权级别(privilege level),也称为CPU环(CPU Rings)。在任一时刻,CPU都是在一个特定的特权级下运行的,从而决定了什么可以做,什么不可以做。这些级别可以形象的考虑成一个个圆环,里面是最高特权的Ring0,向外依次是Ring1,Ring2,最后是最低特权的Ring3。当发生系统调用时候,应用程序将会从应用空间进入内核空间,此时特权级别会由Ring3提升到Ring0,应用程序代码也会跳到相关系统调用代码处执行。