2011-03-03 5 views
1

가상 주소를 사용하여 shmat()을 사용하고 있습니다.shmat() 함수에 가상 주소를 보장 된 방법으로 전달하는 방법

  • 첫번째 프로세스는 널 않은 shmaddr와는 shmat를 호출하고, 데이터의 가상 어드레스를 얻을 때 다른 공유 memeory 장소에 저장 블록.

  • 두 번째 프로세스는 첫 번째 프로세스에서 공유 memeory에 저장된 virture 주소로 shmat()를 호출합니다.

  • 두 번째 프로세스는 일반적으로 대부분의 경우 동일한 가상 주소에 연결할 수 있지만 한 가지 경우에는 shmat이 -1을 반환하고 gdb를 사용할 때 주소가 잘못된 주소임을 확인했습니다.

    (gdb) x 0x800852000 
    0x800852000: Error accessing memory address 0x800852000: Bad address. 
    

그래서 제 질문은 내가 처음으로 내가 두 프로세스가 볼 수있는 가상 주소를 얻을 수 있음을 보장 할 어떻게?

답변

1

가상 주소를 설정하는 경우 정상적으로 사용하기 힘든 값으로 설정하면 가상 주소를 설정하는 것이 좋습니다. 접속할 기회가 있기 전에 도서관이나 다른 곳이 떠 맡아서 나쁜 주소를 얻었을 가능성이 큽니다. 우리는 유사한 상황을 가지고 우리는 0x0000005000000000 (64 비트에 대한 시스템)에 우리의 주소를 강제로 :

void *stuff = shmat(shmid, 0x0000005000000000, SHM_RDONLY); 
+3

당신이 시스템을 가질 수 있다면 더 나은 당신의 주소 (및 선호 사용에 대한 선택 '라고해야 공유 메모리)를 지원하고 코드를 더 이식성있게 만듭니다. –

+1

고정 주소를 사용하여 두 프로세스가 주소를 저장하여 특정 주소의 내용을 읽을 수있게하려고했습니다. 첫 번째 프로세스는 다른 프로세스가 직접 읽을 수있는 주소를 저장합니다 ... 오프셋을 사용하지 않고 –

+0

첫 프로세스가 shmaddr을 사용하도록 변경하면 주소 범위에 설정하면 프로세스가 실제로 커지지 않으면), 그러면 문제는 사라져야합니다. 그러나이 방법을 사용할 때 모든 코드와 라이브러리가 사용하는 것을 완전히 통제하지 않는 한 어떠한 보장도 없습니다. 따라서 사용할 가능성이없는 주소 범위를 선택하면됩니다. 우리의 경우 0x0000005000000000은 매번 작동합니다. –

관련 문제