web-dev-qa-db-ja.com

mmapはx32ABIでどのように機能しますか?

Arch/x86/entry/syscalls/syscall_64.tblのLinux5.0-rc5ソースコードを調べていますが、x32 mmapに個別のシステムコール番号がないことがわかりました。

では、カーネルは、4GiBを超えるマップされたアドレスを提供しないように、ユーザースペースでx32ABIを使用していることをどのように認識しますか?

または、一般に、アドレスを返す可能性のあるシステムコールは、x32を使用していて、4GiBを超えるアドレスを返さないことをどのように認識しますか?

X32システムコールを作成したいプロセスは、システムコール番号にビットを設定します。これにより、カーネルがプロセスを区別できるようになります。

Syscall(2)のマンページから:

_[5] The x32 ABI uses the same instruction as the x86_64 ABI and  is
    used  on  the  same processors.  To differentiate between them,
    the bit mask __X32_SYSCALL_BIT is bitwise-ORed into the  system
    call  number  for  system calls under the x32 ABI.  Both system
    call tables are available though, so setting the bit is  not  a
    hard requirement.
_

x32は実際には独立した環境ではありません。 x32プログラムはx64システムコールを実行でき、その逆も可能です。これは、x64およびx32と並べてサポートすることもできるia32エミュレーションとは異なります。

そのビットは、カーネルでin_x32_syscall()関数を介してチェックされます。

_static inline bool in_x32_syscall(void)
{
#ifdef CONFIG_X86_X32_ABI
        if (task_pt_regs(current)->orig_ax & __X32_SYSCALL_BIT)
                return true;
#endif
        return false;
}
_

mmap()を実装するカーネルコードがチェックしている場所を見つけることは、読者の練習問題として残されています(難しいことではありません)。 x32バイナリのexecve()の場合、カーネルは保存されたRAXレジスタ(システムコール番号)に___X32_SYSCALL_BIT_自体を明示的に設定します。

4
Uncle Billy