【问题标题】:What makes read() a syscall?是什么让 read() 成为系统调用?
【发布时间】:2015-11-02 01:50:11
【问题描述】:

以下链接说 read 是一个系统调用: What is the difference between read() and fread()?

现在,我试图了解是什么使 read 成为系统调用。

例如
我使用 Nuttx OS 并使用 open、close 和 ioctl 方法注册了一个设备结构 flash_dev(路径'/dev/flash0')。这是在 pesudo 文件系统中作为 inode 添加的,具有信号量支持以实现互斥。

现在,我从应用程序中打开 ('/dev/flash0') 并执行读取和 ioctls。
现在,上述过程中的哪个部分使 read 成为系统调用?

【问题讨论】:

  • 我不明白,为什么你认为read不是系统调用?
  • @YuHao 这段代码的哪一段在特权模式下执行?

标签: system-calls


【解决方案1】:

read() 函数是调用系统 IOW 以进行系统调用所需的任何指令的薄包装。当您调用 read()(并且 fread() 也调用它)时,相关的内核/驱动程序代码会被调用并执行从文件读取所需的任何操作。

【讨论】:

  • 重要的区别在于fread可能不涉及系统调用。如果它可以满足用户空间缓冲区之外的请求,则不会发生系统调用。 read,作为一个瘦包装器,总是执行系统调用,如果你做很多小的reads,这可能会很昂贵(对于大的reads,系统调用开销被 I/O 淹没开销和fread 无论如何都需要执行相同的系统调用)。
【解决方案2】:

系统调用是其功能几乎完全位于内核而不是用户空间中的调用。传统上,open()、read()、write() 等在内核中,而 fread()、fwrite() 等的代码在用户空间运行,根据需要调用内核。

例如,在 Linux 中,当您调用 read() 时,您的应用程序链接的标准库可能会执行以下操作:

   mov eax, 3          ;3 -> read
   mov ebx, 2          ;file id
   mov ecx, buffer  
   mov edx, 5          ;5 bytes 
   int 80h

就是这样——它只是接受您传入的参数并通过int 80h(中断)指令调用内核。作为应用程序程序员,调用是在用户空间、内核还是两者中运行通常并不重要。出于调试或性能原因,它可能很重要,但对于简单的应用程序来说,它真的无关紧要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-20
    • 1970-01-01
    • 2017-03-20
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多