Linux etlink机制总结
1.为何我认为netlink要比procfs和sysfs更好?
答曰:基于文件系统的方案好处在于文件系统是“设置即所见”,缺点也正在于这种所见即所得的特性 ,由于文件系统的管理目前是基于用户的,就算为sysfs/procfs设置了了内核访问策略,这种策略也会复杂的让人望而却步!管理员A希望为内核增加1000个配置,她使用了sysfs,管理员B希望在sysfs中查一个信息,他ls了一下,这要比xxx --help好用很多,然而“我的天啊,1000多个个文件,哪个是我想要的啊!?”,于是这增加了和管理员A约会的机会...管理员A最终仅仅告诉了管理员B,使用sysfs比使用ioctl更好,避免了污染内核,然而netlink要比sysfs更好,避免了污染文件系统...
2.netlink机制和系统调用相比呢?
答曰:如果我非要说每个用户态和内核态通信的接口都是一个门(gate)的话(毕竟用户进程不能随意访问特权级别的内核态,必须通过门),那么每一个系统调用就是一个门,这么多扇门,将用户态和内核态之间的界面堵得丑陋无比。一扇门就是一个硬编码,更改很不灵活...真的是这样吗?不是!这么理解是错的,因为系统调用是一个统一的接口,各个不同的系统调用使用“系统调用号”来区分,在32位的x86的linux上,统一使用int 0x80进入,然后在内核中进行再分发,系统调用号在这里就是消息体的一部分,这个和netlink的设计完全一致。我强调netlink更具优势原因在于,它便于实现异步操作,因为发起者和执行者并不在一个进程空间,一切完全基于消息!
3.netlink和ioctl再PK一下
答曰:没有这个必要了,污染是从上至下的,沉淀越深,越不容易降解! 起初,ioctl的设计就是为了避免增加系统调用,于是统一设计了一个ioctl入口。ioctl避免了增加系统调用,将对内核的更改压缩到了一个固定的地方,也就是ioctl的分发代码,然后进一步,不想修改内核代码了,于是进一步压缩,将修改压缩到了每一个模块,但是为了绕开ioctl,因此它导出了文件系统接口,一切问题解决了,然而却污染了文件系统,最终,netlink来了,一切基于消息!这是个压缩的过程!
4.使用sysfs比使用ioctl更好,避免了污染内核,然而netlink要比sysfs更好,避免了污染文件系统...netlink将一切控制逻辑封装在了消息中,它什么也没有污染,消息去了就去了,来了就来了,从不保留,哪里也不保留,它是纯软的,然而它污染了我们的大脑,我们必须自己封装消息!在如此的高层次体现PCIe的精神是否有必要还值得讨论。
5.关于IPC
标准的inet套接字就能实现,而且是inet套接字设计的初衷,然而netlink套接字更好用,而且还可以实现多点到多点传输任意消息 。