You can write an OS kernel in more or less any language you like.
There are a few reasons to prefer C, however.
- It is a simple language! There's very little magic. You can reason about the machinecode the compiler will generate from your source code without too much difficulty.
- It tends to be quite fast.
- There's not much of a required runtime; there's minimal effort needed to port that to a new system.
- There are lots of decent compilers available that target many many different CPU and system architectures.
By contrast, C++ is potentially a very complex language which involves an awful lot of magic being done to translate your increasingly high-level OOP code into machine code. It is harder to reason about the generated machine code, and when you need to start debugging your panicky kernel or flaky device driver the complexities of your OOP abstractions will start becoming extremely irritating... especially if you have to do it via user-unfriendly debug ports into the target system.
Incidentally, Linus is not the only OS developer to have strong opinions on systems programming languages; Theo de Raadt of OpenBSD has made a few choice quotes on the matter too.