KDOC 106: Linuxでアーキテクチャ名を調べる

この文書のステータス

  • 作成
    • 2024-02-26 貴島
  • レビュー
    • 2024-03-17 貴島

概要

Linuxでアーキテクチャ名を調べる方法。

uname -i
x86_64

これはLinuxカーネルのビルド時に決まるとのこと1UTS-MACHINE という定義でアーキテクチャの文字列が定義されるという。

何が起きているか

結局わからず。

実際、どこを参照しているのだろうか。本には具体的な場所の記載がなかったので調べる。

まずドキュメントを見るが記載はない。Ubuntu Manpage: uname - 現在稼働中のカーネルについての名前と情報を得る。そんな実装のことまでは書いてないだろうことは想像に難くない。

実際の場所を調べる。straceで見ると、unameシステムコールが発行されている↓。ので、システムコールの定義を見ればよいと考えた。

strace uname -i 2>&1 | tail
mmap(NULL, 6784496, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f6e037af000
close(3)                                = 0
uname({sysname="Linux", nodename="orange-ThinkPad-X1-Carbon-Gen-10", ...}) = 0 👈
newfstatat(1, "", {st_mode=S_IFIFO|0600, st_size=0, ...}, AT_EMPTY_PATH) = 0
write(1, "x86_64\n", 7x86_64
)                 = 7
close(1)                                = 0
close(2)                                = 0
exit_group(0)                           = ?
+++ exited with 0 +++

しかし、↓ソースコードを見てもよくわからない。別の関数まで辿らないといけない。uts_name()から返される構造体をコピーしているのか。uts_name()がどこで定義されているかわからない。

SYSCALL_DEFINE1(uname, struct old_utsname __user *, name)
{
        struct old_utsname tmp;

        if (!name)
                return -EFAULT;

        down_read(&uts_sem);
        memcpy(&tmp, utsname(), sizeof(tmp));
        up_read(&uts_sem);
        if (copy_to_user(name, &tmp, sizeof(tmp)))
                return -EFAULT;

        if (override_release(name->release, sizeof(name->release)))
                return -EFAULT;
        if (override_architecture(name))
                return -EFAULT;
        return 0;
}

動いているマシン上で、/proc/sys/kernel にunameで出るリリース日とか、アーキテクチャ名があるのを確認した。が、どう利用しているのかはわからない。/procはオンメモリ、動的なディレクトリなはずなのでそれを制御しているコードもどこかにあるはずだが。

関連

Footnotes: