แมปที่อยู่หน่วยความจำกับตัวแปร [ซ้ำ]
ฉันจะแมปที่อยู่หน่วยความจำกับตัวแปรเพื่อสร้างโครงสร้างที่ตำแหน่งหน่วยความจำนั้นได้อย่างไร ฉันลองใช้โค้ดต่อไปนี้เพื่อสร้างโครงสร้างตามที่อยู่หน่วยความจำที่กำหนด แต่เพียงแค่ทิ้งข้อผิดพลาดในการแบ่งส่วน?
ตำแหน่งหน่วยความจำในรหัสเป็นพื้นที่อินพุตที่ฉันต้องตั้งค่าข้อมูลบางอย่างและกดกริ่งด้วย opcode เพื่อให้ CPU รับข้อมูลอินพุตและทำในสิ่งที่ opcode บอกว่าทำกับข้อมูลในพื้นที่อินพุต
some_struct* some_struct_obj= (some_struct*)0xc321000000;
memset(some_struct_obj, 0x00, sizeof(some_struct));
คำตอบ
แมปแอดเดรสหน่วยความจำกับตัวแปร
ไม่มีวิธีใดใน 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
จะเป็นอันตรายเนื่องจากการบังคับให้ลบการแมปที่มีอยู่ก่อนออกทำให้ง่ายสำหรับกระบวนการมัลติเธรดที่ทำให้พื้นที่ที่อยู่ของตัวเองเสียหาย