Não existe uma "função de kernel", a menos que você queira this .
umask (2) é uma chamada de sistema . E foi assim desde o início dos tempos [1].
Mas não tem que ser assim - você pode implementá-lo fazendo com que o bitmask real seja parte de um pedaço de memória que é sempre mapeado no mesmo endereço e preservado através do execve (2), e tenha a abertura (2), creat (2), etc., os wrappers userland pegam a partir daí. Isso seria apenas como compatível com POSIX.
[1] na implementação original, o campo u.u_cmask
que a função define só é usado em um único lugar em outro lugar - no "Criar um novo arquivo" maknode () .