User Mode Linux
当初は、tt モード(tracing thread mode)と名付けたモードで動いていて、ゲストの全てのプロセスが単一のメモリアドレス空間で動いていた。その後、2002年に skas3 モードという、ちゃんとプロセスごとに別のメモリアドレス空間に分かれているモードが作られたが、ホスト側の Linux カーネルにパッチが必要で、/proc/mm, PTRACE_FAULTINFO, PTRACE_LDT の3つが必要だが、Linus に拒否され、Linux のメインラインに加えてもらえなかった。その後、2005年に Linux 2.6.13 から、ホスト側の Linux カーネルにパッチを当てることなく、ちゃんとプロセスごとにメモリ空間が分かれている skas0 が開発され、現在は、この skas0 のみが UML ではサポートされている。skas0 では、各プロセスの番地 0x100000 に 8KB 分のメモリ領域を確保し、そこにプログラムとデータを置き、そこから各プロセスの権限で Linux システムコールを呼び出している。
skas0 で 0x100000 に置いたプログラムを実行するにあたり、ptrace でゲストプロセスを一度止め、呼び出したいシステムコールなどの情報をセットし、EIP レジスタを含め全てのレジスタを書き換えて、いきなり 0x100000 に置いたプログラムの場所からゲストプロセスを再開し、システムコール呼び出しなど必要な処理をした後、そのプログラムの最後の所に int3 を置き、ptrace のブレークポイントとして SIGTRAP を発生させ、UML 側に制御を戻す形で実現している。
UMLのカーネルは、通常配布されているLinuxカーネルに、ビルド時に ARCH=um を指定することで作成可能である。カーネル(ファイル名"linux")とモジュールが作成される。このファイル(linux)を実行すると、UMLが起動する。