GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana CPU mengetahui alamat fisik mana yang dipetakan ke alamat virtual mana?

MMU mengakses tabel yang menjelaskan cara menerjemahkan alamat virtual ke alamat fisik. (Tidak perlu menerjemahkan alamat fisik ke alamat virtual, dan ini tidak mungkin dilakukan secara umum karena alamat fisik yang sama dapat diakses melalui beberapa alamat virtual atau tidak dapat dipetakan.) Tata letak tabel ini bergantung pada arsitektur CPU, tetapi prinsip umumnya selalu sama:ada register CPU yang berisi alamat fisik tabel, yang berisi alamat fisik tabel selanjutnya, dan seterusnya (untuk total 2 hingga 4 level pada arsitektur yang ada) hingga level tabel yang berisi alamat fisik tempat data berada. Pada setiap level, elemen tabel mana yang akan digunakan ditentukan oleh beberapa bit di alamat virtual.

MMU tidak tahu tentang proses sistem operasi seperti itu. Saat CPU beralih untuk menjalankan proses yang berbeda, yaitu saat terjadi peralihan konteks, tugas kode pengalihan konteks sistem operasi untuk memperbarui tabel MMU seperlunya. Dalam praktiknya, menurut saya semua sistem Unix menyimpan salinan tabel di memori untuk setiap proses, dan cukup perbarui register MMU untuk menunjuk ke tabel tingkat teratas untuk proses saat ini.

Sebenarnya ada bagian dari MMU yang peduli dengan proses sistem operasi:TLB. Mencari entri dalam tabel MMU agak mahal karena melibatkan banyak akses memori. TLB adalah cache dari pencarian ini. Pada sakelar konteks, sistem operasi harus membatalkan TLB (yaitu menghapus semua entri cache), karena pemetaan akan berbeda untuk proses baru. Banyak arsitektur mengizinkan OS untuk meletakkan indikator di setiap entri tabel MMU untuk mengatakan "entri ini milik proses N". Entri TLB kemudian dilewati jika nomor proses yang dikandungnya bukan nomor proses saat ini. Register CPU berisi nomor proses saat ini dan kode pengalih konteks memperbaruinya. Mekanisme ini berarti bahwa TLB dapat berisi informasi tentang banyak proses sekaligus, yang meningkatkan kinerja saat beralih bolak-balik di antara proses-proses ini. Karena bit yang tersedia untuk menyimpan N sering kali lebih sedikit daripada yang dibutuhkan untuk menyimpan semua ID proses OS, N bukanlah ID proses, tetapi angka yang dihasilkan oleh OS untuk tujuan ini dan yang berubah seiring waktu, jika digunakan sama sekali.


Di Linux, kernel mempertahankan tabel halaman tiga tingkat (terlepas dari kemampuan CPU). Level teratas adalah direktori global halaman, dan setiap proses memiliki direktorinya sendiri, pgd dalam mm_struct . Jadi, setiap proses dapat memiliki pemetaannya sendiri, jadi alamat 12345 dalam proses yang berbeda menunjuk ke alamat fisik yang berbeda.

CPU tidak terlalu mengetahui proses, tetapi mereka cenderung memiliki fitur untuk mendukungnya. Pada CPU bergaya x86, ada berbagai fitur terkait tugas, tetapi sebenarnya cenderung diabaikan. Karena penjadwalan proses dikelola oleh kernel, itu dapat melacak perubahan tabel halaman itu sendiri, dan memperbarui status CPU apa pun yang diperlukan untuk beralih ke tabel halaman proses baru saat beralih tugas. Pada PC x86, itu melibatkan pembaruan register kontrol CR3 yang mengarah ke direktori halaman.

Bab Manajemen Tabel Halaman dalam Memahami Manajer Memori Virtual Linux Mel Gorman buku memberikan ikhtisar yang bagus.


Linux
  1. Bagaimana Cara Kerja Sticky Bit?

  2. Linux – Bagaimana Pembunuh Oom Memutuskan Proses Mana Yang Harus Dibunuh Pertama?

  3. Bagaimana Mengidentifikasi Proses Yang Tidak Memiliki Pid?

  1. Cara Membatasi Penggunaan CPU Suatu Proses Di Linux

  2. Bagaimana cara menghitung penggunaan CPU dari suatu proses oleh PID di Linux dari C?

  3. Bagaimana cara kerja copy_from_user dari kernel Linux secara internal?

  1. Bagaimana Cara Kerja Perintah Tee??

  2. Bagaimana systemd menangani kematian anak dari proses yang dikelola?

  3. Bagaimana cara Linux mempertahankan kendali CPU pada mesin single-core?