2017-10-11 2 views
3

C의 '휘발성'키워드는 컴파일러에게 변수를 RAM 메모리에서 레지스터 또는 캐시로로드하지 말고 항상 컴퓨터 작업 메모리에서 변수를 읽는 데 사용됩니다.Linux 또는 Windows를 실행하는 데스크톱 컴퓨터에서 C의 "휘발성"키워드 사용을 "테스트"할 수 있습니까?

그러나 나는 또한 다른 장치가 변수에 저장된 메모리 주소에서 값을 수정할 때 유스 케이스라고 읽었습니다.

내 질문은 :

는 프로그램이 리눅스 나 또한 MMU를 가지고 있으며 (그 프로그램의 가상 주소 공간을 사용하는 Windows 시스템에서 실행되는 동안 메모리 주소의 값을 수정할 가능성이 있나요 모든 현대 기계처럼)?

프로그램의 변수를 다른 프로그램 (다른 스레드뿐만 아니라 다른 프로세스에서 실행 중)에서 변경할 수 있습니까?

답변

0

몇 가지 질문이 있으므로 여기를 먼저 살펴 보겠습니다. "... 휘발성 키워드 사용 테스트 ..."

나는 volatile 키워드를 사용하지 않고 모듈을 어셈블러로 컴파일 할 수 있다고 가정합니다 (나는 -S 옵션이라고 생각합니다). 이 방법은 휘발성 키워드로 수정 된 동일한 코드에 대해 반복 될 수 있으며, diff 도구는 변경 사항에 주목할 수 있습니다. 나는 휘발성 키워드로 문제의 변수를 로딩하는 것이 항상 그 위치에서 직접 일어날 것이라고 의심 할 것이다. 이것은 휘발성 변수의 실제 위치가 무엇인지 미리 알기 위해 .map 목록을 살펴봄으로써 비교할 수 있습니다.

4

프로그램이 MMU가 있고 해당 프로그램에 가상 주소 공간을 사용하는 Linux 또는 Windows 컴퓨터에서 실행되는 동안 (모든 최신 컴퓨터와 마찬가지로) 메모리 주소 값을 수정할 가능성이 있습니까?

물론 가능합니다.

분명한 예는 스레딩입니다. 다른 스레드가보고있는 메모리를 업데이트 할 수 있으므로 변경되지 않는다고 가정하고 싶지는 않습니다.

다른 예는 다음과 같습니다

  • 공유 메모리를. 프로세스는 효율적인 IPC를 위해 메모리를 공유하는 데 동의 할 수 있습니다.
  • mmap. 프로그램은 파일을 메모리에 매핑 할 수 있습니다. 파일이 변경되면 해당 메모리도 변경됩니다 (Linux에서는 공유 메모리의 기본 임).
  • DMA. 하드 드라이브와 같은 다른 장치는 효율적인 전송을 위해 RAM에 직접 데이터를 쓰도록 요청받을 수 있습니다.

는 (다른 방법뿐만 아니라 다른 스레드의 실행) 다른 프로그램으로부터 프로그램의 변수를 변화시킬 수있다?

예. 프로세스가 일치하면 공유 메모리를 사용할 수 있습니다.

그렇지 않은 경우 다른 디버거로 연결하여 메모리를 검사/수정할 수 있습니다.

관련 문제