A excepcion de los modulos de modo Kernel (normalmente llamados drivers) y el propio S.O. todo el resto del codigo trabaja en modo Usuario, eso incluye a todos los programas y servicios/demonios. La interfaz de los servicios de Windows y Linux son diferentes (tienen diferentes numeros, diferentes parametros, etc.), el codigo siempre sera ensamblador, por ejemplo en Windows existe la interrupcion 2Eh y en Linux la 80h, cuando llamas a la interrupcion el S.O. la maneja y llama al servicio correspondiente que ya esta cargado en memoria. Es la misma logica (con otros detalles claro) que cuando haces un jmp o un call.
Siempre es codigo assembly, en cualquier lenguaje que uses, de alto o bajo nivel finalmente terminara llamando al S.O., en assembly podras ver detalles de bajo nivel como el pasaje de parametros y en C no por ejemplo:
push 5
call Sleep
Sleep(5);
Tampoco podes tener el control con lenguajes de alto nivel, es una cuestion de proteccion del S.O. unicamente.