初识内核开发

什么是内核开发?

简介

一直想学习下内核开发,却找不到切入点,以及确切的应用方向(对于我的日常工作来说)。这两天,阅读了一些资料,对于内核开发有了大概的了解,写写我对于内核开发的认识。

什么是内核开发

Kernel(内核)是Linux操作系统的基石,是用户和硬件交互的中间人,用户所有的操作,最终都要反馈到硬件上,所以最基础的内核开发是写硬件驱动;然而,除此之外,内核还构建了一些虚拟层,比如KVM,eBPF和VFS等,这又是另一个层面的内核开发。

内核提供了操作系统所有的功能,通过syscall(系统调用)暴露出编程接口,和用户空间的库引用(静态编译和动态链接)不同,syscall有自己的调用方式;而且整个内核的运行时,一直在内存中,syscall的本质也是执行内存中的二进制代码,只不过调用方式不同。

所以内核没有神秘的地方,内核本质上就是一个大型软件,只不过大部分是驱动程序,以及基于基础功能做出的抽象虚拟层。

理解了这些,对于内核开发就不再需要畏惧了,接下来是在庞大的代码中找到切入点。

内核的功能和子系统

另外,了解下内核的功能和子系统,更有助于理解内核。

内核功能其实就是操作系统的功能,有两个方向的资料:

  1. Kernel Docs - Internal API manuals(业界的操作系统)
  2. 《操作系统导论》(学术上的操作系统)

内核有很多子系统,我认为其实是不同功能的代码集合,子系统有很多,除了常见的:

切入点

最直接的切入点就是去看Kernel源代码,但是这种对于我这样的新手来说,不太友好,想了想,可以先从学习使用Kernel API做起;在使用Kernel API的过程中,增进对于Kernel的理解,再去进一步看其具体实现。比如,可以先做一些内核模块编程。

总结

其实一直没有去做内核开发,是因为没有实际需求。

Linux下的工具生态非常完善,以至于随便一个需求,都能找到相关的工具,根本不用自己去开发;这些年,又有了eBPF,好像根本不再需要接触内核了。

以前,现学现卖Groovy,Ruby,Javascript,Lua等插件,几个小时解决问题,那是因为有明确的需求;现在学习Kernel开发,主要的需求是“想要学习”,需求和目标不明确,导致动力不足。

果然需求是第一生产力啊!

使用 Hugo 构建
主题 StackJimmy 设计