ioctl() vs unlocked_ioctl() vs compact_ioctl()
本文主要记录下ioctl() 、 unlocked_ioctl() 和 compact_ioctl()的区别与联系。
可先看完linux ioctl()函数详解再看本文。
ioctl()
is one of the remaining parts of the kernel which runs under the Big Kernel Lock (BKL). In the past, the usage of the BKL has made it possible for long-running ioctl()
methods to create long latencies for unrelated processes.
Follows an explanation of the patch that introduced unlocked_ioctl
and compat_ioctl
into 2.6.11. The removal of the ioctl
field happened a lot later, in 2.6.36.
Explanation: When ioctl
was executed, it took the Big Kernel Lock (BKL), so nothing else could execute at the same time. This is very bad on a multiprocessor machine, so there was a big effort to get rid of the BKL. First, unlocked_ioctl
was introduced. It lets each driver writer choose what lock to use instead. This can be difficult, so there was a period of transition during which old drivers still worked (using ioctl
) but new drivers could use the improved interface (unlocked_ioctl
). Eventually all drivers were converted and ioctl
could be removed.
compat_ioctl
is actually unrelated, even though it was added at the same time. Its purpose is to allow 32-bit userland programs to make ioctl
calls on a 64-bit kernel. The meaning of the last argument to ioctl
depends on the driver, so there is no way to do a driver-independent conversion.
参考资料: