Ukuran memori untuk operasi kernel mmap

9

Saya tertarik dengan cara Linux memasukkan file ke memori utama (dalam konteks saya untuk dieksekusi, tapi saya kira proses mmap sama untuk menulis dan membaca juga) dan ukuran mana yang digunakan.

Jadi saya tahu Linux menggunakan paging dengan pageize biasanya 4kB (di mana di kernel saya dapat menemukan ukuran ini?). Tapi apa sebenarnya artinya ini untuk memori yang dialokasikan: Asumsikan Anda memiliki ukuran biner dari beberapa byte byte, katakan saja 5812B dan Anda jalankan. Apa yang terjadi di kernel: Apakah ia mengalokasikan 2 * 4kB dan kemudian menyalin 5812B ke dalam ruang ini, membuang> 3KB memori utama di halaman ke-2?

Akan lebih bagus jika ada yang tahu file di sumber kernel di mana ukuran halaman didefinisikan.

Pertanyaan ke-2 saya juga sangat sederhana, saya kira: Saya menganggap 5812B sebagai filesize. Benarkah ukuran ini hanya diambil dari inode?

Rui F Ribeiro
sumber

Jawaban:

6

Tidak ada hubungan langsung antara ukuran yang dapat dieksekusi dan ukuran dalam memori. Berikut ini ikhtisar yang sangat cepat tentang apa yang terjadi ketika biner dijalankan:

  1. Kernel mem-parsing file dan memecahnya menjadi beberapa bagian. Beberapa bagian langsung dimuat ke memori, di halaman terpisah. Beberapa bagian tidak dimuat sama sekali (misalnya simbol debugging).
  2. Jika executable terhubung secara dinamis, kernel memanggil loader dinamis, dan itu memuat pustaka bersama yang diperlukan dan melakukan edisi tautan seperti yang diperlukan.
  3. Program mulai mengeksekusi kodenya, dan biasanya akan meminta lebih banyak memori untuk menyimpan data.

Untuk informasi lebih lanjut tentang format yang dapat dieksekusi, menautkan, dan memuat yang dapat dieksekusi, Anda dapat membaca Linker dan Loader oleh John R. Levine .

Dalam executable 5kB, kemungkinan semuanya adalah kode atau data yang perlu dimuat ke dalam memori kecuali untuk header. Kode yang dapat dieksekusi akan menjadi setidaknya satu halaman, mungkin dua, dan kemudian akan ada setidaknya satu halaman untuk stack, mungkin satu halaman atau untuk heap (data lain), ditambah memori yang digunakan oleh perpustakaan bersama.

Di Linux, Anda dapat memeriksa pemetaan memori untuk dieksekusi bersama cat /proc/$pid/maps. Formatnya didokumentasikan di proc(5)halaman manual; lihat juga Memahami Linux / proc / id / maps .

Gilles 'SANGAT berhenti menjadi jahat'
sumber
0

Ya: Anda akhirnya mendapatkan dua halaman 4k. Data dimuat saat diminta, jadi jika tidak ada yang merujuk ke halaman kedua itu tidak akan pernah dimuat ke dalam memori.

include/asm-i386/param.h:#define EXEC_PAGESIZE  4096
include/asm-i386/elf.h:#define ELF_EXEC_PAGESIZE        4096

Jangan mengubah nilai-nilai ini dan mengharapkan sesuatu bekerja.

Ya, ukuran file disimpan di inode di ext2 / 3.

pjc50
sumber
0

Untuk bagian definisi, pada kernel 2.6.38 ~ ish untuk arsitektur Intel:

arch / x86 / include / asm / page_types.h:

/ * PAGE_SHIFT menentukan ukuran halaman * /

#define PAGE_SHIFT 12

#define PAGE_SIZE (_AC (1, UL) << PAGE_SHIFT)

Frederik Deweerdt
sumber