Apa yang terjadi ketika saya menulis cat /proc/cpuinfo
. Apakah itu pipa bernama (atau yang lain) ke OS yang membaca info CPU dengan cepat dan menghasilkan teks itu setiap kali saya memanggilnya?
Jawaban yang Diterima:
Setiap kali Anda membaca file di bawah /proc
, ini memanggil beberapa kode di kernel yang menghitung teks untuk dibaca sebagai konten file. Fakta bahwa konten dibuat dengan cepat menjelaskan mengapa hampir semua file memiliki waktu yang dilaporkan seperti sekarang dan ukurannya dilaporkan sebagai 0 — di sini Anda harus membaca 0 sebagai “tidak tahu”. Tidak seperti sistem file biasa, sistem file yang dipasang di /proc
, yang disebut procfs, tidak memuat data dari disk atau media penyimpanan lain (seperti FAT, ext2, zfs, ...) atau melalui jaringan (seperti NFS, Samba, ...) dan tidak memanggil kode pengguna (tidak seperti FUSE ).
Procfs hadir di sebagian besar unix non-BSD. Ini memulai hidupnya di AT&T's Bell Labs di UNIX 8th edition sebagai cara untuk melaporkan informasi tentang proses (dan ps
sering kali merupakan pencetak yang cantik untuk informasi yang dibaca melalui /proc
). Sebagian besar implementasi procfs memiliki file atau direktori bernama /proc/123
untuk melaporkan informasi tentang proses dengan PID 123. Linux memperluas sistem file proc dengan lebih banyak entri yang melaporkan status sistem, termasuk contoh /proc/cpuinfo
Anda .
Di masa lalu, /proc
Linux Linux memperoleh berbagai file yang memberikan informasi tentang driver, tetapi penggunaan ini sekarang tidak digunakan lagi karena /sys
, dan /proc
sekarang berkembang perlahan. Entri seperti /proc/bus
dan /proc/fs/ext4
tetap di tempatnya untuk kompatibilitas mundur, tetapi antarmuka serupa yang lebih baru dibuat di bawah /sys
. Dalam jawaban ini, saya akan fokus pada Linux.
Titik masuk pertama dan kedua Anda untuk dokumentasi tentang /proc
di Linux adalah:
proc(5)
halaman manual;/proc
sistem file di dokumentasi kernel .
Titik masuk ketiga Anda, ketika dokumentasi tidak mencakupnya, adalah membaca sumbernya . Anda dapat mengunduh sumbernya di mesin Anda, tetapi ini adalah program yang sangat besar, dan LXR, referensi silang Linux, sangat membantu. (Ada banyak varian LXR; yang berjalan di lxr.linux.no
adalah yang terbaik sejauh ini tetapi sayangnya situs ini sering down.) Sedikit pengetahuan tentang C diperlukan, tetapi Anda tidak perlu menjadi programmer untuk melacak nilai misterius.
Penanganan inti /proc
entri ada di fs/proc
direktori. Setiap pengemudi dapat mendaftarkan entri di /proc
(meskipun seperti yang ditunjukkan di atas, ini sekarang tidak digunakan lagi karena /sys
), jadi jika Anda tidak menemukan yang Anda cari di fs/proc
, lihat di tempat lain. Fungsi pemanggilan driver dideklarasikan di include/linux/proc_fs.h
. Versi kernel hingga 3.9 menyediakan fungsi create_proc_entry
dan beberapa pembungkus (terutama create_proc_read_entry
), dan kernel versi 3.10 ke atas hanya menyediakan proc_create
dan proc_create_data
(dan beberapa lagi).
Mengambil /proc/cpuinfo
sebagai contoh, pencarian untuk "cpuinfo"
mengarahkan Anda ke panggilan ke proc_create("cpuinfo, …")
di fs/proc/cpuinfo.c
. Anda dapat melihat bahwa kodenya cukup banyak kode boilerplate:karena sebagian besar file di bawah /proc
hanya membuang beberapa data teks, ada fungsi pembantu untuk melakukan itu. Hanya ada seq_operations
struktur, dan daging asli ada di cpuinfo_op
struktur data, yang bergantung pada arsitektur, biasanya didefinisikan di arch/<architecture>/kernel/setup.c
(atau terkadang file yang berbeda). Mengambil x86 sebagai contoh, kita diarahkan ke arch/x86/kernel/cpu/proc.c
. Di sana fungsi utamanya adalah show_cpuinfo
, yang mencetak konten file yang diinginkan; infrastruktur lainnya tersedia untuk memasukkan data ke proses membaca dengan kecepatan yang diminta. Anda dapat melihat data yang dikumpulkan dengan cepat dari data dalam berbagai variabel di kernel, termasuk beberapa angka yang dihitung dengan cepat seperti frekuensi CPU.
Sebagian besar /proc
adalah informasi per-proses di /proc/<PID>
. Entri ini terdaftar di fs/proc/base.c
, di tgid_base_stuff
Himpunan; beberapa fungsi yang terdaftar di sini didefinisikan dalam file lain. Mari kita lihat beberapa contoh bagaimana entri ini dibuat:
cmdline
dihasilkan olehproc_pid_cmdline
dalam file yang sama. Ini menempatkan data te dalam proses dan mencetaknya.clear_refs
, tidak seperti entri yang telah kita lihat sejauh ini, dapat ditulis tetapi tidak dapat dibaca. Oleh karena ituproc_clear_refs_operations
struktur mendefinisikanclear_refs_write
fungsi tetapi tidak ada fungsi baca.cwd
adalah tautan simbolik (sedikit ajaib), dideklarasikan olehproc_cwd_link
, yang mencari direktori proses saat ini dan mengembalikannya sebagai konten tautan.fd
adalah subdirektori. Operasi pada direktori itu sendiri didefinisikan dalamproc_fd_operations
struktur data (mereka adalah boilerplate kecuali untuk fungsi yang menghitung entri,proc_readfd
, yang menghitung file proses yang terbuka) saat operasi pada entri berada di `proc_fd_inode_operations.
Area penting lainnya dari /proc
adalah /proc/sys
, yang merupakan antarmuka langsung ke sysctl
. Membaca dari entri dalam hierarki ini mengembalikan nilai nilai sysctl yang sesuai, dan menulis menetapkan nilai sysctl. Titik masuk untuk sysctl ada di fs/proc/proc_sysctl.c
. Sysctls memiliki sistem registrasi sendiri dengan register_sysctl
dan teman-teman.