kebingungan dengan pointer dan memori virtual di C

Saya pikir pertanyaan saya sangat sederhana tetapi saya tidak dapat menemukan jawabannya. berdasarkan pemahaman saya tentang memori virtual:

setiap proses menerima ruang alamat yang berdekatan yang dipetakan ke memori fisik.

jadi, kode yang saya tulis di program saya harus dapat mengakses di mana saja di memori virtual yang diberikan padanya jadi saya menulis kode berikut di C yang memunculkan pengecualian tipe "pengecualian pelanggaran akses".

saya akan sangat menghargai jika seseorang menjelaskan alasannya kepada saya.

ini kodenya:

int* a = 1; // pointer to 1st block of memory
*a = 5; // set the content of pointer to 5, but throws exception

person SHM    schedule 25.02.2016    source sumber
comment
Anda tidak dapat menulis ke memori yang bukan milik Anda. Sebagian dari ruang alamat dicadangkan (tidak dipetakan)   -  person Mitch Wheat    schedule 25.02.2016
comment
Siapa bilang semua ingatanmu bisa ditulisi? Juga, menurut Anda mengapa hal itu tetap berdekatan?   -  person David Schwartz    schedule 25.02.2016
comment
every process receives a contiguous address space which is mapped to physical memory Ini adalah masalah OS, bergantung pada penanganan memorinya. following code in C which throws an exception Ini adalah masalah kode C. Standar C tidak mengetahui tentang OS tertentu yang mungkin Anda pikirkan, dan tidak dapat mengatasi bagian itu. Sejauh standar C berjalan, memori yang belum Anda peroleh dengan cara standar C (seperti malloc, atau mendefinisikan variabel) tidak ada untuk tujuan praktis, dan menyebabkan UB (perilaku tidak terdefinisi) jika diakses.   -  person dxiv    schedule 25.02.2016
comment
Baca halaman wiki tentang memori virtual, ruang alamat virtual, penunjuk, alias penunjuk, sistem operasi   -  person Basile Starynkevitch    schedule 25.02.2016


Jawaban (2)


Setiap proses menerima ruang alamat LOGIS yang berdekatan. Bukan ruang alamat VIRTUAL yang berdekatan.

HALAMAN logis dipetakan ke BINGKAI HALAMAN fisik.

Pemetaan logis dilakukan dengan menggunakan PAGE TABLE, yang berisi pemetaan dari halaman lokal ke bingkai halaman.

Namun, tabel halaman mungkin tidak memiliki pemetaan ke bingkai halaman untuk setiap halaman logis.

Ada dua alasan mengapa hal ini bisa terjadi. Pertama, sistem operasi tidak boleh (dan biasanya tidak) membuat entri tabel halaman yang mencakup seluruh ruang alamat. Parameter sistem atau kuota proses mungkin membatasi ukuran ruang alamat logis. Beberapa sistem juga mencadangkan rentang alamat karena tidak dapat digunakan.

Kedua, seseorang harus melakukan pemetaan halaman logis. Ini adalah proses dua langkah. (1) Seseorang (biasanya pemuat) harus menandai halaman logis sebagai valid. (2) sistem operasi harus memetakan halaman logis ke halaman fisik. Hal ini dilakukan ketika proses mengakses halaman logika valid yang tidak memiliki pemetaan, sehingga menyebabkan kesalahan halaman. (yaitu memori virtual—pemetaan ulang dinamis dari halaman logis yang valid ke bingkai halaman).

Entri tabel halaman dapat memiliki tiga status:

  1. Itu tidak valid
  2. Ini valid dan dipetakan ke bingkai halaman pemetaan
  3. Ini valid tetapi tidak memiliki pemetaan ke bingkai halaman fisik. (Sekali lagi, jika ada akses ke entri tabel halaman dalam keadaan ini, hal ini memicu PAGE FAULT yang menyebabkan sistem operasi membuat pemetaan ke bingkai halaman yang valid.)

Selama run time, aplikasi dapat memanggil layanan sistem untuk membuat halaman logis valid di ruang alamat logis.

Sebagai pemeriksaan keamanan untuk menangkap petunjuk yang menyimpang, sebagian besar sistem (biasanya diarahkan oleh linker) tidak memetakan halaman pertama sama sekali (namun, aplikasi biasanya dapat memetakan halaman tersebut melalui panggilan sistem). Milikmu:

 int *a = 1 ;

Menetapkan alamat "a" ke lokasi yang akan berada di halaman pertama, yang selalu tidak valid.

Milikmu

*a = 5 ;

menyebabkan prosesor (unit terjemahan memori) mengakses entri tabel halaman untuk halaman pertama. Di sana, prosesor menemukan bahwa entri tabel halaman ini ditandai sebagai tidak valid (yaitu, tidak ada kemungkinan pemetaan). Itu menyebabkan pelanggaran akses.

person user3344003    schedule 26.02.2016
comment
Bukankah alamat logis sama dengan alamat virtual? Kalau tidak, jawaban yang bagus. Bisa lebih baik lagi jika Anda menyebutkan bagaimana hubungannya dengan pertukaran halaman ke disk ketika memori fisik rendah. - person Joni; 27.02.2016
comment
Tidak, virtual dan logis adalah dua konsep yang terkait tetapi berbeda. - person user3344003; 27.02.2016

Seluruh ruang alamat tidak dipetakan ke memori fisik, hanya sebagian saja. Anda tidak dapat menggunakan alamat yang tidak dipetakan.

Biasanya beberapa bagian dari ruang alamat dicadangkan untuk sistem operasi. Bagian dari ruang alamat dapat dipetakan ke file, yang lain ke perangkat keras. Ide keseluruhan dari sistem memori "virtual" adalah Anda dapat menggunakan satu ruang alamat untuk merujuk ke banyak hal, yang juga berarti bahwa tidak semua alamat virtual "valid" sepanjang waktu.

person Joni    schedule 25.02.2016
comment
bagian apa itu? apakah anda mempunyai link untuk info lebih lanjut? - person SHM; 25.02.2016
comment
Menemukan pemetaan alamat bersifat spesifik untuk OS. Kernel Linux misalnya memaparkan info ini di /proc/self/maps. - person Joni; 25.02.2016