操作系统的边界在哪里
引言哪里是操作系统?Linux Kernel 的维护者说,提供Syscall的是操作系统。汇编爱好者说,提供系统调用库函数的下面的是操作系统。ArchLinux佳豪说,上面这些加上一些Terminal,一些Network Manager,和一个Pacman,就是操作系统。Ubuntu用户说,这个桌面和内置的小软件以下是操作系统。余承东说鸿蒙是操作系统。正在许愿Vibe coding的文科生说,deepseek帮我复刻一些windowsxp。操作系统的上面。在内存中心呼唤系统的自陷要找到操作系统的上边界,让我们深入所谓用户软件和操作系统在书上所定义的,发生切换的一瞬间。目态与管态要理解为什么会有“切换的瞬间”,就要知道为什么需要这么做,他们在切换什么。另外的一组名字叫做用户态和内核态,原因很简单,互联网上的软件千千万万,良莠不齐,需要给内核操作和用户操作彻底隔离开(不只是在两种状态,后面会提到)。包括系统指令的地址空间都是用户不可达的,需要让用户软件不触及操作系统的正常允许。你也不想qq崩溃直接给系统拉闸了吧。但是那些系统方法总得用吧,不能用户程序啥也不做,所以需要用一种特殊的方式来切换系统模式系统调用对于一般的程序员,能够碰到最下面的地方就是库函数,这里我们以c语言举例。比如write()方法,write(fd, buf, count)传递参数首先这几个参数(标识符,写入内容地址头,长度)会被重写为汇编能识别的参数,然后调用write函数mov edx, 5 lea rsi, [rip + hello] mov edi, 1 call write 注意这下面的call是正常汇编的调用函数,此时PC的值改为call+指令长+偏移指向write函数开头。返回地址(RSP)压入用户栈。此时我们的参数们还在刚才塞进去的寄存器里面。执行系统调用此时执行系统调用(ABI)前,必须填写以下的规范化系统调用参数,这个过程具体有点太具体了,远远超过了408会考察的范围,总之会把刚才的参数传递进去。RAX = 系统调用号 RDI = 参数1 RSI = 参数2 RDX = 参数3 R10 = 参数4 R8 = 参数5 R9 = 参数6在这一堆参数传递完毕后,终于到了那传说中操作系统的边界syscall硬件隐指令首先硬件会自动关中断,保存现场(原始PSW…