แมปที่อยู่หน่วยความจำกับตัวแปร [ซ้ำ]

Aug 18 2020

ฉันจะแมปที่อยู่หน่วยความจำกับตัวแปรเพื่อสร้างโครงสร้างที่ตำแหน่งหน่วยความจำนั้นได้อย่างไร ฉันลองใช้โค้ดต่อไปนี้เพื่อสร้างโครงสร้างตามที่อยู่หน่วยความจำที่กำหนด แต่เพียงแค่ทิ้งข้อผิดพลาดในการแบ่งส่วน?

ตำแหน่งหน่วยความจำในรหัสเป็นพื้นที่อินพุตที่ฉันต้องตั้งค่าข้อมูลบางอย่างและกดกริ่งด้วย opcode เพื่อให้ CPU รับข้อมูลอินพุตและทำในสิ่งที่ opcode บอกว่าทำกับข้อมูลในพื้นที่อินพุต

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

คำตอบ

1 eerorika Aug 17 2020 at 22:43

แมปแอดเดรสหน่วยความจำกับตัวแปร

ไม่มีวิธีใดใน C ++ ในการเลือกตำแหน่งที่แน่นอนของตัวแปรใด ๆ คุณสามารถเลือกคลาสพื้นที่จัดเก็บ: อัตโนมัติแบบคงที่หรือเธรดในเครื่อง การใช้ภาษาเลือกที่อยู่

ฉันจะแมปที่อยู่หน่วยความจำกับ ... เพื่อสร้างโครงสร้างที่ตำแหน่งหน่วยความจำนั้นได้อย่างไร

เป็นไปได้ที่จะสร้างวัตถุที่มีหน่วยเก็บข้อมูลแบบไดนามิก (ซึ่งไม่ใช่ตัวแปร) ในที่อยู่หน่วยความจำใด ๆ ตราบเท่าที่หน่วยความจำนั้นได้รับการจัดสรรและไม่มีวัตถุที่ไม่สำคัญ สามารถทำได้โดยใช้นิพจน์ตำแหน่งใหม่หรือฟังก์ชันมาตรฐานบางอย่างที่ดำเนินการจัดวางตำแหน่งใหม่ภายใน

ไม่มีวิธีใดใน C ++ มาตรฐานในการจัดสรรหน่วยความจำจากที่อยู่โดยพลการ การใช้ภาษาจะดูแลการจัดสรรหน่วยความจำสำหรับตัวแปรและวัตถุแบบไดนามิก

บนระบบฝังตัวที่ไม่มีหน่วยความจำเสมือนการใช้ภาษาอาจบันทึกช่วงที่อยู่หน่วยความจำเฉพาะตามที่จัดสรรไว้ ในกรณีนี้คุณสามารถใช้ตำแหน่งใหม่เพื่อสร้างวัตถุในหน่วยความจำนั้นได้ การใช้ที่อยู่ดังกล่าวจะไม่สามารถพกพาไปยังระบบอื่นได้


แล้ววิธีที่ไม่ได้มาตรฐานล่ะ? ใช่มันอาจมีอยู่ ตัวอย่างเช่นมาตรฐาน POSIX ระบุmmapฟังก์ชัน:

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

พารามิเตอร์flagsให้ข้อมูลอื่น ๆ เกี่ยวกับการจัดการข้อมูลที่แมป ค่าของแฟล็กคือบิตรวมหรือของอ็อพชันเหล่านี้ซึ่งกำหนดไว้ใน <sys / mman.h>:

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

เมื่อMAP_FIXEDถูกตั้งค่าในอาร์กิวเมนต์แฟล็กการดำเนินการจะได้รับแจ้งว่าค่าของ pa จะเป็นaddrเท่ากัน

อย่างไรก็ตามลองพิจารณาจากการจัดการของ Linux:

การใช้อย่างปลอดภัยเพียงอย่างเดียวMAP_FIXEDคือช่วงที่อยู่ที่ระบุโดยaddrและความยาวถูกสงวนไว้ก่อนหน้านี้โดยใช้การแมปอื่น มิฉะนั้นการใช้งานMAP_FIXEDจะเป็นอันตรายเนื่องจากการบังคับให้ลบการแมปที่มีอยู่ก่อนออกทำให้ง่ายสำหรับกระบวนการมัลติเธรดที่ทำให้พื้นที่ที่อยู่ของตัวเองเสียหาย