메모리 주소를 변수에 매핑 [중복]

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 ++에서는 임의의 주소에서 메모리를 할당 할 방법이 없습니다. 언어 구현은 변수 및 동적 개체에 대한 메모리 할당을 처리합니다.

가상 메모리가없는 임베디드 시스템에서 언어 구현은 할당 된 특정 메모리 주소 범위를 문서화 할 수 있습니다. 이러한 경우 단순히 배치 new를 사용하여 해당 메모리에 개체를 만들 수 있습니다. 이러한 주소를 사용하면 다른 시스템으로 이동할 수 없습니다.


비표준 방식은 어떻습니까? 예, 존재할 수 있습니다. 예를 들어 POSIX 표준은 mmap기능을 지정 합니다.

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

이 매개 변수 flags는 매핑 된 데이터 처리에 대한 기타 정보를 제공합니다. flags의 값은 <sys / mman.h>에 정의 된 이러한 옵션의 비트 포함 OR입니다.

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

MAP_FIXEDflags 인자에가 설정 되면 , 구현은 pa의 값이 addr정확히 되어야 함을 알립니다 .

그러나 Linux 맨 페이지에서 다음을 고려하십시오.

에 대한 유일한 안전한 사용 MAP_FIXEDaddr및 길이로 지정된 주소 범위 가 이전에 다른 매핑을 사용하여 예약 된 경우입니다. 그렇지 MAP_FIXED않으면를 사용하면 기존 매핑을 강제로 제거하여 다중 스레드 프로세스가 자체 주소 공간을 쉽게 손상시킬 수 있으므로 위험합니다.