Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将开放系统调用映射到父函数?_C_Linux_Linux Kernel - Fatal编程技术网

C 将开放系统调用映射到父函数?

C 将开放系统调用映射到父函数?,c,linux,linux-kernel,C,Linux,Linux Kernel,我有一个问题,我们需要在gemOS中实现开放系统调用的内部工作 int create_fd = open(filename, O_CREAT|O_RDWR, O_READ|O_WRITE); 在VisualStudio代码中,当我使用ctrl+enter键检查open的定义时,它将引导我使用以下函数。假设开放系统调用存在O_create标志,那么相应地将调用\u syscall3 int open(char * filename, int flags, ...){ va_list ap; lo

我有一个问题,我们需要在gemOS中实现开放系统调用的内部工作

int create_fd = open(filename, O_CREAT|O_RDWR, O_READ|O_WRITE);
在VisualStudio代码中,当我使用ctrl+enter键检查open的定义时,它将引导我使用以下函数。假设开放系统调用存在O_create标志,那么相应地将调用\u syscall3

int open(char * filename, int flags, ...){
va_list ap;
long mode;
va_start(ap, flags);
mode = va_arg(ap, long);
va_end(ap);

if((flags & O_CREAT) == O_CREAT){
    return _syscall3(SYSCALL_OPEN, (u64)filename, flags, mode);
}
else{
    return _syscall2(SYSCALL_OPEN, (u64)filename, flags);
 }
}

当我检查syscall3的定义时,它给出了以下代码。我无法理解asm volatile命令中写的内容。谁能解释一下发生了什么事

static long _syscall3(int syscall_num, u64 arg1, u64 arg2, u64 arg3){
asm volatile (
    "int $0x80;"
    "leaveq;"
    "retq;"
    :::"memory"
  );

  return 0;   /*gcc shutup!*/
}
另外,当我尝试在asm volatile行之前打印某些内容时,函数有点停止执行。顺便说一下,我们需要为这个调用实现的函数如下

  extern int do_regular_file_open(struct exec_context *ctx, char* filename, u64 flags, u64 mode){

/**  
*  TODO Implementation of file open, 
*  You should be creating file(use the alloc_file function to creat file), 
*  To create or Get inode use File system function calls, 
*  Handle mode and flags 
*  Validate file existence, Max File count is 16, Max Size is 4KB, etc
*  Incase of Error return valid Error code 
* */

return 100;
}

我试图将主文件中编写的函数映射到该文件中,但由于asm volatile,我无法理解发生了什么。

“我无法理解asm volatile命令中写入的内容”-所有三个命令都很容易通过谷歌搜索得到。1.
int80
执行系统调用中断,该中断由内核2处理
leaveq
“完成”执行
\u syscall3
功能。3.
retq
执行函数的实际返回。@Tsyvarev您能解释一下它是如何使用asm命令调用**do_regular_file_open**的吗?正如我在前面的评论中所说,
int 80
是一个中断,它会触发到内核(privileged)代码的转换
do\u regular\u file\u open
是一个内核函数,负责使用
SYSCALL\u open
标识符处理系统调用。如果您不知道什么是“内核空间”、“用户空间”以及“系统调用中断”的含义,那么在编写操作系统代码之前,您需要阅读有关此主题的一些参考资料。@Tsyvarev谢谢您的帮助。事实上,这是我的作业,我的老师从来没有解释过这些事情,他只是吹嘘自己每年都会给我布置艰巨的作业。我猜这是假设函数的参数将留在它们到达的寄存器中,并且生成的代码可以处理早期返回,但编译器不能保证这一切。例如,如果内联,它将彻底崩溃。它需要正确地使用扩展的asm约束,如的i386部分所述
static long _syscall3(int syscall_num, u64 arg1, u64 arg2, u64 arg3){
asm volatile (
    "int $0x80;"
    "leaveq;"
    "retq;"
    :::"memory"
  );

  return 0;   /*gcc shutup!*/
}