Here,我在询问如何为OS161实现sys_open syscall,这将由open函数调用。
open函数的定义如下:
int open(const char *filename, int flags, ...);手册页是这样的:
提要
#include <unistd.h>
#include <fcntl.h>
int
open(const char *filename, int flags);
int
open(const char *filename, int flags, mode_t mode);因为它是一个变量函数,所以它可以接受传递的相同数量的参数,但是只定义了带有2或3个参数的情况。
我的问题是如何确定传递给open的参数数,是2还是3。如果在flags中设置O_CREAT位,则提供mode。
但我在操作系统中看到了一些代码,如下所示:
fd = open(filename, O_WRONLY|O_CREAT|O_TRUNC);在这种情况下,mode的值将是a2寄存器中的值,而不是有效值。
1-在这种情况下发生了什么,在这种情况下我应该做什么?参数是如何传递的?它是否在a2寄存器中传递零(不太可能发生)?还是只留下了登记簿上的任何价值?在任何情况下,如何确定最后一个参数是否有效?
我曾经让sys_open函数接收3个参数,并且只有在设置了O_CREAT位时才使用最后一个参数(mode)。但是现在,由于函数可以用位集调用,而且没有第三个参数,所以即使mode无效,我仍然可以使用它的值。
2-处理这些论点的逻辑应该是什么?
上述问题详细介绍了syscall的发布方式。
发布于 2020-09-05 12:46:02
POSIX文件简单地指出:
模式将设置为
oflag参数之后的参数值,该参数作为mode_t类型进行修改,如下所示:
它没有指定当您省略该参数时会发生什么,因此建议您确保它在那里(在客户端)。最有可能的情况是,它将使用参数所在的位置(无论是在寄存器还是内存中,取决于调用约定),而正确值的可能性很小。
Linux文档在这个问题上有如下说明(我的重点是):
如果在
flags中指定了O_CREAT或O_TMPFILE,则必须提供参数;如果没有提供,则必须将堆栈中的任意字节作为文件模式应用。。
当然,这并不是一份标准文档,因为“必须”这个词是你必须做的一个坚实的要求(否则所有的赌注都会被忽略),但是你应该这样读它。因此,再次,您应该确保您提供它。
所以我想说,你处理它的方式如下:
https://stackoverflow.com/questions/63753992
复制相似问题