I gave a talk at LinuxCon Europe in Dusseldorf last year with the main goal being to show people how easy it is to start with Linux kernel development. Despite my fear that the audience might be too advanced and find this topic rather boring I received good feedback with several opinions that these kind of guidelines and advice are more than welcome. Now, since the room capacity was about 30 people, which is not really much, I have the impression that there are more folks out there who would enjoy this topic. Therefore I decided to form the presentation into a series of articles. (See the full presentation at Events.LinuxFoundation.org.)
These articles, similar to the talk, will be divided into three parts. In the first, not really technical article, I will explain that Linux kernel development is super easy especially for those who possess the right attitude. In the second part I'm going to show where to get inspiration and the best angles to approach Linux kernel development for newcomers. And in the third and last part, I will describe some of the things that I wish that I knew before I started.
For some reason there is a group of negative opinions or myths describing either Linux kernel programming itself or the effort required to become a Linux kernel developer. In particular these are:
- Linux Kernel programming is hard and requires special skills.
- Linux Kernel programming requires access to special hardware.
- Linux Kernel programming is pointless because all of the drivers have already been written.
- Linux Kernel programming is time consuming.
Let's put more detail into this way of thinking:
Myth #1: The Linux Kernel programming is hard and requires special skills.
This thinking comes from the fact that many people, especially without proper knowledge of the kernel internals tend to view the the whole project as one big blob of code, effectively an operating system itself. Now, we all know that writing the operating system is a damn hard job and requires deep understanding of quite a number of different topics. Usually this is not just a hobby ;) but something that you are well prepared for. Looking at the top-level Linux kernel developers does not help either because all of them have many years of experience and judging your own skills using them as a reference leads one to believe that special skills are in fact required.
Myth #2: Linux Kernel programming requires access to a special hardware.
Jim Zemlin, who is the executive director of the Linux Foundation, said during his LinuxCon keynote that open source software is running on 80 percent of electronic devices. The Linux kernel, as the biggest open source project ever, gets more than a huge bite of this cake. In fact this is the most portable software of this size ever created and it supports an insane number of different hardware configurations. With this in mind one might get the impression that working on the kernel is about running it on different kinds of devices and since the most popular are already supported a successful developer needs to have access to all sorts of odd hardware.
Myth #3: Linux Kernel programming is pointless because all of the drivers have already been written.
The very popular impression of Linux kernel programming is writing drivers for various kind of peripheral devices. This is in fact the way that many professional kernel hackers nowadays have started their Linux carers. However, with the portability that the kernel offers it may seem that it is hard to find unsupported devices. Naturally we could look at the USB devices landscape as here we have the majority of peripherals, however most of those are either already supported or it is better to use the libusb and solve the problem from the user space, thus no kernel work.
Myth #4: Linux Kernel programming is time consuming.
While reading the LKML or any other kernel-related mailing list such as the driverdevel list it is easy to notice that the number of patches sent weekly is significant. For instance the work on the comedi drivers generates sets with many patches in it. It clearly shows that someone is working really hard out there and the comedi is not alone as an example. For people for whom kernel development is going to be a hobby, not a daily job, this might be off-putting as they could feel that they just cannot keep up the pace with that kind of speed of development.
These either alone or accumulated can draw a solid, thick line between trying Linux kernel development and letting it go. This is especially true for the less experienced individuals who therefore may fear trying, however the truth is that, to quote Dante, “the devil is not as black as he is painted.” All of these myths can be taken down so let's do it one by one:
Fact: Linux Kernel programming is fairly easy.
One can view the kernel code as a single blob with rather high complexity, however this blob is highly modularized. Yes, some of the modules are really hardcore (like scheduler), however there are areas of less complexity and the truth is that in order to do very simple maintenance tasks the required skill is a decent knowledge of C.
Not everyone has to redesign kernel core modules, there is plenty of other work that needs to be done. For example, the very popular newbie task is to improve the code quality by fixing either the code style issues or compiler warnings.
Fact: Special hardware is not required.
Well, the old x86 is still good enough to do some parts of the work and since this architecture is still quite popular I would say that it is more than enough for most people. Those who seek more can buy one of the cheap ARM-based boards such as PandaBoard, BeagleBone or RaspberryPi.
Fact: It is not pointless, there is still work to be done.
The first thing to know is that the Linux kernel is not only about the drivers but also the core code which needs to be taken care of. Second there is still a vast amount of drivers to be completed and help in this area is more than appreciated.
Fact: It does not have to be time consuming.
Whoever works on the kernel allocates as much time as he or she wants. The people who do it out of passion, aside from their daily duties, use a few evenings a week and they still contribute. I started contributing during the period where I run every second day (evening), I still did a complete renovation of part of my apartment, I went for holidays, and I watched almost every game during the World Cup 2014 and World Volleyball Championship 2014. There was not much time left for kernel stuff and still I succeeded in sending a few patches.
The important thing to remember is that unless you are paid for it there is no pressure and no hurry so take it easy and do as much as you can.
A New Mindset
In this first installment of a series aimed at encouraging people to do kernel programming. I introduced a complete change of mindset by explaining that what might have seemed hard is in fact fairly easy to do. Just remember that:
- Linux kernel programming is fairly easy.
- It is not required to have access to special hardware.
- There is still a lot of work to be done.
- You can allocate as much time as you want and as you can.
Armed with this knowledge we are ready for the next part which will give insight into what could be your starting point in Linux kernel development.
This blog is republished with permission from Zapalowicz.pl.
Read part 2 at Three Ways for Beginners to Contribute to the Linux Kernel
Konrad Zapalowicz is a software developer at Cybercom Poland, a new Linux kernel contributor and a runner. You can reach him at zapalowicz.pl.