라즈베리파이를 써온지도 1년이 다 되어가고, 앵간한 에러를 다 삽질해본 입장에서 내린 결론은 "리눅스는 원리 파악이 중요하다" 였다. 각 디렉토리의 구조와 bash등이 명령어를 해석하는 구조, system.d 등을 알아야 무의미한 삽질을 멈출 수 있다. 따라서 1년간 삽질하며 얻은 라즈베리파이 관련 지식을 풀어서 정리해볼까 한다. 첫 번째는 시스템이 어떻게 이루어져 있는지에 관한 것이다.
유저 모드와 커널 모드, 그리고 하드웨어
리눅스는 어떻게 cpu, gpu, ram 등을 작동시키는가? C의 컴파일 구조를 보면 컴파일러와 링커가 존재하고, 이를 통해 코드를 기계어로 번역한다. 그러나 C는 하이레벨 언어인 것이, 운영체제 내의 컴파일러가 CPU의 연산과 RAM 할당을 컴파일 과정에서 수행한다. 더 저수준 언어인 어셈블리어를 보면, cpu의 아키텍쳐가 변수 하나만 저장할만한 작은 캐싱 공간과 덧셈 등 연산의 논리 게이트로 이루어져 있음을 알 수 있다. 이 말인 즉슨, 캐싱과 논리 게이트가 작동할 수 있도록 번역하는 작업을 운영체제에서 해줘야 한다는 말이 된다.
1. 커널 모드 (리눅스 커널)
원초적으로, cpu는 운영체제가 하는 작업에 대해 알지 못한다. cpu의 캐싱공간은 매우 작아서, 정수 두 개를 저장한 다음, 논리게이트의 결과값을 저장하는 구조로 되어있다. 다음 연산을 수행하면 정수 두 개를 저장하는 공간은 덮어쓰기되고, 결과값 또한 RAM으로 보내지 않으면 사라진다. 리눅스가 하는 역할은 cpu의 연산값을 ram의 특정 주소에 할당하는 것부터 시작해서 거의 모든 부분을 담당한다고 볼 수 있다.
1.1 리눅스 하위 시스템
하위시스템은 어떻게 방대한 양의 시스템 자원을 관리할 것인가에 대한 것을 주로 다룬다.
1. 프로세스 스케줄링 하위시스템
어셈블리의 경우에는 멀티코어에 대한 개념이 없다. 따라서 프로세스 스케줄링 또한 리눅스의 몫이다. 마찬가지로 cpu의 캐싱을 각 코어와 스레드에 할당하고, 실행되어야 하는 코드가 충돌하지 않도록 순서를 정하는 것이다.
2. 메모리 관리 하위시스템
cpu에서 계산을 완료했으면 (대부분의 경우) 메모리에 결과값을 할당해야 하는데, 이때 이 시스템을 이용한다.
3. IPC, 가상 파일, 네트워크 하위시스템
계산과 저장 이외에도 리눅스 커널에는 각각의 기능을 위한 하위시스템이 존재한다.
1.2 시스템 호출 인터페이스
시스템 호출 인터페이스는 응용프로그램이 시스템에 접근하기 위해 만들어진 명령어 세트다. c언어에서 보면 stdio.h(표준 입출력 라이브러리) 명령어 세트를 쓰는 것을 볼 수 있는데, 이의 하위호환으로 이 인터페이스가 기능한다. 이처럼 시스템에 대해 직접적인 연산 수행을 명령하는 인터페이스다. 예를 들어, hello world를 bash에 친다고 해보면, 픽셀 하나하나의 값부터 정수 등이 모두 따로따로 호출되어 출력값을 완료하게 된다.
명령어는 stat, splice, dup, read, open, Ioctl, write, mmap, close, exit 등, 약 380개가 있다고 한다. (위키백과 참고)
2. 사용자 모드
2.1 C 표준 라이브러리
앞서 말한 stdio.h가 여기에 해당한다. 2000개가 넘는 명령어 셋을 가진다.
2.2 저수준 시스템 구성요소
1. 시스템 데몬
시스템에 관한 구성요소이며, 주로 응용프로그램을 지원하는 목적으로 사용된다. systemd는 모든 프로세스를 관리함으로써 사용자 공간을 구성한다. D-Bus Daemon은 프로세스간 통신을 담당한다. udisks는 D-Bus 기반 통신의 인터페이스를 제공한다. avahi-Daemon은 DHCP가 없는 네트워크 환경을 구축한다. packaged는 소프트웨어의 업데이트와 설치를 담당하는 인터페이스다. PulseAudio-d는 사운드 서버고, network는 네트워크 매니저가 되겠다.
2. 윈도 시스템
창을 보여지게 하는 역할을 한다. X11, Wayland 등이 있다.
3. 기타 라이브러리
GTK+, Qt, EFL, SDL, SFML, FLTK, 그누스텝 등이 있다. 디스플레이에 GUI를 띄우고 인터렉션을 받는 역할을 한다.
4. 그래픽스
GPU와 호환되게 하는 드라이버다.
2.3 사용자 어플리케이션
응용프로그램 레벨로써 bash, 웹 브라우저나 우리가 설치하는 각종 프로그램들이 여기에 해당한다.
'프로젝트 > 설명' 카테고리의 다른 글
Nextcloud Docker Compose (Nginx + MariaDB 조합) 셋업 (0) | 2024.02.03 |
---|---|
카페24 쇼핑몰 3. 스마트 디자인 이해하기 (1) | 2021.10.22 |
카페24 쇼핑몰 2. 개발환경 세팅하기(FTP) (0) | 2021.10.22 |
카페24 쇼핑몰 1. 시작하기 (0) | 2021.10.22 |
디스코드봇 6. 코드의 원리 파악하기 (3) 객체 지향과 공식문서 활용법 (0) | 2020.12.20 |