GNU/Linux >> Belajar Linux >  >> Linux

Tata letak memori program di linux

jika saya memiliki larik yang dialokasikan pada tumpukan, penunjuk ke elemen pertama juga akan lebih rendah> nilainya daripada penunjuk ke elemen kedua?

Tidak penting "bagaimana" Anda mengalokasikan larik, Anda dapat menambah atau mengurangi penunjuk tumpukan, tetapi sebagai hasilnya Anda memiliki ruang alamat yang dicadangkan untuk larik.

Anda dapat bekerja dengan mereka dengan cara biasa, karena alamat terendah dicadangkan untuk elemen 0.

jadi pertanyaan saya adalah apa tata letak memori yang benar untuk suatu proses di Linux?

Anda bisa memeriksanya sendiri. Masukkan suatu tempat ke dalam program Anda seperti std::cin.get() untuk menjeda program Anda.

Kemudian jalankan di shell terpisah:

ps aux | grep your_program_name
cat /proc/<pid show by grep>/maps 

Ini mencetak pemetaan memori dari proses Anda, di mana Anda dapat melihat di mana tumpukan, tumpukan, dan hal-hal lain ditempatkan di memori.

Tentang tumpukan:anggap saja Anda memiliki mesin biasa dengan Linux dan Intel atau AMD 64 bit CPU. Kemudian tulis kode berikut:

extern void f(int);

void g(int param)
{
    f(param);
}

kompilasi dan bongkar:

g++ -ggdb -c test_my_stack.cc  && objdump -S test_my_stack.o

Anda dapat melihat (detail yang tidak penting dihapus):

 void g(int param)
 {
 0:   55                      push   %rbp
 1:   48 89 e5                mov    %rsp,%rbp
 4:   48 83 ec 10             sub    $0x10,%rsp
 8:   89 7d fc                mov    %edi,-0x4(%rbp)
    f(param);
 b:   8b 45 fc                mov    -0x4(%rbp),%eax

seperti yang Anda lihat di sub $0x10,%rsp kami memesan ruang di tumpukan dengan mengurangi (memindahkan ke bawah) penunjuk tumpukan.


Hal pertama yang mengganggu saya dengan gambar itu adalah bahwa jika heap tumbuh dari tinggi ke rendah maka jika saya mengalokasikan sebuah array di heap, bukankah seharusnya pointer ke elemen kedua lebih kecil dalam nilai int daripada pointer ke elemen pertama? yang akan membingungkan

Sama sekali tidak. Katakanlah Anda mengalokasikan array 10 byte dari kumpulan memori yang tumbuh dari tinggi ke rendah. Yang harus dilakukan oleh pengalokasi adalah mengurangi "bagian bawah" dari kumpulan memori itu sebesar 10, kemudian menggunakan nilai itu sebagai awal dari larik yang dialokasikan. Array kemudian akan berakhir di "bawah" yang lama. Aritmatika pointer akan tetap berfungsi seperti yang diharapkan, tetapi Anda akan "berkembang" menuju alamat rendah.


Linux
  1. Cara Menghapus Cache Memori di Linux

  2. Mengukur Penggunaan Ram Suatu Program?

  3. Pembunuh Kehabisan Memori Linux

  1. Penggunaan Memori Linux

  2. Linux – Penggunaan Memori Nyata?

  3. Memori tidak aktif Linux

  1. Linux – Apa yang Disiratkan oleh Tata Letak Memori Kernel Virtual Di Dmesg?

  2. Kali Linux 2018.1 Rilis

  3. Apakah alokasi memori di linux tidak memblokir?