KDOC 106: Linuxでアーキテクチャ名を調べる
この文書のステータス
- 作成
- 2024-02-26 貴島
- レビュー
- 2024-03-17 貴島
何が起きているか
結局わからず。
実際、どこを参照しているのだろうか。本には具体的な場所の記載がなかったので調べる。
まずドキュメントを見るが記載はない。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()がどこで定義されているかわからない。
https://github.com/torvalds/linux/blob/1f874787ed9a2d78ed59cb21d0d90ac0178eceb0/kernel/sys.c#L1327-L1345
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はオンメモリ、動的なディレクトリなはずなのでそれを制御しているコードもどこかにあるはずだが。
関連
- KDOC 63: 『私はどのようにしてLinuxカーネルを学んだか』。を読んで、ここから知ろうと考えた