What all of these have in common is the C language (for now), the kernel coding style, the kernel data structures and algorithms (things like lists and locks, which serve as primitive building blocks for doing more advanced features), and the general layout of the kernel modules and subsystems within the codebase.
Personally I would recommend splitting your time between something you are trying to accomplish (perhaps adding a new syscall, or new hardware support), and general understanding of kernel development. So pick a goal and read about how to accomplish it (or read through code that was added that does that thing), and also read as much general information as you can (lWN, kernelnewbies, the LKML, etc.)
Picking a goal to accomplish doesn't have to be achievable, but doing the research will give you an anchor point for further context later.
I didn't like it personally but YMMV.