GNU/Linux >> Belajar Linux >  >> Linux

Apa Yang Terjadi Saat Saya Menjalankan Perintah Cat /proc/cpuinfo?

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:

  1. proc(5) halaman manual;
  2. /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.

Terkait:Opsi -F untuk ls?

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 oleh proc_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 itu proc_clear_refs_operations struktur mendefinisikan clear_refs_write fungsi tetapi tidak ada fungsi baca.
  • cwd adalah tautan simbolik (sedikit ajaib), dideklarasikan oleh proc_cwd_link , yang mencari direktori proses saat ini dan mengembalikannya sebagai konten tautan.
  • fd adalah subdirektori. Operasi pada direktori itu sendiri didefinisikan dalam proc_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.


Linux
  1. Bagaimana cara mendapatkan jalur proses di Unix / Linux

  2. Apa yang setara dengan /proc/cpuinfo di FreeBSD v8.1?

  3. /proc/[pid]/pagemaps dan /proc/[pid]/maps | linux

  1. Bagaimana cara mendapatkan jumlah CPU/core di Linux dari baris perintah?

  2. Apa perbedaan antara /tmp dan /run?

  3. Apa itu anon_inode dalam keluaran ls -l /proc/[PID]/fd?

  1. Apa gunanya Perintah ‘/usr/bin/[‘ [Square Bracket] di Linux?

  2. Linux – Apa Arti Bendera di /proc/cpuinfo?

  3. Apa yang Terjadi Saat Saya Mengeksekusi File Di Shell?