C 将开放系统调用映射到父函数?
我有一个问题,我们需要在gemOS中实现开放系统调用的内部工作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
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!*/
}