[Linux] 디바이스 드라이버란 무엇일까?
·
Embedded Systems/리눅스
디바이스 드라이버란?디바이스 드라이버(device driver)란, 하드웨어를 제어하기 위해 하드웨어 특성이나 레지스터 설정 등 디바이스 제어를 위한 기능을 담고 있는 layer로, 리눅스에선 커널의 일부분으로 구성된다. 디바이스 드라이버는 디바이스 관리에 필요한 정형화된 인터페이스를 구현하기 위해 필요한 함수와 자료구조의 집합체로, 리눅스 커널에서 동일 디바이스끼리 비슷한 서비스를 제공하기 위해 커널 내에서 관련 기능을 제공한다. 사용자 영역의 디바이스들은 커널 영역에서의 실제 디바이스들과 매핑되어야 한다. 디바이스 드라이버는 추상화 개념을 제공해야 하는데, 애플리케이션 관점에서 해당 디바이스에 대한 자세한 구현은 알 필요가 없이 파일 시스템으로 접근할 수 있어야 한다. 디바이스 드라이버는 디바이스를 ..
[Linux] 리눅스의 프로그래밍 도구 (GCC, make, gdb 유틸리티)
·
Embedded Systems/리눅스
리눅스의 프로그래밍 도구인 GCC, make, gdb가 무엇인지 정리해본다.Reference: [책] 사물인터넷을 위한 리눅스 프로그래밍 with 라즈베리파이, 78-104 1. GCC (GNU Compiler Collection)GCC란 무엇일까? 정확하게 알아보자.GCC(GNU Compiler Collection)를 알기 위해선 GNU가 무엇인지부터 알아야겠다.GNU 홈페이지의 정의를 살펴보았다. "GNU는 여러 사람들이 합작으로 만든 운영체제이며, GNU의 주된 목적은 100% 무료로 유닉스 운영체제에 호환 가능한 시스템을 제공하는데에 있다고 한다."다시말해, GCC는 유닉스 계열 운영체제에 호환 가능한 100% 무료인 오픈소스 컴파일러 모음집인 것이다. GCC는 다음과 같이 유닉스 계열 운영체제에..
[컴퓨터 구조] 최고의 ALU 내부 로직 설명 영상
·
Embedded Systems/MCU 기본
아래 3가지 영상을 보고 ALU 원리를 (마침내)직관적으로 이해하게 되었다. ALU 작동 원리를 복습하던 중, 유튜브에서 명료하게 동작을 이해할 수 있는 소스를 찾고있었다. 그러던 중 직관적으로 ALU의 동작과 SRAM의 동작을 트렌지스터 레벨로 설명하는 core dumped라는 유튜버의 영상을 찾았다. 영상은 작은 트렌지스터로의 동작 원리로 부터 AND OR NOT 게이트의 원리를 설명한다. 그리고 XOR과 Binary Decoder, Gated Latch를 설명한 뒤, 이 것들을 활용해 Full Adder 와 Full Subtractor, N-bits Register, MUX, N-Bit Adder 가 어떻게 구성되는지 설명해주었다. 마지막으로 SRAM과 ALU가 어떻게 구성되는지까지 간단한 도식으로..
[linux] gcc를 이용한 소스 코드 빌드 과정
·
Embedded Systems/리눅스
gcc를 이용한 소스 코드 빌드 과정을 그림으로 그려봤다.linux에서 gcc 컴파일러를 이용한 소스코드 빌드 과정은 windows의 빌드와 동일하게 컴파일과 링크 과정으로 나눌 수 있다.컴파일 과정은 소스코드를 어셈블리어인 목적 파일(object code)로 만드는 과정이다.그 순서는 가장 먼저 #include나 #define과 같은 전처리기들을 처리한 뒤, ccl이라는 컴파일러와 as라는 어셈블러를 통해 목적 파일을 생성한다. 이 때 stdio.h나 unistd.h 같은 헤더 파일이 별도로 필요하다. 링크는 여러 목적 파일들을 묶어 하나의 실행파일로 만드는 과정이다. 링크를 할 때는 정적 혹은 공유 라이브러리가 필요하다.링크 과정이 끝나면 실행파일(a.out)이 생성된다!
부트로더(bootloader)란 무엇인가?
·
Embedded Systems/리눅스
부트로더는 OS가 시동되기 이전에 미리 실행되면서 kernel이 올바르게 시동되기 위해 필요한 모든 관련 작업을 마무리 하고 최종적으로 OS를 시동시키기 위한 목적을 가진 프로그램을 말한다.즉, 메모리 / 하드웨어(네트워크, 프로세스 속도, 인터럽트), 코드&데이터&스택 영역 설정 및 초기화 / 커널 로더 로딩 / 커널 이미지 로딩 / 커널 로더를 실행해 커널 이미지를 메모리에 올리기를 수행한다.다시 말해, 임베디드 리눅스 시스템에서 부트로더는 시스템을 기본 수준(basic level)으로 초기화하고 커널을 로드하는 두 가지 주요 작업을 수행한다고 할 수 있다. 전원을 켜거나 리셋한 뒤 부트로더 코드의 첫 줄이 실행될 때, 시스템은 초기 상태에 있다. DRAM 제어기는 시작하지 않았기에 메모리에는 접근할..