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 에도 쓴 이유는 데드코드를 막기위함이다. 타임딜레이를 쓸려고 ㅎㅎ

 

 

반응형