gpt4 book ai didi

linux - 是否每次调用 write 都会切换到内核模式?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:17:36 25 4
gpt4 key购买 nike


我知道对 glibc“写入”函数的调用会调用内核函数 sys_call 写入函数。
因为 sys_call 是内核函数,所以 CPU 必须将环更改为零来存储进程寄存器等等。
但是它总是切换到内核模式吗?例如,如果我这样做

write(-1,buffer,LENGTH)

它是否仍然试图在文件描述符数组中找到它?
我在 glibc 源代码中看到它确实检查了 fd>0,但我没有看到任何跳转到那里的 sys_call(似乎 main() 的 baracks 在任何调用 alias_write 之前结束。
< br/>

/* Write NBYTES of BUF to FD.  Return the number written, or -1.  */
ssize_t
__libc_write (int fd, const void *buf, size_t nbytes)
{
if (nbytes == 0)
return 0;
if (fd < 0)
{
__set_errno (EBADF);
return -1;
}
if (buf == NULL)
{
__set_errno (EINVAL);
return -1;
}

__set_errno (ENOSYS);
return -1;
}
libc_hidden_def (__libc_write)
stub_warning (write)

weak_alias (__libc_write, __write)
libc_hidden_weak (__write)
weak_alias (__libc_write, write)
#include <stub-tag.h>

所以问题是:

  1. glibc 实际上在哪里调用 sys_write
  2. 如果 fd<0,glibc 不调用 sys_write 是真的吗?

最佳答案

I see in the glibc source code that it does check for fd>0 but i don't see any jump to the sys_call there

您正在查看错误的代码。

__libc_write有多种定义,在不同的条件下使用。您查看的那个在 io/write.c 中。

在 Linux 上实际使用的那个是从 sysdeps/unix/syscall-template.S 生成的,它确实实际执行即使在 fd==-1 等情况下也切换到内核模式(并返回用户模式)

关于linux - 是否每次调用 write 都会切换到内核模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48623453/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com