펌웨어 소스 분석중 질문입니다.

나그네나그네의 이미지

어떤 캠에 들어가는 펌웨어 소스를 분석하고 있는데, 이런 쪽으로는 거의 처음인지라 신기한게 한둘이 아니네요 -_-;

질문 들어갑니다!

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
이 라인은 아예 해석이 안됩니다 -_-;

이거이거 쓸데없이 헤집고 다니다 보니 공부할 게 왕창 늘어난 느낌이네요 ㅎㅎ 끝없는 컴퓨터의 세계..
그나저나 어셈블리어를 좀 공부하고 싶은데 어디서 공부할 수 있을까요?

lugi의 이미지

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

silasoni의 이미지

캠에 들어간 펌웸어소스는 어떻게 보는지요?

나그네나그네의 이미지

저 같은 경우엔 소스가 오픈소스로 공개되어 있었습니다.
----------------
agidari.wordpress.com

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.