# 실시간 리눅스 커널 설치

실시간 리눅스 커널을 설치하기 위해서는 기존의 리눅스 커널을 패치하거나, 이미 실시간 패치가 적용된 커널을 다운로드하고 설치해야 한다. 여기에서는 RT-Preempt 패치를 이용하여 실시간 커널을 설치하는 과정을 설명하겠다.

**1. 기본 패키지 설치**

먼저, 커널 컴파일에 필요한 기본 패키지들을 설치해야 한다.

```bash
sudo apt-get update
sudo apt-get install build-essential libncurses-dev bison flex libssl-dev libelf-dev
```

**2. 커널 소스 코드 다운로드**

다음으로, 리눅스 커널의 소스 코드를 다운로드한다. 최신 커널 소스 코드는 [kernel.org](https://www.kernel.org)에서 확인할 수 있다.

```bash
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.4.tar.xz
tar -xvf linux-5.4.tar.xz
cd linux-5.4
```

**3. RT-Preempt 패치 다운로드**

리눅스 커널을 실시간으로 패치하기 위해 RT-Preempt 패치를 다운로드한다. RT-Preempt 패치는 [RT-Preempt 사이트](https://wiki.linuxfoundation.org/realtime/start)에서 확인할 수 있다.

```bash
wget https://cdn.kernel.org/pub/linux/kernel/projects/rt/5.4/patch-5.4.60-rt37.patch.xz
xz -d patch-5.4.60-rt37.patch.xz
patch -p1 < patch-5.4.60-rt37.patch
```

**4. 커널 구성**

실시간 커널을 구성하기 위해 메뉴 구성을 시작한다. 이 단계에서는 실시간 옵션을 활성화해야 한다.

```bash
make menuconfig
```

`Processor type and features` 섹션으로 이동하여 `Preemption Model`을 `Fully Preemptible Kernel (RT)`로 설정한다. 그 외 필요한 설정을 완료한다.

**5. 커널 컴파일 및 설치**

이제 실시간 커널을 컴파일하고 설치한다. 이 과정은 다소 시간이 걸릴 수 있다.

```bash
make -j$(nproc)
sudo make modules_install
sudo make install
```

**6. 부트로더 업데이트**

부트로더를 업데이트하여 새로 설치한 커널을 부팅할 수 있도록 설정한다. `grub`을 사용하는 경우 아래 명령어를 실행한다.

```bash
sudo update-grub
```

**7. 시스템 재부팅**

이제 시스템을 재부팅하여 실시간 커널로 부팅한다.

```bash
sudo reboot
```

**8. 커널 확인**

재부팅 후, 새로운 커널이 정상적으로 적용되었는지 확인한다.

```bash
uname -r
```

결과에 `rt` 문자가 포함되어 있으면 실시간 커널이 제대로 설치된 것이다.

#### 실시간 태스크 스케줄링

리눅스에서 실시간 태스크 스케줄링을 사용하려면 태스크의 우선순위를 설정하고, 필요한 경우 적절한 스케줄링 정책을 적용해야 한다.

**1. 실시간 우선순위 설정**

실시간 프로세스는 표준 프로세스보다 높은 우선순위를 가질 수 있다. 이는 `chrt` 명령을 사용하여 설정할 수 있다. 예를 들어, 특정 PID를 가진 프로세스를 실시간 우선순위 50으로 설정하려면 다음과 같이 한다.

```bash
sudo chrt -f -p 50 <PID>
```

여기서 `-f` 옵션은 FIFO (First In First Out) 스케줄링 정책을 지정한다. FIFO 정책 외에도 `-r` 옵션을 사용하여 RR (Round Robin) 정책을 지정할 수 있다.

**2. 실시간 스케줄링 정책 적용**

리눅스 실시간 스케줄링 정책에는 주로 두 가지가 있다: FIFO (First In First Out)와 RR (Round Robin). 이 두 정책 모두 실시간 우선순위를 가진 프로세스를 관리하기 위한 것이다.

**FIFO 스케줄링**

FIFO 스케줄링에서는 높은 우선순위를 가진 태스크가 종료되거나 자신이 원할 때까지 실행되며, 우선순위가 같은 태스크 간에는 먼저 대기한 순서대로 실행된다.

**RR 스케줄링**

RR 스케줄링에서는 FIFO와 마찬가지로 높은 우선순위를 가진 태스크가 우선 실행되지만, 동일 우선순위의 태스크 간에는 시간 할당량(Time Quantum)을 두고 순환적으로 실행된다.

**3. C 프로그래밍 예제**

실시간 프로세스를 만들고 관리하는 간단한 C 코드 예제를 살펴봅시다. 이 예제는 `sched_setscheduler` 함수를 사용하여 실시간 스케줄링을 설정한다.

```c
#include <stdio.h>
#include <stdlib.h>
#include <sched.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
    struct sched_param param;
    int max_priority = sched_get_priority_max(SCHED_FIFO);

    param.sched_priority = max_priority;

    if (sched_setscheduler(0, SCHED_FIFO, &param) == -1) {
        perror("sched_setscheduler failed");
        exit(EXIT_FAILURE);
    }

    printf("Running with real-time priority %d\n", max_priority);

    while (1) {
        // 실시간 작업 수행
        printf("Real-time task running...\n");
        sleep(1);
    }

    return 0;
}
```

이 코드는 현재 프로세스를 SCHED\_FIFO 정책으로 설정하고, 최대 우선순위로 실행한다. 그런 다음 무한 루프로 들어가서 매 초마다 메시지를 출력한다.

#### 리눅스 실시간 성능 측정 도구

실시간 성능을 측정하고 튜닝하기 위해 여러 도구를 사용할 수 있다. 대표적인 예로 `cyclictest`와 `latencytop` 등이 있다.

**1. cyclictest**

`cyclictest`는 주기적인 타이머를 사용하여 시스템 지연을 측정하는 도구이다. 이를 통해 실시간 성능을 평가할 수 있다.

```bash
sudo apt-get install rt-tests
sudo cyclictest -m -Sp90 -i 1000 -h 100 -l 10000
```

이 명령은 1000 마이크로초 간격으로 10000회 측정을 수행하며, 최대 지연 시간을 100 마이크로초로 설정한다.

**2. latencytop**

`latencytop`은 시스템 지연의 원인을 분석하는 데 도움이 되는 도구이다. 이는 실시간 시스템에서 성능 문제를 진단하는 데 유용하다.

```bash
sudo apt-get install latencytop
sudo latencytop
```

`latencytop`은 실시간으로 시스템의 지연 현상을 모니터링하고 원인을 분석해준다.

이상으로 실시간 리눅스 환경 설정과 관련된 주요 내용을 다루었다. 다음은 실시간 제어 소프트웨어 개발에 대해 알아보겠다.
