[논문 리뷰] Enhanced Configurable Snapshot: Snapshot-based Fast Booting on NAND Flash with Lifetime Control
·
Embedded Systems
Abstract연구 배경: 빠른 부팅 방식인 영구 메모리 부팅은 아직 상용화 하기엔 이르다>많은 소비자 전자기기에서 사용자 경험을 개선하기 위한 빠른 boot time은 이제 주된 이슈가 되었다. 영구 메모리를 사용한 즉각적인 on/off는 1초 미만의 부팅을 주장하지만, 기술적 성숙도는 여전히 진행중이고 가격은 현실적인 수준에 도달하지 못하였다. 따라서, NAND flash를 사용한 스냅샷 기반 부팅은 현재 소비자 산업에서 매력적인 솔루션이다. 그러나 스냅샷 기반 부팅 기술은 스냅샷 이미지를 저장할 때 NAND flash 메모리와 같은 기본 스토리지 장치에 추가적인 write를 발생시킨다. 따라서 NAND flash 메모리에 이 기술을 나이브하게 적용하면 NAND flash의 제한된 수명으로 신뢰성 문..
[Linux] BBB Linux boot time 최적화 #0
·
Embedded Systems/리눅스
Udemy의 임베디드 리눅스 강의와, '임베디드 리눅스 프로그래밍 완전정복' 책을 병행해 공부해보며, 단순히 지식을 주입받고있는 것 같다는 느낌을 받았다.더 효율적으로 공부할 수 있는 방법이 뭐가 있을까 생각해보다가, 일단 프로젝트를 해보면서 부딪히는게 좋겠다는 생각이 들어 임베디드 리눅스 관련 프로젝트를 수행해보기로 마음먹었다. 과제는 내가 가장 관심있는 커널 영역의 지식을 활용해야하는, 비글본 블랙의 리눅스 커널 부팅타임을 감소시키는 것이다. 가장 먼저 선행연구 자료를 조사하였다.https://bootlin.com/doc/training/boot-time/boot-time-slides.pdf (이어서 작성 예정)
[Linux] U-boot 가 리눅스 커널을 로드하는 구체적인 과정 정리(1)
·
Embedded Systems/리눅스
리눅스 부팅시, 부트로더는 구체적으로 어떤 절차를 거쳐 메모리에 리눅스 커널을 로드하는 건지 알아보았다. 실행되는 파일로 구분해본 리눅스 부팅과정 flow-chartU-boot가 리눅스의 bootstrap loader에 있는 `head.s` 파일에게 제어를 넘긴다.`head.s`는 압축된 커널 이미지의 압축 해제를 위해, 같은 bootstrap loader에 위치한 `misc.c` 파일을 호출한다.다음으로 제어권은 리눅스 커널에 위치한 또다른 `head.s`파일로 넘어간다.제어권은 `head-common.c` 파일을 거쳐, 리눅스 커널의 `main.c` 파일로 넘어간다.`main.c` 로부터, 리눅스 커널의 첫번째 appliction인 `init`이 실행된다!U-boot(bootloader)가 linux..
[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는 다음과 같이 유닉스 계열 운영체제에..
[세미나] "Fundamentals of embedded linux" NDC TechTown 2022.11
·
Insights/Seminar !
https://youtu.be/BdKyq56Cijo?si=vzkmvPCDzcLH8ri0책 "Mastering Embedded Linux Programming" 의 저자중 한분이신 Chris Simmons 개발자님의 "Fundamentals of embedded linux(2022)"강연을 정리해 보았다. Why Embedded Linux?왜 임베디드 리눅스를 써야할까?1. Moore's law : 무어의 법칙에 따라 Chip들은 굉장히 복잡해지고있다. 따라서, 이런 복잡한 칩을 사용하는 현대 디바이스들을 적절히 활용하기 위해선 복잡한 시스템인 리눅스가 필요하다.2. 리눅스는 무료다 : 소스코드를 다운받아 수정하는 것 모두가 무료이다.3. 기능적이다 : 많은 범위의 HW들을 지원한다.4. 최신식 SW이다 ..
[운영체제] '파일 시스템'이란 무엇인가? (파일 시스템, 파일 관리자, 파일 테이블, 파일 디스크립터, 파일 헤더)
·
소프트웨어/운영체제
디스크를 포맷해본 경험이 있다면 한번쯤은 봤을 메뉴화면이다. FAT32, NTFS 그리고 리눅스의 경우 ext2, ext3. 파일 시스템이란 무엇인가? 파일 시스템? 파일 관리자? 파일 디스크립터??운영체제는 사용자가 다른 사용자의 파일을 훼손하는 경우를 방지하기 위해 '응용 프로그램의 직접적인 파일 접근을 불허'한다. 그 대신, 파일을 관리하고 보관하는 '파일 관리자'를 두어 저장장치의 관리를 맡기는데 이를 '파일 시스템'이라고 한다. 가상 메모리에서 MMU(메모리 관리 유닛)가 메모리 매핑 테이블을 이용해 가상 주소를 물리 주소로 변환하듯, 저장장치는 파일 시스템의 '파일 관리자'라는 녀석이 '파일 테이블'을 사용해 파일의 생성, 수정, 삭제 등을 수행한다. 또한 사용자가 파일을 사용하고자 할 때 읽..
[컴퓨터 구조] 최고의 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가 어떻게 구성되는지까지 간단한 도식으로..
[운영체제] '이미지'란 무엇인가? (디스크 이미지, 커널 이미지)
·
소프트웨어/운영체제
임베디드 리눅스 공부를 하면서, 계속해서 '이미지'라는 말이 나오는데 한번도 이미지가 무엇인지 명료하게 정리한 적이 없는 것 같아 이해에 어려움이 있었다. 디스크, 커널 의 맥락에서 '이미지'란 무엇인지 정리하여 향후 개념을 이해하는데에 어려움이 없도록 대비하고자 정리하여 글을 쓴다. 글쓰기의 용이함에 맞추어 개념을 넓혀가며 이해하는 방식으로 글을 써봤다. 우선 결론은,disk image는 원본 소스와 데이터 구조까지 100% 동일한 드라이브의 압축본 이고kernel image는 부팅 시 kernel을 메모리에 올리기 위해 필요한 "리눅스 커널을 컴파일한 실행파일"을 의미하는 것이다. 디스크 이미지, 커널 이미지?사진이 아닌 '이미지'를 생각했을 때 가장 먼저 떠오르는 단어는 '디스크 이미지'와 '커널..
[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 제어기는 시작하지 않았기에 메모리에는 접근할..
[C언어] const 키워드
·
소프트웨어/C
const 키워드를 사용하면 변수를 상수로 사용할 수 있다. 다시말해, const 변수에 할당된 값을 변경할 수 없게된다. const 상수화를 사용하는 이유는, 레지스터 주소와 같이 고정되어 있어야 할 값을 변경하는 실수를 미연에 방지하기 위해서이다. 사용 예시!const int a = 1;a = 0; //
[C] void* 포인터
·
소프트웨어/C
전문가를 위한 C 책을 보다가, 다음과 같은 함수를 만났다. void* thread_body(void* arg){ printf("Hello from first thread!"); return NULL;}음... 이전에 void형 포인터를 공부한 적이 있었는데 까먹었다.. 이참에 확실히 정리해두고자 한다. int a = 10;int* b = &a;이 코드를 말로 풀어 설명하면 "b는 a의 주소를 저장하는데, 그 주소에는 int형 데이터가 있다." 이다. 맞는 말이다.int a=10;void* b=&a;이번엔 이 코드를 풀어 설명하면 "b는 a의 주소를 저장하는데, 그 주소에는 void형 데이터가 있다." 이다.그런데... void는 값이 없음을 의미하는 심볼이 아니던가? 컴퓨터는 자료형을 모르기 때..
[C] 분할 컴파일
·
카테고리 없음
하나의 프로그램을 여러 사람이 나누어 개발할 수 있다면 프로그램의 크기가 커도 충분히 개발 기간을 줄일 수 있다. 단 2가지 문제를 해결해야 한다.하나는 개별적으로 코드를 작성하고 컴파일 및 에러 수정을 할 수 있어야 한다. 두 번째는 각 개발자들 간의 데이터 공유와 코드 재활용이 가능해야 한다. C언어는 분할 컴파일을 통해 여러 개의 소스 코드를 각각 독립적으로 작성하고 컴파일 할 수 있으며 컴파일된 개체 파일을 링크해 하나의 큰 프로그램으로 만들 수 있다.또한 extern 선언을 통해 파일들 간 데이터를 공유하고 전처리 지시자로 코드를 쉽게 재활용할 수 있다. 분할 컴파일을 위해 파일을 나눌 땐 주의할 것이 있다. 각 파일을 독립적으로 컴파일 할 수 있도록 필요한 선언을 포함해야 한다는 것이다. 즉..
[C] 헤더파일에 대하여
·
소프트웨어/C
"헤더 파일을 사용하면 프로그램을 깔끔하고 편하게 작성할 수 있습니다. 보통 하나의 프로그램은 독립적으로 컴파일 가능한 파일 단위인 module로 나누어 분할 컴파일합니다. 따라서 각 모듈이 같이 사용하는 구조체나 함수 또는 전역 변수를 하나의 헤더 파일로 만들면 필요한 모듈에서 쉽게 포함하여 쓸 수 있습니다. 이 경우 헤더 파일의 내용이 수정되더라도 컴파일만 다시 하면 수정된 내용이 모든 파일에 동시에 적용되므로 빠르고 정확하게 수정할 수 있습니다."책 혼자서 공부하는 C언어 p559 "#include는 사실 파일의 내용을 단순히 복사하여 붙여넣는 기능을 합니다. 따라서 텍스트 형태의 파일이면 모두 사용할 수 있습니다. 심지어 소스 파일을 포함할 수도 있습니다. 예를 들어 다음과 같이 main 함수의 ..