펌웨어 소스 분석중 질문입니다.
어떤 캠에 들어가는 펌웨어 소스를 분석하고 있는데, 이런 쪽으로는 거의 처음인지라 신기한게 한둘이 아니네요 -_-;
질문 들어갑니다!
1.
register volatile char *r_14 asm ("r14");
long prev_pc = (long) r_14 - 4;
첫번째 코드가 의미하는 것이 무엇인가요?
volatile이 여기에 붙어서 어떤 것이 좋은지 간단하게 설명해주시면 감사..
2.
syscalls.c란 소스가 있는데, 이 소스에 보면 정의와 구현은 되 있으나 제대로 된 행동을 하지 않는 함수가 꽤 있습니다.
아래 함수가 그 중 일부입니다.
void _exit(int status __attribute__((unused)))
{
// XXX: should call cc3_power_down
while(1);
}
int _link(char *old __attribute__((unused)),
char *new __attribute__((unused))) {
// we do not support hard links
errno = EPERM;
return -1;
}
int _gettimeofday (struct timeval *tp __attribute__((unused)),
struct timezone *tzp __attribute__((unused))) {
return -1;
}
왜 syscalls.c란 파일은 위 함수를 정의했나요? 어떤 표준 같은 것이 있습니까?
3.
asm volatile ( "msr cpsr_c,0x1F" ); // MODE_SYS
이 라인은 아예 해석이 안됩니다 -_-;
이거이거 쓸데없이 헤집고 다니다 보니 공부할 게 왕창 늘어난 느낌이네요 ㅎㅎ 끝없는 컴퓨터의 세계..
그나저나 어셈블리어를 좀 공부하고 싶은데 어디서 공부할 수 있을까요?
volatile은 캐쉬 최적화 금지 키워드입니다.
volatile은 Compiler에게 포인터 변수가 가리키는 위치의 값이 프로그램 모르게 바뀔 수 있기때문에 프로그램이 이 변수에 접근할때 cache에서 값을 읽어오지 않고, 직접 포인터 변수가 가리키는 위치에서 값을 가져오도록 하는 일종의 최적화 금지 키워드입니다.
예를들어 하드웨어적으로 on/off 스위치를 프로그램이 검출한다고 할 때 on/off시 해당 값이 GPIO register로 1또는 0으로 표시되고, 이 경우 스위치가 바뀐것이 GPIO register에는 반영이 되지만 cache메모리에는 반영이 되지 않기 때문에 어플리케이션은 캐쉬에서 이 값을 읽으면 안되고 GPIO h/w register를 직접 읽어야 합니다. 이런경우 GPIO h/w register의 주소를 가르키는 포인터 변수 선언시 volatile keyword를 쓰게 됩니다.( volatile keyword가 없으면 컴파일러는 기본적으로 캐쉬에 해당값이 저장되어 있을 경우 캐쉬에 있는 데이터를 리턴하도록 최적화합니다.) 위 경우에는 CPU register에 직접 접근하기위해서 volatile keyword를 사용한 것입니다.
--------------------------------------------------------------------------------------
조금씩이라도 전진한다.
...
답변 감사합니다.
펌웨어나 이런 쪽 관련 커뮤니티엔 어떤 곳이 있는지 아시는분?
----------------
agidari.wordpress.com
캠에 들어간
캠에 들어간 펌웸어소스는 어떻게 보는지요?
...
저 같은 경우엔 소스가 오픈소스로 공개되어 있었습니다.
----------------
agidari.wordpress.com
댓글 달기