이 상품은 구매 후 지원 기기에서 예스24 eBook앱 설치 후 바로 이용 가능한 상품입니다.
|
추천의 글지은이의 글1장 임베디드 운영체제1.1 운영체제1.1.1 프로세스 관리1.1.2 저장장치 관리1.1.3 네트워킹1.1.3 사용자 관리1.1.5 디바이스 드라이버1.2 임베디드 운영체제1.3 나빌눅스1.4 실습 : 임베디드 개발 환경 구성1.4.1 목표 플랫폼 정하기1.4.2 리눅스에서 크로스 컴파일 환경 설정1.4.3 윈도에서 임베디드 개발 환경 구성1.5 정리2장 부팅하기2.1 개발보드 선정하기2.1.1 EX-X5 보드2.2 이지보드에 나빌눅스 이미지를 올리는 방법2.3 에뮬레이터 환경 구성2.3.1 qemu2.3.2 u-boot 설치2.4 실습 : 이지보드에서 hello world를 출력하자2.4.1 이지부트의 소스코드 재활용2.4.2 커널 이미지 부팅하기2.4.3 링커 스크립트 수정2.5 실습 : 에뮬레이터에서 hello world를 출력하자2.5.1 UART 주소 수정2.5.2 에뮬레이터에서 부팅하기2.5.3 uImage 만들기2.5.4 램 디스크 이미지 만들기2.5.5 플래시 이미지 만들어 부팅하기2.6 실습 : 윈도 환경에서 에뮬레이터 실행시키기2.6.1 시그윈에서 플래시 이미지 만들기2.6.2 윈도용 에뮬레이터 실행2.7 정리3장 LED 켜기3.1 부트로더 코드 재활용3.2 실습 : 1초마다 LED를 켜 보자3.2.1 이지부트에서 LED 관련 코드 분석3.2.2 나빌눅스에 LED 점멸 코드 추가3.3 정리4장 exception vector table 구성하기4.1 ARM의 exception과 프로세서 동작 모드4.2 ARM의 exception vector table4.3 실습 : 이지부트를 수정하여 exception 핸들링 하기4.4 실습 : u-boot를 수정하여 exception 핸들링 하기4.5 정리5장 Software Interrupt Handler 구현하기5.1 스택을 이용한 ISR과 태스크 간의 컨텍스트 스위칭5.1.1 ISR5.1.2 태스크-ISR 간 컨텍스트 스위칭5.2 ARM 프로세서의 레지스터5.2.1 스택 포인터5.2.2 링크 레지스터5.2.3 spsr5.3 실습 : Software Interrupt Hanlding5.3.1 실제 프로그램은 레지스터들을 어떻게 사용하는가5.3.2 태스크-ISR 간 컨텍스트 스위칭 코드 구현5.3.3 main 함수의 수정5.3.4 시스템 콜 번호의 추출5.4 정리6장 IRQ 핸들러 구현 : OS 타이머 사용하기6.1 PXA255의 인터럽트 컨트롤러 계층6.1.1 OS 타이머6.1.2 인터럽트 컨트롤러 계층6.1.3 ICMR6.1.4 ICLR6.1.5 ICCR6.1.6 ICFP, ICIP6.1.7 ICPR6.1.8 인터럽트의 종류6.2 msleep() 함수 분석6.3 PXA255의 OS 타이머 레지스터 계층6.3.1 OSMR6.3.2 OSCR6.3.3 OIER6.3.4 OSSR6.4 실습 : IRQ 핸들러 구현 - OS 타이머6.4.1 OS 타이머 초기화 함수 작성6.4.2 OS 타이머 시작 함수 작성6.4.3 커널 main 함수 수정6.4.4 IRQ 핸들러 함수 수정6.4.5 전체 작업 코드6.4.6 태스크-ISR 간 컨텍스트 스위칭 코드 작성6.4.7 ARM9 아키텍처의 파이프라인6.4.8 exception 핸들러에서 복귀 주소의 결정6.4.9 OS 타이머가 발생되는 순서6.4.10 빌드와 테스트6.5 정리7장 메모리 맵 구성7.1 나빌눅스의 메모리 맵7.2 실습 : 나빌눅스 커널의 스택 주소 초기화7.3 실습 : 스택 초기화 주소 확인하기7.4 정리8장 메모리 관리자 구현하기8.1 임베디드 운영체제에서의 사용자 태스크8.1.1 태스크8.1.2 메모리 관리자8.2 실습 : 메모리 관리자 정의8.2.1 자유 메모리 블록 정의8.2.2 메모리 관리자 함수 정의8.3 실습 : 메모리 관리자 함수 구현8.3.1 메모리 관리자 커널 전역 변수 선언8.3.2 메모리 분할 크기 설정8.3.3 mem_init() 함수 설명8.3.4 mem_alloc() 함수 설명8.3.5 navilnux.h 파일 수정8.3.6 Makefile 수정8.4 정리9장 태스크 관리자 구현하기9.1 태스크 컨트롤 블록9.1.1 태스크 컨텍스트 정보9.2 사용자 태스크9.2.1 사용자 태스크의 등록과 로딩9.3 실습 : 태스크 관리자 정의9.3.1 태스크 컨트롤 블록 정의9.3.2 사용자 태스크의 컨텍스트 자료형 크기9.3.3 태스크 관리자 구조체 정의9.4 실습 : 태스크 관리자 함수 구현9.4.1 태스크 관리자 커널 전역 변수 선언9.4.2 cpsr의 초기 값 설정9.4.3 task_init() 함수9.4.4 task_create() 함수9.5 실습 : 사용자 태스크의 추가9.5.1 사용자 태스크 함수의 추가9.5.2 navilnux.h 파일 수정9.5.3 navilnux.c 파일 수정 - navilnux_init() 함수 추가9.5.4 main() 함수 수정9.5.5 Makefile 수정9.6 정리10장 컨텍스트 스위칭 구현하기10.1 컨텍스트 스위칭과 스케줄러10.1.1 멀티태스킹10.1.2 컨텍스트 스위칭10.1.3 스케줄러10.2 실습 : 컨텍스트 스위칭 구현10.2.1 IRQ 핸들러 수정10.2.2 태스크 컨텍스트 백업10.2.3 IRQ 핸들러 함수에 진입10.2.4 태스크 컨텍스트 복구10.3 스케줄러 구현10.3.1 다른 운영체제의 스케줄링 정책10.3.2 가장 기본적인 스케줄러10.3.3 라운드로빈 스케줄러 구현10.3.4 스케줄러 초기화 코드 작성10.3.5 커널 main() 함수 수정10.3.6 OS 타이머 핸들러 수정10.3.7 navilnux.c 전체 내용 다시 보기10.3.8 사용자 태스크 수정10.3.9 빌드와 테스트10.4 실습 : 사용자 스택 할당 검증10.5 정리11장 외부 인터럽트11.1 PXA255의 GPIO 레지스터 계층11.1.1 대표적인 외부 인터럽트 : 입력 장치11.1.2 GPIO11.1.3 PXA255 칩의 GPIO 인터럽트 처리11.1.4 Edge Detect11.1.5 PXA255 칩에서 GPIO를 설정하는 레지스터들11.1.6 GPDR11.1.7 GFER과 GRER11.1.8 GEDR11.1.9 GAFR11.1.10 버튼 회로 연결11.2 GPIO 인터럽트 처리11.2.1 GPIO 초기화 코드 작성11.2.2 초기화 함수 추가11.2.3 인터럽트 처리 코드 추가11.2.4 수정된 전체 코드11.2.5 테스트11.3 정리12장 시스템 콜 구현하기12.1 리눅스의 시스템 콜12.1.1 fork() 시스템 콜12.2 실습 : 시스템 콜 계층 추가12.2.1 시스템 콜 커널 함수 작성12.2.2 시스템 콜 초기화 함수 호출12.2.3 시스템 콜 관련 헤더 파일 작성12.2.4 사용자 태스크 함수 수정12.2.5 시스템 콜 래퍼 함수 작성12.2.6 Software Interrupt의 ISR 수정12.2.7 Makefile 수정12.3 실습 : 시스템 콜 추가 절차12.4 정리13장 태스크 간 통신 구현하기13.1 IPC(Inter-Process Communication)13.1.1 파이프13.1.2 FIFO13.1.3 메시지 큐13.1.4 공유 메모리13.1.5 임베디드 운영체제의 ITC13.2 컨텍스트 스위칭 시스템 콜 만들기13.2.1 블로킹 상태13.2.2 사용자 태스크에서 호출 가능한 컨텍스트 스위칭 시스템 콜 구현13.2.3 스케줄러 시스템 콜 추가13.2.4 entry.S 파일 수정13.2.5 사용자 태스크에서 스케줄러 호출 테스트13.3 실습 : 메시지 관리자 정의13.3.1 navilnux_msg.h 파일 작성13.3.2 자유 메시지 블록13.3.3 메시지 관리자13.3.4 메시지 관리자 제어 함수들13.4 실습 : 메시지 관리자 함수 구현13.4.1 msg_itc_send(), msg_itc_get() 함수 구현13.4.2 navilnux.h 수정13.4.3 navilnux_init() 함수 수정13.5 실습 : 시스템 콜 계층에 ITC 함수 등록13.5.1 시스템 콜 번호 추가13.5.2 시스템 콜 함수 프로토타입 선언13.5.3 시스템 콜 함수 본체 작성13.5.4 시스템 콜 래퍼 함수 프로토타입 선언13.5.5 시스템 콜 어셈블리어 래퍼 함수 작성13.5.6 시스템 콜 C 래퍼 함수 프로토타입 선언13.5.7 시스템 콜 C 래퍼 함수 본체 작성13.5.8 ITC 테스트13.6 정리14 동기화 구현하기14.1 세마포어14.1.1 세마포어 구현하기14.1.2 메시지 관리자 코드 수정14.1.3 세마포어 함수 구현14.1.4 새로운 시스템 콜 번호를 세마포어에 할당14.1.5 시스템 콜 함수의 프로토타입 선언14.1.6 시스템 콜 함수 작성14.1.7 시스템 콜 래퍼 함수의 프로토타입 선언14.1.8 시스템 콜 어셈블리어 래퍼 함수 작성14.1.9 시스템 콜 C 언어 래퍼 함수 작성14.1.10 사용자 태스크에서 세마포어 사용 테스트14.2 뮤텍스14.2.1 바이너리 세마포어와 뮤텍스의 차이14.2.2 실습 : 뮤텍스 구현하기14.2.3 메시지 관리자 수정14.2.4 뮤텍스 함수 구현14.2.5 뮤텍스에 시스템 콜 번호 할당14.2.6 시스템 콜 함수 작성14.2.7 시스템 콜 래퍼 함수 작성14.2.8 사용자 태스크에서 뮤텍스 테스트14.3 실습 : 시간 지연 함수 구현하기14.3.1 커널 카운터 추가14.3.2 sleep() 함수 구현14.3.3 태스크 컨트롤 블록 수정14.3.4 sleep() 함수 작성14.3.5 수정된 sleep() 함수를 이용한 뮤텍스 테스트14.4 정리15 메모리 동적 할당 구현하기15.1 메모리 동적 할당 설계15.1.1 동적 할당에 사용할 메모리 영역15.1.2 구현의 범위15.1.3 메모리 풀15.2 실습 : 메모리 동적 할당 구현15.2.1 메모리 관리자 수정15.2.2 동적 할당 전략15.2.3 free() 함수 구현15.2.4 malloc() 함수 구현15.2.5 시스템 콜에 등록15.2.6 메모리 동적 할당 테스트15.3 정리16 디바이스 드라이버 구현하기16.1 디바이스 드라이버16.1.1 리눅스 캐릭터 디바이스 드라이버 계층을 차용16.2 실습 : 디바이스 드라이버 관리자 정의16.2.1 fops 구조체16.2.2 자유 디바이스 드라이버 블록16.3 실습 : 디바이스 드라이버 관리자 구현16.3.1 drv_init() 함수16.3.2 drv_register_drv() 함수16.3.3 시스템 콜에 등록16.4 실습 : 디바이스 드라이버 추가하기16.4.1 LED와 스위치를 디바이스 드라이버로 제어16.4.2 IRQ 핸들러 벡터를 커널에 추가16.4.3 read(), write() 함수 구현16.4.4 IRQ 핸들러 함수16.4.5 mydrv_open() 함수16.4.6 mydrv_close() 함수16.4.7 mydrv_read() 함수16.4.8 mydrv_write() 함수16.4.9 사용자 디바이스 드라이버를 커널에 등록16.4.10 사용자 디바이스 드라이버를 테스트16.5 정리17 마치며17.1 프로젝트 종료17.2 나빌눅스의 파일 구성17.2.1 entry.S, navilnux.c, navilnux.h17.2.2 navilnux_memory.c, navilnux_memory.h17.2.3 navilnux_task.c, navilnux_task.h17.2.4 navilnux_user.c, navilnux_user.h17.2.5 navilnux_sys.c, navilnux_sys.h, syscalltbl.h, navilnux_lib.S, navilnux_clib.c, navilnux_lib.h17.2.6 navilnux_msg.c, navilnux_msg.h17.2.7 navilnux_drv.c, navilnux_drv.h, mydrv.c17.3 나빌눅스의 계층17.4 맺음말17.4.1 운영체제의 개념, 이론 그리고 구현17.4.2 임베디드 개발 환경에 대한 경험17.4.3 ARM 아키텍처에 대한 대략적 이해17.4.4 마치며찾아보기약어표
|
|
이 책은 작고 간단한 임베디드 운영체제를 만들어 보면서 운영체제의 원리를 가르쳐준다. 어려운 전공 서적에나 나올 법한 설명들은 잠시 제쳐두고, 일단 코딩을 하면서 작동 방식을 파악해 보면 이론 역시 쉽게 이해하게 된다. 학교에서 배운 ‘운영체제 이론’만으로는 부족한 학생부터 운영체제가 어떻게 작동하는지 궁금한 사람, 임베디드 펌웨어를 개발해야 하는 개발자에 이르기까지, 이 책을 따라가다 보면 어느덧 작은 운영체제를 완성하게 될 것이다.- ARM 아키텍처의 기본- 부트로더 재활용- exception 핸들링- 컨텍스트 스위칭- 메모리 관리- 외부 인터럽트 제어- 시스템 콜- 태스크 간 통신- 동기화- 디바이스 드라이버- 에뮬레이터용 실습 코드1~3장은 임베디드 운영체제에 대한 간략한 설명과 EZ-X5 보드의 부팅, LED 점멸 등 간단한 작업을 통해 임베디드 개발에 필요한 기본적인 환경을 구축한다. 4~6장에서는 ARM의 exception, 동작 모드, 레지스터 조작 등을 설명하면서 exception vector table과 Software Interrupt Handler, IRQ 핸들러(타이머) 등을 구현한다. 7~10장에서는 메모리와 태스크를 관리하는 관리자 함수를 구현하고, 여기에 태스크 스케줄러를 합하여 멀티태스킹 운영체제로 나아가는 과정을 설명한다.11~13장에서는 임베디드 기기 외부의 입력을 처리하는 외부 인터럽트와 운영체제의 기능을 일관성있게 추가하기 위한 시스템 콜을 구현하며, 이를 바탕으로 태스크 간 통신 기능을 구현한다. 14~16장에서는 시스템의 크리티컬 섹션에 접근하는 방법으로 세마포어와 뮤텍스 기능을 구현하며, 사용자 태스크가 요청하는 메모리를 동적으로 할당하는 기능, 임베디드 기기에 연결된 각종 장치를 제어하기 위한 디바이스 드라이버를 구현한다. 17장에서는 이제껏 구현한 운영체제의 파일 구성과 계층도를 설명하며 책을 마무리한다.
|