C
메모리 직접 접근
다크엔지니어
2020. 3. 4. 17:53
반응형
C 언어 에서는 포인터를 통해 메모리에 접근을 할 수 있다. 물론 virtual adress 이지만~
어떻게 포인터로 접근 하느냐
char *p = (char *)0x500000; 이와 같은 방식이다.
어떻게 저런 과정이 되냐하면
*(*)0x5000000; -> 포인터로 가르키게 되는데, 메모리에 접근 할때는 메모리 영역을 설정해줘야 한다. 그러므로
*(char *)0x5000000; -> 이렇게 되며 결국 , *(char *)0x5000000 = 100; 을 해줄 수도 있고...
char *p = (char *)0x500000; 이 성립되게 되지.
adress 접근에는 무조건 포인터 방식만 있는것은 아니다.
#defune PC (*(volatile unsigned char *)0x5000000) 이렇게 전처리기를 이용할 수 있는데 갑자기 volatile 을 써버렸지~
설명을 위해서 좀더 쓰자면
#include <stdio.h>
#define PC (*(volatile unsigned char *)0x01)
int main(void)
{
int data[10], i;
volatile int j;
PC = 0x00;
for (i = 0; i < 10; i++)
{
data[i] = PC;
for (j = 0; j < 100000; j++) {}
}
getchar();
return 0;
}
volatile 은 cpu가 cache memory 를 참고하지 말고 직접 ram 에 접근해서 값을 가져와라 라고 하는거다.
PC 에 0을 초기화 할 때, 주기억장치와 캐시에 0 값이 들어가게 되고, 결국 volatile 을 안쓰면 초기화된 캐시 메모리에서
아무리 주기억장치의 값이 바뀌어도 캐시는 알아채지 못하고 등신같이 0값만 가지고 있는거지...
그러니 위와 같은 상황에서는 volatile 을 써줘야되고 j 에도 쓴 이유는 데드코드를 막기위함이다. 타임딜레이를 쓸려고 ㅎㅎ
반응형