OS/Embedded OS

OS/Embedded OS

부록 A.5 Makefile을 짜보자

A.5.1 서론 프로그램을 짤 때 간단한 프로그램은 gcc 명령행을 쳐서 컴파일 하는 것이 간편했습니다. 하지만 소스 파일 혹은 헤더파일이 마구 넘쳐나는 운영체제나 복잡한 프로그램들은 절대로 하나 하나씩 gcc 명령어를 쓴다는 것은 많은 시간을 요구합니다. 이를 해결하기 위해서 make 라는 프로그램이 등장합니다. 비주얼 스튜디오 같은 IDE 에서는 소스 파일 혹은 헤더 파일 폴더를 클릭해 소스를 추가하고, 한꺼번에 빌드가 되었습니다. 반면에 make 는 어떤 규칙에 맞춰 작성해야 올바르게 빌드 됩니다. 문법이 조금 복잡하지만 자유도 하나만큼은 뛰어난 프로그램입니다. A.5.2 예제 코드 일단 foo! 와 bar!를 출력하는 매우 간단한 프로그램을 작성해보겠습니다.(예제 파일을 같은 디렉토리에 넣는 것으..

OS/Embedded OS

부록 A.4 gcc 사용법

A.4.1 hello.c 를 컴파일 하기 $ gcc hello.c $ ./a.out hello.c 를 위와 같이 컴파일 하게 되면 실행 파일 명이 자동으로 a.out으로 정해집니다. 따라서 두 번째 명령어로 a.out을 실행시킵니다. A.4.2 -o 옵션 위의 hello.c 를 컴파일 한 결과가 a.out으로 만들어 졌는데 이것을 우리가 원하는 이름 (ex.hello)로 만들고 싶을 때 -o 옵션을 사용합니다. o는 output의 약자이며 출력 파일 명의 이름을 지정하는 옵션입니다. $ gcc -o hello.o hello.c or $ gcc hello.c -o hello 순서를 바꿔도 무방합니다. (참고로 저는 첫 번째를 사용하고 있습니다) 그리고 실행은 ./hello로 하면 됩니다. A.4.3 -c ..

OS/Embedded OS

부록 A.3 실행 파일 형식

A.3.1 실행 파일 형식(Excutable and Linkable Fomat) 이번 절은 부록 A.2에서 나온 호출 방법 중 구체적인 실행 파일 형식에 대해 다룹니다. 실행 파일을 만드는 방법은 gcc가 오브젝트 파일을 만들고 링커가 라이브러리를 링킹하면 최종 결과물인 실행 파일이 생성됩니다. 운영체제가 게임 실행 파일(LOL.exe)을 실행하면 게임이 켜지는 거와 같습니다. 반면에 펌웨어 바이너리는 운영체제가 없어 사용자가 실행할 수 없지만 타깃 시스템에 전원이 들어오면 자동으로 켜지게 하는 파일 형식이므로 이것 또한 실행 파일(Excutable and Linkable Fomat)이라고 합니다. ELF 파일 포맷의 시작은 ELF 헤더와 ELF 섹션으로 나누어 집니다. ELF 헤더 : ELF 포맷이 지..

OS/Embedded OS

부록 A.2 ABI

부록 A.2.1 ABI (Application Binary Interface) Application Binary Interface, 인터페이스는 어떤 것을 연결하는 것입니다. ABI도 결국에 Application Binary를 연결하는 약속 내지는 규약입니다. Application Binary는 애플리케이션인데 바이너리 수준에서 애플리케이션이 호환 가능하도록 만든 인터페이스(약속)입니다. 바이너리 수준은 쉽게 설명하자면 컴파일된 오브젝트 파일을 의미합니다 그리고 컴파일된 오브젝트 파일들을 링킹하는 놈은 링커(Linker)입니다. 즉, 링커가 오브젝트 파일들을 링크할 수 있도록 함수 호출 방법을 정의한 인터페이스(약속)입니다. (오브젝트 파일 중에서는 라이브러리 파일도 포함됨) 넓게 함수 호출 방법이라고 ..

OS/Embedded OS

부록 A.1 ARM 아키텍처 기초 지식

A.1.1 익셉션 벡터 테이블 익셉션이 발생하면 해당하는 익셉션에 맞춰 프로그램 카운터(PC)를 익셉션 벡터 테이블에 정의된 오프셋 주소로 점프해 핸들러를 실행합니다. 아래는 익셉션 벡터 테이블입니다. 예를 들어, 정의되지 않는 명령어를 만나면 Undefined Instruction 벡터 테이블로 이동해 Undefined Instruction 핸들러를 수행하고 돌아옵니다. 이것을 이용해 Undefined Instruction 핸들러에 정의되지 않는 추가 명령어를 삽입해 소프트웨어 적으로 명령어를 확장시킬 수 있습니다. 각 익셉션 테이블에는 그냥 핸들러의 주소만 담고 있습니다. 이유는 각 하드웨어, 펌웨어마다 핸들러의 코드가 다르기 때문입니다. 정리 1. 익셉션 발생 시 프로그램 카운터(PC)를 익셉션 벡..

OS/Embedded OS

2장 개발 환경 구성하기

1. 개발 환경 구성하기 개발 환경은 윈도우, 맥, 리눅스 다 사용 가능합니다 윈도우 에서는 WSL을 리눅스와 맥은 거의 동일하게 작동합니다. 제 환경은 macOS Catalina Version 10.15.7 (Macbook Pro 2017)에서 진행합니다. 2. 컴파일러, QEMU설치하기 맥에서 코딩을 진행하지만 실제로 동작하는 OS의 하드웨어는 ARM 이기때문에 ARM용 컴파일러를 사용해야 합니다. 즉, 컴파일을 실행하는 환경 (macOS)과 컴파일의 결과물 (ARM)이 실행될 환경이 다를 경우 사용하는 것을크로스 컴파일러(cross-compiler)라고 합니다. “brew” 컴파일러를 설치하기전에 맥북에 brew를 설치해야 합니다. https://brew.sh 에서 설치를 진행합니다. 설치 스크립트..

gwanghwi.west
'OS/Embedded OS' 카테고리의 글 목록