<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Embedded Linux</title>
        <link>https://velog.io/</link>
        <description>Embedded Linux Engineer</description>
        <lastBuildDate>Mon, 22 May 2023 12:10:56 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>Embedded Linux</title>
            <url>https://velog.velcdn.com/images/skaskawl-_-/profile/c73b4b78-3f42-4465-b6bc-e46df2f740fe/social_profile.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. Embedded Linux. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/skaskawl-_-" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Linux Interrupt IRQ]]></title>
            <link>https://velog.io/@skaskawl-_-/Linux-Interrupt-IRQ</link>
            <guid>https://velog.io/@skaskawl-_-/Linux-Interrupt-IRQ</guid>
            <pubDate>Mon, 22 May 2023 12:10:56 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/skaskawl-_-/post/c2ff687e-6405-4295-8d02-169dd020553a/image.png" alt="">
<img src="https://velog.velcdn.com/images/skaskawl-_-/post/d22e4114-8fc0-48e5-8c20-fa5b844d5a8b/image.png" alt="">
<img src="https://velog.velcdn.com/images/skaskawl-_-/post/bd68378b-24aa-4345-8f3e-69820e3de709/image.png" alt="">
<img src="https://velog.velcdn.com/images/skaskawl-_-/post/47a8b902-d70a-4b09-b911-b67f5eba719e/image.png" alt="">
<img src="https://velog.velcdn.com/images/skaskawl-_-/post/07fdd2ee-f706-497a-94f9-f16bc842ed1c/image.png" alt="">
<img src="https://velog.velcdn.com/images/skaskawl-_-/post/8e8aeb0b-141d-4701-a093-9094e6cd5f4f/image.png" alt=""></p>
<p>[이미지 출처 : <a href="https://wogh8732.tistory.com/293%5D">https://wogh8732.tistory.com/293]</a></p>
<ul>
<li>Linux Interrupt</li>
</ul>
<p>Linux에서 IRQ(Interrupt Request)는 하드웨어 장치로부터 발생하는 인터럽트 신호를 처리하기 위한 메커니즘입니다. IRQ는 주로 입출력 장치, 타이머, 네트워크 카드 등의 하드웨어 장치로부터 발생합니다. IRQ 할당 및 동작은 다음과 같은 단계로 이루어집니다:</p>
<p>장치 인식: 운영체제는 부팅 과정에서 시스템의 하드웨어를 탐지하고 인식합니다. 이때, 각 장치의 IRQ 요구사항을 확인하고 운영체제에 등록합니다.</p>
<p>IRQ 할당: 운영체제는 인식된 장치에 대해 IRQ를 할당합니다. IRQ는 일반적으로 0부터 15까지의 숫자로 표현되며, 이는 인터럽트 컨트롤러(Interrupt Controller)에 의해 관리됩니다. IRQ는 장치의 요구사항과 시스템의 사용 가능한 IRQ 중에서 할당됩니다.</p>
<p>인터럽트 처리 루틴 등록: 운영체제는 인터럽트 처리를 위한 적절한 루틴(Interrupt Handler)을 등록합니다. 인터럽트 처리 루틴은 해당 IRQ에 대한 인터럽트가 발생했을 때 실행되는 코드로, 해당 장치의 동작을 처리하고 필요한 작업을 수행합니다.</p>
<p>인터럽트 서비스 루틴 실행: 하드웨어 장치에서 인터럽트 신호가 발생하면, 인터럽트 컨트롤러가 해당 IRQ에 대한 인터럽트 신호를 운영체제에 전달합니다. 운영체제는 해당 IRQ에 등록된 인터럽트 처리 루틴을 실행하여 실제로 인터럽트를 처리합니다. 이때, 현재 실행 중인 프로세스는 인터럽트 서비스 루틴이 실행되는 동안 일시적으로 중단됩니다.</p>
<p>인터럽트 처리: 인터럽트 서비스 루틴은 해당 장치의 상태를 확인하고 필요한 작업을 수행합니다. 예를 들어, 입출력 장치의 경우 데이터를 읽거나 쓰는 작업을 수행할 수 있습니다. 인터럽트 처리가 완료되면, 운영체제는 해당 장치를 다시 대기 상태로 전환하고 현재 실행 중이던 프로세스를 재개합니다.</p>
<p>IRQ 할당과 동작은 운영체제에서 관리되며, 하드웨어와의 인터페이스를 통해 인터럽트 처리를 수행합니다. 이를 가능하게 하기 위해 운영체제는 인터럽트 컨트롤러와 통신하여 인터럽트 신호를 수신하고 처리할 수 있습니다. 대표적으로 x86 아키텍처에서는 APIC (Advanced Programmable Interrupt Controller)을 사용하여 IRQ를 관리합니다.</p>
<p>APIC는 다수의 IRQ를 처리하기 위한 인터럽트 컨트롤러로, CPU에 내장되어 있습니다. 각 CPU는 로컬 APIC를 가지고 있으며, 시스템에는 IOAPIC(Input/Output Advanced Programmable Interrupt Controller)이라는 외부 APIC도 존재할 수 있습니다. IOAPIC는 입출력 장치로부터 발생하는 인터럽트를 처리하기 위한 기능을 제공합니다.</p>
<p>IRQ는 우선순위를 가지고 있으며, 운영체제는 우선순위와 IRQ 할당 정보를 APIC 레지스터에 설정합니다. 인터럽트가 발생하면 해당 IRQ에 대한 인터럽트 신호가 APIC로 전달되고, APIC는 우선순위에 따라 해당 IRQ를 운영체제에게 알립니다.</p>
<p>운영체제는 알림을 받으면 해당 IRQ에 등록된 인터럽트 처리 루틴을 실행합니다. 이때, 현재 실행 중인 프로세스는 일시적으로 중단되고 인터럽트 서비스 루틴이 실행됩니다. 인터럽트 서비스 루틴은 해당 장치의 상태를 확인하고 필요한 작업을 수행한 후, 인터럽트 처리를 완료합니다.</p>
<p>IRQ는 하드웨어 장치에 의해 발생하는 이벤트를 신속하게 처리하고 시스템의 성능과 효율성을 향상시키는 중요한 메커니즘입니다. Linux 운영체제는 IRQ를 효율적으로 할당하고 관리하여 다양한 하드웨어 장치와의 상호작용을 가능하게 합니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Linux Virtual Memory]]></title>
            <link>https://velog.io/@skaskawl-_-/VMemory</link>
            <guid>https://velog.io/@skaskawl-_-/VMemory</guid>
            <pubDate>Mon, 22 May 2023 12:04:54 GMT</pubDate>
            <description><![CDATA[<ul>
<li>Linux Virtual Memory</li>
</ul>
<p>Linux 커널에서 유저 프로세스를 실행할 때, 실행되는 가상 주소(address)가 모두 동일한 이유는 바로 가상 메모리(Virtual Memory) 시스템을 사용하기 때문입니다.</p>
<p>가상 메모리 시스템은 각 프로세스가 독립적인 가상 주소 공간을 가지도록 합니다. 프로세스는 자신만의 가상 주소 공간을 가지며, 이 가상 주소 공간은 실제 물리적인 메모리에 매핑되어야 합니다. 하지만 가상 주소 공간은 각 프로세스마다 독립적이므로, 프로세스마다 동일한 주소를 사용해도 서로 다른 메모리를 가리킬 수 있습니다.</p>
<p>따라서 유저 프로세스가 실행될 때, 커널은 해당 프로세스에게 독립적인 가상 주소 공간을 할당하고, 이 가상 주소 공간은 프로세스의 코드, 데이터, 스택 등을 포함합니다. 이 가상 주소 공간은 모든 프로세스에 대해 동일한 레이아웃을 가지며, 가상 주소 공간 내의 주소는 프로세스마다 독립적으로 매핑됩니다.</p>
<p>따라서 같은 가상 주소를 사용하는 모든 프로세스는 동일한 레이아웃을 가지며, 해당 주소에서 실행되는 코드는 각각의 프로세스마다 별도로 매핑된 실제 메모리 위치를 가리킵니다. 이를 통해 각 프로세스는 자신만의 독립적인 가상 주소 공간에서 실행될 수 있으며, 서로의 메모리 영역을 침범하지 않으면서 공유 라이브러리 등의 효율적인 공유도 가능해집니다.</p>
<ul>
<li>MMU 역할</li>
</ul>
<p>물리적인 메모리 주소에 접근하기 위한 전체적인 동작 흐름은 다음과 같습니다:</p>
<p>프로세스 실행: 유저 프로세스가 실행되기 위해 프로세스의 실행 파일이 메모리에 로드됩니다. 실행 파일은 실행 가능한 명령어 코드와 데이터를 포함하고 있습니다.</p>
<p>가상 주소 할당: 프로세스가 실행될 때, 운영체제는 해당 프로세스에게 독립적인 가상 주소 공간을 할당합니다. 가상 주소 공간은 일반적으로 32비트 또는 64비트 크기를 가지며, 여기에는 코드, 데이터, 스택 등이 포함됩니다.</p>
<p>가상 주소 변환: 프로세스는 가상 주소를 사용하여 메모리에 접근하게 됩니다. 프로세스가 가상 주소로 데이터에 접근하려고 하면, 이 가상 주소는 가상 메모리 관리 단위인 페이지(Page)로 분할됩니다. 페이지는 고정된 크기를 가지며 일반적으로 4KB입니다.</p>
<p>페이지 테이블 접근: 가상 주소의 페이지 번호를 사용하여 해당 페이지의 물리적인 메모리 위치를 찾기 위해 페이지 테이블을 사용합니다. 페이지 테이블은 가상 주소 공간과 물리 주소 공간 간의 매핑 정보를 담고 있습니다. 페이지 테이블은 계층 구조로 구성되어 있으며, 각 계층은 페이지 번호의 일부를 사용하여 물리 주소로의 매핑을 찾습니다.</p>
<p>MMU(Memory Management Unit)를 통한 주소 변환: MMU는 가상 주소를 물리 주소로 변환하는 역할을 합니다. MMU는 페이지 테이블을 사용하여 가상 주소의 페이지 번호를 물리 주소로 변환합니다. 변환된 물리 주소는 실제 메모리에서 해당 데이터의 위치를 나타냅니다.</p>
<p>물리 주소 접근: 변환된 물리 주소를 사용하여 데이터에 접근합니다. 이 때, CPU는 메모리 버스를 통해 물리 메모리에 직접적으로 접근하여 데이터를 읽거나 쓸 수 있습니다.</p>
<p>위의 과정을 통해 가상 주소에서 물리 주소로의 변환이 이루어지며, 유저 프로세스는 가상 주소를 사용하여 데이터에 접근하고 실제로는 물리 주소를 통해 메모리에 접근하게 됩니다. 이를 가능하게 하는 것이 가상 메모리 시스템과 MMU의 역할입니다.</p>
]]></description>
        </item>
    </channel>
</rss>