为什么系统调用的次数非常有限?
Why the number of system calls is very limited?
我正在玩 ioctl
,我想到了这个问题。
背景
- 有人告诉我系统调用的主要动机是允许的中断处理程序的数量非常有限。许多操作系统实现了系统调用的抽象(a.k.a.traps),它只占用一个中断号(
0x80
在 Linux 的情况下),但接受额外的参数来提供不同的功能需求。
- this thread 表明系统调用的次数实际上也非常有限,因此再次应用上述相同的推理来发明
ioctl
.
因此我的问题。为什么操作系统不提供足够的系统调用并摆脱 ioctl
? (或者仅仅是创建一个层次结构来提供更好的可扩展性?)
我对此的看法是,系统调用可以看作是操作系统内核向用户应用程序提供的一组服务,而 ioctl
只是这些服务中的一个,允许您发送自定义的命令特定设备(或驱动程序)。
在开发驱动程序时,您可以为传入的 ioctl
请求编写处理程序。通过实现自己的系统调用来管理同样的事情有几个缺点:
- 您的实现特定于您的驱动程序,其他组件可能不会使用它,
- 添加新的系统调用并不是那么容易 – 在 WIndows,由于 Patchguard(内核补丁保护),这实际上是不可能的,
- 在Windows上,内核可能会帮助您使用"validation"个I/O个IOCTL请求缓冲区,您在实现自己的系统调用时必须自己完成所有工作。
您可以将 ioctl
视为 read
和 write
的概括。可以提供输入和输出缓冲区,以及定义目标(通常是内核驱动程序)所需操作的控制代码。
我正在玩 ioctl
,我想到了这个问题。
背景
- 有人告诉我系统调用的主要动机是允许的中断处理程序的数量非常有限。许多操作系统实现了系统调用的抽象(a.k.a.traps),它只占用一个中断号(
0x80
在 Linux 的情况下),但接受额外的参数来提供不同的功能需求。 - this thread 表明系统调用的次数实际上也非常有限,因此再次应用上述相同的推理来发明
ioctl
.
因此我的问题。为什么操作系统不提供足够的系统调用并摆脱 ioctl
? (或者仅仅是创建一个层次结构来提供更好的可扩展性?)
我对此的看法是,系统调用可以看作是操作系统内核向用户应用程序提供的一组服务,而 ioctl
只是这些服务中的一个,允许您发送自定义的命令特定设备(或驱动程序)。
在开发驱动程序时,您可以为传入的 ioctl
请求编写处理程序。通过实现自己的系统调用来管理同样的事情有几个缺点:
- 您的实现特定于您的驱动程序,其他组件可能不会使用它,
- 添加新的系统调用并不是那么容易 – 在 WIndows,由于 Patchguard(内核补丁保护),这实际上是不可能的,
- 在Windows上,内核可能会帮助您使用"validation"个I/O个IOCTL请求缓冲区,您在实现自己的系统调用时必须自己完成所有工作。
您可以将 ioctl
视为 read
和 write
的概括。可以提供输入和输出缓冲区,以及定义目标(通常是内核驱动程序)所需操作的控制代码。