Well FIRST, you need to understand Driver programming and programming kernel applications. Then hardware and Memory Management
A simple Memory Management questions always pops up when I program Drivers:
How to De-Allocate pages which have been allocated?
During Insertion of A USB stick the Driver Crashes how can I collected the Crash Dump?
Well, any good memory programmer would understand this.
Of course it is necessary to understand Assembly both x86 and x64 mostly becuase when programming Drivers sometimes hooking is required in order to gain more power over Kernel such as hooking any Zw* or NT* processes it is obvious that the first code should be MOV then should be JMP ; Must be Unconditional as we do not compare anything.
These are just the beginning but once Assembly and Hooking becomes simple all the other Programming in Kernel will become easy. Of course there are ways I know to hook kerenel processes from ring3 but I am not giving it away.