まず、「カーネル空間プロセス」というものはありません。カーネルはオペレーティングシステムが起動したときからずっとメモリ上にいて、シャットダウンまで終了しません。カーネルの外の、プロセスが起動したり終了したりしている部分を比喩的に「ユーザランド」などと呼びます (「ユーザ空間」でもいいです)。
で、ご提示の資料にはこう書いてあります。
ユーザランドのmallocやfreeのような関数がカーネル内に存在していて、それを提供するのがスラブアロケータです。カーネル空間でのmalloc, freeはそれぞれkmalloc, kfreeと呼ばれています。
スラブアロケータが用いられるのはカーネル内でのメモリ確保・解放のときだけです。カーネルのソースコードの中では、上の通りkmalloc, kfreeというCの関数として表されます。これらはカーネルの中でのみ呼び出されます。
いっぽう、これも上の通り、ユーザランドではプロセスの中でメモリ確保・解放のときにmalloc, freeというCの関数が呼び出されています。これらはCの標準ライブラリ (glibcなど) の中に含まれていて、プログラムをソースコードからコンパイルしたときにこのライブラリがリンクされるため、使えるようになります。
kmalloc, kfreeもmalloc, freeも、バディシステムからメモリブロック (最低でも4 kB) を割り当ててもらい、それを必要に応じて細かく分けて使用します。まったく必要なくなったブロックはバディシステムに返します。
カーネルとユーザランドで別の関数を使っている理由ですが、第一にカーネル空間のメモリ領域をユーザランドから完全に切り離したいということがあります。これによって、プロセスがカーネルの動作に干渉しようとしてもできなくなるので、オペレーティングシステムの安全性が保てます。第二にはカーネルとユーザランドのプロセスではメモリの使い方が違うため、それぞれの用途に合ったメモリ割り当て・解放のアルゴリズムを適用したいということがあります。
独自に実装したスラブアロケータをカーネルに組み込めるのと同様に、malloc, freeに代わるプログラム独自の関数を実装してそのプログラムのプロセス中で用いることもできます。かつてC標準ライブラリのmalloc, freeのアルゴリズムが洗練されていなかったときは、メモリの効率的な利用が性能に影響しやすいプログラムでそのような実装がよくされました。