Petakan alamat memori ke variabel [duplikat]

Aug 18 2020

Bagaimana cara memetakan alamat memori ke variabel untuk membuat struktur di lokasi memori itu? Saya mencoba potongan kode berikut untuk membuat struct di alamat memori yang diberikan tetapi itu hanya membuang kesalahan segmentasi?

Lokasi memori dalam kode adalah Wilayah Input di mana saya perlu mengatur data tertentu dan membunyikan bel pintu dengan opcode sehingga CPU mengambil data Input dan melakukan apa yang dikatakan opcode itu dengan data di wilayah input

    some_struct* some_struct_obj= (some_struct*)0xc321000000;
    memset(some_struct_obj, 0x00, sizeof(some_struct));

Jawaban

1 eerorika Aug 17 2020 at 22:43

Petakan alamat memori ke variabel

Tidak ada cara di C ++ untuk memilih lokasi yang tepat dari variabel apa pun. Anda hanya dapat memilih kelas penyimpanan: otomatis, statis, atau utas lokal. Implementasi bahasa memilih alamat.

Bagaimana cara memetakan alamat memori ke ... untuk membuat struktur di lokasi memori itu?

Dimungkinkan untuk membuat objek dengan penyimpanan dinamis (yang bukan variabel) ke alamat memori apa pun selama memori itu dialokasikan, dan tidak berisi objek non-sepele. Ini dapat dicapai dengan menggunakan penempatan ekspresi baru, atau beberapa fungsi standar yang melakukan penempatan baru secara internal.

Tidak ada cara dalam C ++ standar untuk mengalokasikan memori dari alamat arbitrer. Implementasi bahasa menangani alokasi memori untuk variabel dan objek dinamis.

Pada sistem tertanam tanpa memori virtual, implementasi bahasa dapat mendokumentasikan rentang alamat memori tertentu seperti yang dialokasikan. Dalam kasus seperti itu, Anda cukup menggunakan penempatan baru untuk membuat objek dalam memori itu. Menggunakan alamat tersebut tidak akan portabel ke sistem lain.


Bagaimana dengan cara non-standar? Ya, mungkin ada. Misalnya, standar POSIX menentukan mmapfungsi:

pa=mmap(addr, len, prot, flags, fildes, off);

Parameter flagsmemberikan informasi lain tentang penanganan data yang dipetakan. Nilai flag adalah OR yang inklusif-bitwise dari opsi-opsi ini, yang didefinisikan di <sys / mman.h>:

Symbolic Constant  Description
MAP_SHARED         Changes are shared.
MAP_PRIVATE        Changes are private.
MAP_FIXED          Interpret addr exactly.

Ketika MAP_FIXEDdiatur dalam argumen flags, implementasi diinformasikan bahwa nilai pa harus addr, tepat.

Namun pertimbangkan mengikuti dari halaman manual Linux:

Satu-satunya penggunaan yang aman MAP_FIXEDadalah di mana kisaran alamat yang ditentukan oleh addrdan panjang sebelumnya dicadangkan menggunakan pemetaan lain; jika tidak, penggunaan dari MAP_FIXEDberbahaya karena secara paksa menghapus pemetaan yang sudah ada sebelumnya, sehingga memudahkan proses multithread untuk merusak ruang alamatnya sendiri.