Looking at the linux source code here it would appear that they implement the bulk of it in C with some macros to call some some small amount of assembly code needed to set interrupts and a few other things. I'm not sure exactly how they are setting the interrupts but it would appear that a minimal of the work is done in assembly. Even much of the architecture specific stuff is done in C as seen here. I can't imagine working at that level of complexity outside of a higher level language frankly either.
Not that my experience means anything but this is also how we did things when I took my operating systems class but frankly that's not telling of how a state of the art OS does things. Linux is a much better source of information.
So it looks like things are mostly done in C with a bare minimum done in assembly.