简介
一直想学习下内核开发,却找不到切入点,以及确切的应用方向(对于我的日常工作来说)。这两天,阅读了一些资料,对于内核开发有了大概的了解,写写我对于内核开发的认识。
什么是内核开发
Kernel(内核)是Linux操作系统的基石,是用户和硬件交互的中间人,用户所有的操作,最终都要反馈到硬件上,所以最基础的内核开发是写硬件驱动;然而,除此之外,内核还构建了一些虚拟层,比如KVM,eBPF和VFS等,这又是另一个层面的内核开发。
内核提供了操作系统所有的功能,通过syscall(系统调用)暴露出编程接口,和用户空间的库引用(静态编译和动态链接)不同,syscall有自己的调用方式;而且整个内核的运行时,一直在内存中,syscall的本质也是执行内存中的二进制代码,只不过调用方式不同。
所以内核没有神秘的地方,内核本质上就是一个大型软件,只不过大部分是驱动程序,以及基于基础功能做出的抽象虚拟层。
理解了这些,对于内核开发就不再需要畏惧了,接下来是在庞大的代码中找到切入点。
内核的功能和子系统
另外,了解下内核的功能和子系统,更有助于理解内核。
内核功能其实就是操作系统的功能,有两个方向的资料:
- Kernel Docs - Internal API manuals(业界的操作系统)
- 《操作系统导论》(学术上的操作系统)
内核有很多子系统,我认为其实是不同功能的代码集合,子系统有很多,除了常见的:
- Process Scheduler
- MMU
- VFS
- Networking Unit
- IPC 除了这些,其他的可以在Kernel subsystem documentation中找到。
切入点
最直接的切入点就是去看Kernel源代码,但是这种对于我这样的新手来说,不太友好,想了想,可以先从学习使用Kernel API做起;在使用Kernel API的过程中,增进对于Kernel的理解,再去进一步看其具体实现。比如,可以先做一些内核模块编程。
总结
其实一直没有去做内核开发,是因为没有实际需求。
Linux下的工具生态非常完善,以至于随便一个需求,都能找到相关的工具,根本不用自己去开发;这些年,又有了eBPF,好像根本不再需要接触内核了。
以前,现学现卖Groovy,Ruby,Javascript,Lua等插件,几个小时解决问题,那是因为有明确的需求;现在学习Kernel开发,主要的需求是“想要学习”,需求和目标不明确,导致动力不足。
果然需求是第一生产力啊!