为什么不是所有库函数都不是系统调用?

时间:2019-09-11 02:55:22

标签: linux kernel system-calls

因此,从我的基本OS类中,我了解到内核是与硬件交互的内核。因此,如果要与硬件交互,则需要调用系统调用。 open()是系统调用,而strlen()不是系统调用。但是任何指令或命令都必须与硬件交互,至少要增加程序计数器或修改内存的内容。因此,不是所有函数都应该在某个时候进行系统调用吗?

2 个答案:

答案 0 :(得分:0)

我强烈建议您阅读有关UNIX的早期论文,以及方法和原因。肯·汤普森(Ken Thompson)坚决主张内核只能由内核外部无法实现的部分组成。

当时;内核外部对应于计算机特权模式之外。在现代系统中,这是一个不太有趣的概念。仍在继续推动架构和设计。

简而言之; open()由内核导出,因为它必须:-访问内核专有的数据结构,因此是接口;内核不会导出strlen,因为它不是必须的,它既不需要特权也不需要访问其他数据结构。

不必是王牌;因为没有人想要内核中不必要的功能。

答案 1 :(得分:0)

  

内核是与硬件进行交互的人。

那是一个非常不准确的陈述。

以下程序甚至可以在没有操作系统(也没有优化的编译器...)的某些微控制器上运行,并且与硬件交互:

int array[8192];
void entry_point(void) {
    array[100] = 5+3;
}

有问题的硬件是“ CPU”,“内存总线”和“内存”。

虽然系统调用主要用于访问某些硬件(磁盘,网络等),但系统调用未定义为“访问硬件的调用”,而是仅定义为“内核API的调用”。

内核可以导出所需的任何API,包括strlen(),但对于OS设计人员(例如上述的Ken Thompson)来说,内核应该导出的API有助于存在多个程序,进程和/或用户。

这里主要关注的是对资源的访问,例如磁盘,网络,计时器,内存等,但还包括例如:

  • 计划/流程管理API(例如fork()exit()nice()sched_yield()调用)
  • 多进程管理(例如sigaction()kill()wait()futex()semop()
  • 性能和调试(例如ptrace()prlimit()getrusage()
  • 安全性(例如chmod()chown()setuid()seccomp()chroot()
  • 管理(例如init_module()sethostname()shutdown()