<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>labda-dev.log</title>
        <link>https://velog.io/</link>
        <description>아는거 없는 찌끄레기가 끄적끄적</description>
        <lastBuildDate>Wed, 10 Nov 2021 13:42:54 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>labda-dev.log</title>
            <url>https://images.velog.io/images/labda-dev/profile/ba0cae16-abfb-424d-9165-e1fbdf310e81/밸로그_캐릭터.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. labda-dev.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/labda-dev" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[인터럽트 (Interrupt)]]></title>
            <link>https://velog.io/@labda-dev/%EC%9D%B8%ED%84%B0%EB%9F%BD%ED%8A%B8-Interrupt</link>
            <guid>https://velog.io/@labda-dev/%EC%9D%B8%ED%84%B0%EB%9F%BD%ED%8A%B8-Interrupt</guid>
            <pubDate>Wed, 10 Nov 2021 13:42:54 GMT</pubDate>
            <description><![CDATA[<p>친구에게 물었다.</p>
<blockquote>
<p><strong>&quot;니가 마우스로 롤 아이콘을 더블 클릭해. 그럼 무슨 일이 일어날까?&quot;</strong></p>
</blockquote>
<p>친구는 말했다.</p>
<blockquote>
<p><strong>&quot;파일을 실행해&quot;</strong></p>
</blockquote>
<p>과연 파일을 실행하는 과정에는 얼마나 다양한 일들이 일어날까?<br>일단 크롬으로 유튜브를 보고 있는 상황이라고 가정하고 시작해보자.</p>
<h3 id="1-마우스-이동">1. 마우스 이동</h3>
<p>마우스와 같은 사용자의 입력 장치에 딜레이를 최소화하여 바로바로 반응하는 것은 꽤나 중요한 문제다.<br>딜레이가 길다면 PC를 사용하는 사용자 입장에서는 특히 한국인들은 답답함을 느낄 수 밖에 없을 것이다.<br>결국 마우스와 같은 입력 장치에 대한 처리(마우스 움직임을 커서에 반영하는 것)는 굉장히 우선순위가 높은 일 중 하나다.</p>
<p>따라서 마우스가 움직이게 되면 연결된 usb 케이블을 통해 cpu에게 &#39;<U>핫라인</U>&#39;으로 알리게 된다.</p>
<blockquote>
<p><strong>&quot;빨리 하던거 멈추고 나부터 해줘! 급해!&quot;</strong></p>
</blockquote>
<p>급하다는 알림을 받은 cpu는 일단 나중에 써먹기 위해 크롬의 &#39;<U>현재 상태를 저장(백업)</U>&#39;한다.<br>그리고 cpu가 가진 여러 개의 &#39;<U>핫라인</U>&#39; 중 몇 번째 핫라인에서 누구에게 알림이 온지 확인한다.<br>USB를 통해 마우스에게서 알림이 왔다는 것을 확인한 cpu는 &#39;<U>긴급 대응 매뉴얼</U>&#39;에서 &#39;<U>USB 마우스한테 알림왔을 때 대응 방법</U>&#39;을 찾고 실행한다.</p>
<p>그렇다면 &#39;<U>USB 마우스에게 알림왔을 때 대응 방법</U>&#39;에는 어떤 내용이 적혀있을까.<br>일단 USB를 통해서 마우스에게 &#39;<U>물어본다</U>&#39;.</p>
<blockquote>
<p><strong>&quot;너 지금 뭐했어?&quot;</strong></p>
</blockquote>
<p>마우스가 대답해온다.</p>
<blockquote>
<p><strong>&quot;나 지금 오른쪽으로 X만큼 아래쪽으로 Y만큼 움직였어!&quot;</strong></p>
</blockquote>
<p>그렇게 cpu는 마우스에게 (X, Y, 이동) 이라는 정보를 전달받았다.<br>전달받은 정보를 이용하여 모니터 픽셀에서 커서를 옮기라고 그래픽 카드에게 요청하게 된다.<br>그리고 아까 &#39;<U>상태를 저장(백업)</U>&#39;해뒀던 크롬의 상태를 다시 가져와서 유튜브 영상을 이어서 재생한다.</p>
<hr>
<p>이러한 과정이 <strong>인터럽트(Interrupt)가 발생했을 때의 동작 과정</strong>이다!</p>
<p>각 파트의 실제 명칭을 이용하여 인터럽트에 대해 설명하면 다음과 같다.  </p>
<hr>
<p><strong>1. 마우스가 움직이게 되면 연결된 usb 케이블을 통해 cpu에게 &#39;핫라인&#39;으로 알리게 된다.</strong></p>
<p>마우스와 같은 입력 장치가 동작해서 그 동작이 Host PC에 반영해야하는 상황이 되면 <U>IRQ(Interrupt ReQuest)</U>가 발생하게된다.<br>IRQ는 cpu 칩에 존재하는 물리적인 IRQ 핀(Interrupt ReQuests line)에 전기 신호가 발생하는 것으로 cpu에 인터럽트 요청을 전달한다.</p>
<blockquote>
<p>IRQ는 일반적으로 인터럽트 요청 자체의 의미와 물리적인 핀(장소)의 의미가 혼용되어 사용된다.</p>
</blockquote>
<p>일반적인 범용 PC에서는 16개의 IRQ가 있으며 ps/2, Serial, COM 등 cpu 설계 과정에서부터 픽스된 케이스와 적절히 USB 등이 할당되는 예비용으로 비워둔 IRQ가 존재한다.</p>
<p>상기 케이스에서는 USB가 연결되어 있는 IRQ(일반적으로 IRQ9)에 전기 신호가 발생해 인터럽트 요청이 발생된다.</p>
<p>그렇다면 마우스는 어떻게 USB를 거쳐 cpu의 IRQ까지 어떻게 신호를 보낼 수 있을까?<br>해당 내용은 이 포스팅 마지막에서 아주 잠깐 간단하게 다루도록 하겠다.
<br></p>
<p><strong>2. 급하다는 알림을 받은 CPU는 일단 나중에 써먹기 위해 크롬의 &#39;현재 상태를 저장(백업)&#39;한다.</strong></p>
<p>해당 내용은 아래 <strong>5번</strong>에서 함께 다룬다.
<br></p>
<p><strong>3. USB를 통해 마우스에게서 알림이 왔다는 것을 확인한 cpu는 &#39;긴급 대응 매뉴얼&#39;에서 &#39;USB 마우스한테 알림왔을 때 대응 방법&#39;을 찾고 실행한다.</strong></p>
<p>&#39;긴급 대응 매뉴얼&#39;은 당연히 긴급하게 처리해야하는 대상과 각 대상에 맞는 적절한 대응 방법이 적혀있을 것이다.</p>
<p>마찬가지다.</p>
<p>&#39;긴급 대응 매뉴얼&#39;은 일반적으로 <U>인터럽트 벡터 테이블(Interrupt Vector Table)</U>이라고 불리며 &#39;긴급 처리 대상&#39;인 <U>인터럽트의 유형</U>과 &#39;적절한 대응 방법&#39;인 <U>인터럽트 핸들러(Interrupt Handler)</U>로 구성되어 있다.</p>
<blockquote>
<p>인터럽트 핸들러는 ISR(Interrupt Service Routine)이라고도 불린다.</p>
</blockquote>
<p>이러한 인터럽트 핸들러는 커널에 기본적으로 정의되어 박혀있거나 디바이스 드라이버 등을 통해 추가적으로 등록된다.<br>결국 IVT에 등록된 핸들러 중 발생한 인터럽트에 대해 적절한 인터럽트 핸들러를 실행시키게 되는 것이다.
<br></p>
<p><strong>4. 그렇다면 &#39;USB 마우스에게 알림왔을 때 대응 방법&#39;에는 어떤 내용이 적혀있을까.</strong></p>
<p>자연스럽게 마우스로부터 받은 데이터의 유형에 따라 핸들러에서 적절하게 처리할 것이다.<br>상기 케이스의 경우에는 &#39;마우스의 이동&#39;에 대한 데이터를 수신했을 것이다.  </p>
<p>그렇다면 마우스가 이동한 X, Y축 정보와 더불어 마우스의 감도, 마우스 가속 여부 등의 여러 정보를 종합하여 마우스가 이동할 픽셀을 계산할 것이고 계산된 픽셀만큼 커서를 이동시키도록 그래픽 작업을 GPU에게 요청하게 될 것이다.
<br></p>
<p><strong>5. 그리고 아까 &#39;상태를 저장(백업)&#39;해뒀던 크롬의 상태를 다시 가져와서 유튜브 영상을 이어서 재생한다.</strong></p>
<p>이렇게 인터럽트 발생 시 상태를 저장하고, 인터럽트에 대한 처리가 완료되면 저장했던 상태를 불러와 이어서 실행한다.<br>이러한 &#39;현재 상태 저장&#39;, &#39;저장했던 상태 불러오기&#39;를 <U>컨텍스트 스위칭(Context Switching)</U>이라고 부른다.</p>
<p>cpu를 점유하고 실행 중이던 Task(Process, Thread)의 현재까지 실행된 코드 위치(PC: Program Counter)를 비롯한 각종 레지스터의 값, Task의 우선순위 등의 각종 정보를 PCB(Process Control Block)에 저장한다.<br>그리고 변경할 Task(크롬)의 PCB를 읽어 cpu에 세팅하고 PC를 기준으로 이어서 실행시키게 된다.</p>
<h3 id="2-마우스-더블-클릭">2. 마우스 더블 클릭</h3>
<p>더블 클릭 역시 마우스 이동과 다른 점이 거의 없다.<br>그저 인터럽트 핸들러 내부에서의 동작이 달라질 뿐이다.</p>
<p>마우스의 이동 정보를 받아 계산 후 커서를 이동시키던 기존 핸들러의 동작에 반해, 클릭이 눌렸음을 확인하고 다음 클릭과의 간격이 지정된 주기보다 짧은 경우 더블 클릭으로 인식할 것이다.</p>
<p>이후 지정된 커서 위치에 해당하는 파일의 정보(경로 등)를 가져온 후 해당 파일을 실행시키려 할 것이다.</p>
<hr>
<br>
마무리가 좀 붕 뜨는 느낌이 있는 것 같다.

<p>음.. 어쨌든 다음 파트에서는 <strong>파일을 실행시키는 과정</strong>에 대해서 포스팅해보도록 하겠다!</p>
<p><strong>끝!!!!</strong>
<br></p>
<hr>
<h3 id="-마우스에서부터-cpu의-irq까지는-어떻게-연결되어-있을까"><strong>[+] 마우스에서부터 cpu의 IRQ까지는 어떻게 연결되어 있을까?</strong></h3>
<p>USB 마우스에서의 인터럽트는 USB 프로토콜에 기반해 Interrupt Transfer를 이용한 Polling mechanism이다.<br>폴링(Polling)은 사실 인터럽트의 반대되는 개념으로 인터럽트를 받을 cpu가 주기적으로 다음과 같이 확인하는 방식이다.</p>
<blockquote>
<p>&quot;혹시 내가 뭐 급하게 해야하는거 있어?&quot;</p>
</blockquote>
<p>위에서 실컷 인터럽트 설명을 하다가 왜 인터럽트가 아닌 폴링이냐고 묻는다면 USB 칩셋의 가성비를 위해 그렇게 설계됐다고 대답을 할 수 있겠지만, 이 부분에 대한 내용을 이 포스팅에서 다루기에는 적절하지 않을 뿐더러 내가 당당하게 글을 작성할만큼 아는 것도 아니다.</p>
<p>그러므로 이 글에서는 간단하게 개념만 알아보고 디테일한 동작은 직접 USB 구조 및 프로토콜, HID, Class Driver 등에 대해 공부해보자. ㅎㅎ</p>
<ol>
<li>USB라는 Bus에 다수의 주변기기들이 연결되어 있으며 해당 Bus를 컨트롤하는 USB Controller가 여러 주변기기를 적절히 제어한다.  </li>
<li>USB 컨트롤러는 각 주변기기들에 대해 정의된 폴링 빈도, 데이터 사이즈 등의 정보를 활용하여 지속적으로 폴링을 수행하여 인터럽트가 발생하는지 확인한다.  </li>
<li>마우스 등의 HID 장치로부터 Interrupt Transfer를 수신하였다면 cpu와 연결된 IRQ에 전기 신호를 보내 인터럽트가 발생했음을 알리게 된다.</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[친구가 물어봤다. cpu가 뇌인건 알겠는데 그래서 어떻게 된다고?]]></title>
            <link>https://velog.io/@labda-dev/%EC%B9%9C%EA%B5%AC%EA%B0%80-%EB%AC%BC%EC%96%B4%EB%B4%A4%EB%8B%A4.-cpu%EA%B0%80-%EB%87%8C%EC%9D%B8%EA%B1%B4-%EC%95%8C%EA%B2%A0%EB%8A%94%EB%8D%B0-%EA%B7%B8%EB%9E%98%EC%84%9C-%EC%96%B4%EB%96%BB%EA%B2%8C-%EB%90%9C%EB%8B%A4%EA%B3%A0</link>
            <guid>https://velog.io/@labda-dev/%EC%B9%9C%EA%B5%AC%EA%B0%80-%EB%AC%BC%EC%96%B4%EB%B4%A4%EB%8B%A4.-cpu%EA%B0%80-%EB%87%8C%EC%9D%B8%EA%B1%B4-%EC%95%8C%EA%B2%A0%EB%8A%94%EB%8D%B0-%EA%B7%B8%EB%9E%98%EC%84%9C-%EC%96%B4%EB%96%BB%EA%B2%8C-%EB%90%9C%EB%8B%A4%EA%B3%A0</guid>
            <pubDate>Wed, 10 Nov 2021 13:01:59 GMT</pubDate>
            <description><![CDATA[<h4 id="친구-녀석이-펌웨어-개발-쪽으로-취업을-하고-나서-이것저것-많이-물어본다">친구 녀석이 펌웨어 개발 쪽으로 취업을 하고 나서 이것저것 많이 물어본다.</h4>
<p>그러더니 근본적으로 cpu랑 커널, 실행 바이너리(파일) 간의 관계에 대한 의문을 가졌다.<br>이것저것 설명해주다보니 바이너리 컴파일까지 가버렸다. ㅋㅋㅋㅋㅋㅋ</p>
<p>설명을 들은 친구가 자료찾기 힘들다고 포스팅 같은 거 좀 해보라고 하길래 이 참에(드디어) 전반적으로 정리해서 블로그를 시작해보기로 마음먹었다.</p>
<blockquote>
<ul>
<li>일반 사용자에게 가까운 마우스를 움직여서 프로그램 아이콘 더블 클릭하기까지.  </li>
<li>그 프로그램이 파일에서부터 메모리에 올라가면서 어떻게 프로세스로 실행되는지.  </li>
<li>거기에 그 파일은 서로 다른 cpu는 왜 호환이 되지 않는지, 똑같은 cpu이더라도 호환되지 않는건 왜인지.  </li>
<li>그럼 그 프로그램이 만들어지는 과정은 어떤지, 똑같은 프로그램을 여러 아키텍처에서 동작하게 하려면 어떻게 하는지.</li>
</ul>
</blockquote>
<p><U><strong>이런 과정들 속에서 어떤 다양한 일들이 일어나는지!</strong></U></p>
<p>사실 다루려고 하는 주제들에 들어간 여러 기술들은 하나하나가 되게 큰 항목들이다.</p>
<p>그리고 각 항목에 대한 디테일은 똑똑하신 분들께서 책이나 각종 자료에 너무 잘 정리해두셨다. ㅋㅋㅋㅋㅋㅋ</p>
<p>그러므로 이 시리즈에서는 상기의 주제를 기반으로 각 기술들이 어떻게 연결되는지, 언제 쓰이는지 알아보고자 한다.
(열심히 운영체제와 컴퓨터 구조를 공부해서 각 기술은 알겠으나 그래서 실제 컴퓨터를 할 때 어떻게 쓰이는지 감이 오지 않을 때!)</p>
<p>물론 내가 흥미있는 항목들의 디테일은 다른 시리즈로 열심히 올려보겠다!</p>
<br>

<p>좀 쉽게 말해보자면 다음과 같은 느낌이다.</p>
<blockquote>
<ul>
<li>롤 아이콘을 더블클릭하면 어떻게 롤이 실행될까  </li>
<li>왜 롤은 윈도우용/맥용 클라이언트가 따로 있을까? 어차피 인텔 cpu인데 (왜 롤을 리눅스에서 바로 실행할 수 없을까?)  </li>
<li>그럼 윈도우용/맥용 롤 클라이언트를 어떻게 따로 만들까?</li>
</ul>
</blockquote>
<p>하나하나 정리하면서 내가 잘 모르는 비어있는 부분도 채워보려 한다.</p>
<p>잘못된 내용 혹은 특정 아키텍처에 종속적인 내용이 있을 수 있습니다. ㅎㅎ<br><strong>피드백은 언제든 환영입니다!!!</strong></p>
]]></description>
        </item>
    </channel>
</rss>