UNIX文件系统架构的演进与发展
早期UNIX系统调用处理
在早期的UNIX系统中, sysent[] 数组指定了所有可用的系统调用,包括参数数量。当用户程序执行硬件陷阱指令时,控制权从用户空间转移到内核,内核的 trap() 函数会运行,以确定要处理的系统调用。与用户程序链接的C库函数会在用户栈上存储一个与系统调用对应的唯一值,内核使用这个值在 sysent[] 数组中定位条目,从而了解传递了多少个参数。
对于 read() 或 write() 系统调用,参数的访问方式如下:
fd = u.u_ar0[R0]
u_base = u.u_arg[0]
u_count = u.u_arg[1]
这种访问方式有些特别,因为第一个参数和后续参数的访问方式不同。这部分是由于第5版UNIX所基于的硬件,部分是由于原作者选择的处理陷阱的方法。
如果在系统调用处理过程中检测到任何错误, u_error 会被设置以记录发现的错误。例如,如果尝试挂载一个已经挂载的文件系统,挂载系统调用处理程序会将 u_error 设置为 EBUSY 。在完成系统调用时, trap() 会设置 r0 寄存器以包含错误代码,当控制权返回用户空间时,该错误代码可作为系统调用的返回值访问。
UNIX文件系统架构演进
超级会员免费看
订阅专栏 解锁全文
1744

被折叠的 条评论
为什么被折叠?



