펌웨어 RTOS 책을 썼습니다.

나빌레라의 이미지

10년만에 책을 한 권 썼습니다.

10년전에 KLDP에 쓴 글을 바탕으로 책을 냈었습니다.

이 책이죠. 아직도 절판되지 않고 팔리고 있습니다. 10년동안 꾸준히 일정 권수만큼 매년 팔리는 것 보면 아마도 어딘가에서 교재로 쓰고 있지 않나 하는 합리적 의심을 하고 있습니다.

그러는 동안 꾸역꾸역 시간은 흘렀습니다. 저도 어느덧 10년 넘는 경력의 개발자가 되었고 책도 나온지 10년이나 된 오래된 책이 되어 버렸습니다. 물론 10년이 지나서 봐도 여전히 훌륭한 책입니다. 그래도 10년이나 지났으니 새 책을 써야 겠다는 생각이 들었습니다. 10년간 바뀐 개발 환경 그리고 제가 10년간 현업에서 얻은 경험을 살짝 녹여서 책을 썼습니다.

이 책입니다.

다 쓰고 보니 오히려 내용의 난이도는 전작보다 쉬워졌습니다. 역시 경력이 쌓이니 같은 내용도 더 쉽게 설명하는 방법을 터득했나봅니다. 그리고 전작에서 실물 하드웨어 개발보드를 타겟보드로 삼아 내용을 진행했던 것과 달리 이번책에서는 전부다 QEMU에서 작업합니다. (QEMU도 10년동안 프로젝트가 안망하고 계속 발전했더군요. 이제는 완전히 메이저 오픈소스 프로젝트중 하나가 된듯 합니다.) 그래서 책만 사서 열심히 따라하면 책의 내용을 모두 실습해 볼 수 있습니다. 맞습니다. 돈을 아낄 수 있습니다.

이 책도 앞으로 한 10년간 절판없이 생존하길 바라며..
그 10년후에 저도 계속 이 바닥에서 생존하길 바라며..

많이 사 주세요~

File attachments: 
첨부파일 크기
Image icon EmbeddedOSProjectBook.jpeg107.61 KB
Image icon L.jpg92.29 KB

댓글

나빌레라의 이미지

Mask보단 register에 1을 set 하는 동작을 생각해보세요.
register에 1을 set 해서 mask할 수도 있고 enable 할 수도 있습니다.
register가 어떻게 동작하는가에 따라 다른 것이지요.
mask는 막는다는 뜻 맞습니다.

----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라

chlgus96의 이미지

Interrupt.h에서
#define UART_INTERRUPT0 44에서 32~63중 임의의 값으로 바꾸어도 동작을 잘 합니다!!

처음에는 키보드는 UART0랑만 연결되어 있다고 가정하였는데, 이 실험으로 판단하건데, 키보드는 모든 GIC 단자와 연결되어 있다고 생각해도 되나요?

참고로 이런 실험을 한 이유는 실습 과정에서 UART포트와 키보드를 연결하는 논리적인 구간이 없기 때문입니다!

나빌레라의 이미지

아니요.
qemu의 HW 에뮬레이션 구현은 좀 대충입니다.
그래서 적당히 흉내만 냈다고 생각하시면 됩니다.
UART는 몇 가지 설정을 잘못해도 잘 동작하는 정도로 대충 만들어 놨어요.
저는 그래서 qemu 소스 코드를 찾아보기 까지 했는데요.. 몇몇 레지스터는 아예 검사도 안하더라고요....

----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라

chlgus96의 이미지

이 책에서 많은 것을 배우고 있습니다!!

chlgus96의 이미지

1. OS수업 때 배운 VIrtual memory와 Physical memory는 동일하지 않았지만, RTOS같은 펌웨어를 만들때는 동일한 것으로 알고 있습니다. 맞나요?

2. data와 bss는 전역변수가 맞나요?

3. p.19의 링커 스크립트를 보고 저는 다음과 같이 생각했습니다. .data라는 파일 안에 여러 오브젝트 파일들의 data 정보들을 넣습니다. 그리고 load할 때는 .text segment를 먼저 memory에 먼저 로드시키고 곧바로 .data segment를 로드시킵니다. 그렇게 되면 text영역 다음에 곧바로 전역 변수가 존재할 것 같습니다. 그렇게 된다면 링커 스크립트와 p.36의 memory 맵과 배치됩니다. 맞나요?

4. 3과 같은 이유로 아래와 같이 수정하는 것이 맞다고 생각합니다.

ENTRY(vector_start)
SECTIONS
{
. = 0x0;


.text :
{
*(vector_start)
*(.text .rodata)
}

. = 0x04800000

.data :
{
*(.data)
}
.bss :
{
*(.bss)
}
}
감사합니다.

나빌레라의 이미지

1. 버추얼 메모리와 피지컬 메모리는 아예 다른 개념입니다.
2. 엄밀히 따지면, 아니요라고 대답하겠습니다.
전역 변수도 종류가 있지요.
3. 그렇게 이해 하시면 안됩니다.
4. 0x48000000은 어디서 나온 숫자인가요?

----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라

chlgus96의 이미지

1. 0x04800000는 전역변수가 시작하는 메모리 주소입니다!! p.36의 그림 4.1에는 메모리 설계에 관한 그림이 있습니다. Text section에 instruction들이 들어가는 것으로 이해했습니다. Rodata, data, bss에는 전역 변수가 들어간다고 생각했습니다만, 아닌 듯 하네요. 하지만 엄밀히라는 조건을 달았으니 일단 전역변수도 들어간다고 생각하겠습니다. 저희가 작성한 Linker Script에 따르면 text section 직후에 rodata, data, bss가 적재되는 듯 합니다만, 그러면 4.1에 그려진 text 영역에 instruction 이후에 전역변수들이 들어가게 되고, 전역변수 영역으로 할당한 메모리 0x04800000~0x048FFFFF에 전역변수들이 들어가지 않을 것 같습니다.

사실 먼저 드렸던 질문 4개는 '전역변수는 어디에 저장되는 거지?, 전역 변수 영역에 할당하도록 우리가 무슨 설정을 해주었나?'에서 시작된 꼬리 질문입니다.

2. Linker Script는 메모리에 적재되는 Load view를 나타내는 것으로 알고 있습니다. 펌웨어를 작성할 때도 MMU가 알아서 모든 Physical Memory를 관리해준다고 생각하고, Linker Script에도 Virtual memory에 관해서만 작성한다고 생각하면 될까요?

저는 전기전자공학부를 나왔고, 입사를 위해서 포트폴리오로 Navilos를 준비중입니다! 컴공이 아니라 기본 지식이 많이 부족함을 느끼지만, 책을 가지고 공부하면서 많을 것들을 배우고 있습니다.
감사합니다.

나빌레라의 이미지

1. 링커 스크립트는 심볼을 넣어주는게 아닙니다. 심볼의 주소를 설정해주는 것입니다. 심볼을 해당 주소에 넣어주는 (카피해주는) 일은 로더가 합니다. 이 쓰레드의 댓글에 같은 답변을 달은 것이 있습니다. 물론 로더에서 재배치해준 심볼이 제대로 동작하려면 링커 스크립트랑 쿵짝이 잘 맞아야 하지요.
심볼과 변수와 링커와 로더의 차이를 먼저 공부하십시요.

2. MMU가 없는 시스템이 더 많습니다. 그리고 MMU가 있을 때 버추얼 메모리 테이블 설정은 미친듯이 복잡합니다. 따로 검색해서 찾아서 공부해 보세요.

----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라

chlgus96의 이미지

p.155 코드 10.3에 대해서 질문 있습니다.
__attribute__ ((naked))의 경우에도 함수로 call 하는 경우이므로 callee함수에 들어가기 전에 pc가 lr에 저장되고, lr가 스택에 저장될 것으로 예상됩니다. 하지만 이럴경우 context에 lr이 들어가지 않습니다. 원래 lr는 context에 없나요?! 생각해 보니 r0-r12, r15는 context 구조체에 r13은 tcb구조체에 저장이 되는데 r14는 저장되는 곳이 없는 것 같아요.

나빌레라의 이미지

설계자 마음입니다. 설계자가 tcb에 (context와 tcb는 다릅니다.) lr을 넣고 싶으면 넣는 것이고 넣기 싫으면 넣지 않는 것입니다.

----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라

chlgus96의 이미지

enqueue가 실패하면 dequeue가 아닌, 새로운 rollbackqueue함수를 만들어야 할 것 같습니다.
이유: dequeue는 FIFO 하지만 rollback은 LIFO로 일어나야함

감사합니다.

나빌레라의 이미지

그렇네요.
감사합니다.
pull request를 보내 주시면 contributer에 이름을 올리실 수 있습니다 :)

----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라

chlgus96의 이미지

감사합니다!! 수정하고 Pull Request 했습니다. 사실 이 프로젝트로 지원하려 했던 채용 공고에서는 떨어졌지만 의미 깊은 시간이었습니다!

감사합니다 선생님!

영인의 이미지

현재 임베디드 OS 개발 프로젝트 책을 보며 OS를 만들어가고 있는데 문득 실제 보드에 포팅하는 것은 어떻게 하는지 궁금하여 나름대로 검색을 해가며 찾아보았으나 너무 산으로 가는거 같아 질문드리게 되었습니다.

NAND FLASH 기반 ARM 기반 보드에 OS를 포팅해 보고 싶다고 한다면 대략적인 절차가 어떻게 되는 것인지 여쭤보고 싶습니다.
부트로더 자체부터 제작을 직접해야 되는 것인지 아니면 개발되어 있는 부트로더를 보드에 업로드하고 내가 만든 OS를 JTAG를 활용해서 NAND FLASH 메모리에 업로드하면 되는 것인지...
너무 무지한 영역이라서 접근이 힘들어 문의드립니다...

나빌레라의 이미지

둘다 가능합니다.

부트로더 자체부터 제작을 직접해야 되는 것인지 --> 가능합니다.
개발되어 있는 부트로더를 보드에 업로드하고 내가 만든 OS를 JTAG를 활용해서 NAND FLASH 메모리에 업로드하면 되는 것인지 --> 가능합니다.

----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라

525109의 이미지

임베디드 입문자로써 많은 도움이 되고 있습니다.
교육을 받을 곳이 없어서 사실상 이 책 하나로 공부하고 있습니다.

혹시 괜찮으시면 이메일을 알고 싶습니다.
임베디드 구루님의 이야기를 꼭 듣고 싶습니다.

ㅌㄹ의 이미지

안녕하세요, 이제 막 임베디드에 관심을 갖게 되어 집필하신 책으로 입문하려고 하는데요,
혹시 구글 플레이북에는 올릴 예정이 있으실까요..?
다른 문고 사이트들에 E북이 올라와있는걸 보긴 했는데 제가 구글에서 다른 책들을 보고 있어서 혹시나 해서 여쭤봅니다.

페이지

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.