<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Art of Pr0gr4m</title>
    <link>https://pr0gr4m.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Mon, 25 May 2026 18:15:34 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>pr0gr4m</managingEditor>
    <image>
      <title>Art of Pr0gr4m</title>
      <url>https://tistory1.daumcdn.net/tistory/2343954/attach/ae62305aba6d4e35bd3ee4bcb267d0df</url>
      <link>https://pr0gr4m.tistory.com</link>
    </image>
    <item>
      <title>블로킹, 논블로킹, 동기, 비동기 비교</title>
      <link>https://pr0gr4m.tistory.com/entry/blocknonblocksyncasync</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;결론부터 이야기하면 동기 IO와 비동기 IO는 'IO 시작 후 완료 전에 다른 작업을 수행할 수 있는지'와 '요청과 완료 순서의 보장'으로 구분할 수 있다. 블로킹 IO와 논블로킹 IO는 레이어(커널, 시스템콜, 특정 언어 및 라이브러리)마다 의미가 조금씩 달라지는데, 시스템 콜에서는 동기 IO 내에 블로킹 모드와 논블로킹 모드가 존재한다. 우선 시스템콜 레이어를 기준으로 해당 내용에 대해 알아보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블로킹 시스템콜 IO는 호출 시 해당 작업을 수행할 수 있을 때까지 반환하지 않고 대기한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;논블로킹 시스템콜 IO는 호출 시 해당 작업을 수행할 수 없다면 바로 반환한다. (혹은 일부 가능 시 일부만 수행하고 반환한다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어서 디스크에 write(disk_fd, &quot;0123456789&quot;, 10); 함수를 호출할 때,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디스크 버퍼가 10byte 이상 남은 상황, 3byte 남은 상황, 0byte 남은 (고갈된) 상황을 각각 고려해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(아래 상황은 이해를 위한 단순 예시로, 실제 동작 방식은 조금 다르다는걸 염두하자.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블로킹모드(default)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 버퍼 10b 남음 : 바로 &quot;0123456789&quot;을 모두 쓰기 시작한다. 버퍼에 쓰기가 완료될 때까지 대기했다가 반환한다. (대기 시간 : 10b 쓰는 시간)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 버퍼 3b 남음 : 우선 &quot;012&quot;를 쓴다. 그리고 버퍼가 비워질 때까지 기다린다. 버퍼가 비워지면 &quot;3456789&quot;를 마저 쓴다. 쓰기가 완료될 때까지 대기했다가 반환한다. (대기 시간 : 버퍼 7b 비워지는 시간 + 10b 쓰는 시간)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 버퍼 0b 남음 : 버퍼가 비워질 때까지 기다린다. 버퍼가 비워지면 쓰기 시작하고, 쓰기가 완료될 때까지 대기했다가 반환한다. (대기 시간 : 버퍼 10b 비워지는 시간 + 10b 쓰는 시간)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(위 설명은 이해를 위한 예시이며, 실제로는 효율을 위해 한번에 대기했다가 한번에 쓰는 등 구현에 따라 다름)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;논블로킹모드(O_NONBLOCK)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;- 버퍼 10b 남음 : 바로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&quot;0123456789&quot;을 모두 쓰기 시작한다. 버퍼에 쓰기가 완료될 때까지 대기했다가 반환한다. (대기 시간 : 10b 쓰는 시간)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 버퍼 3b 남음 : &quot;012&quot;를 쓴다. 3byte 쓰기가 완료될 때까지 대기했다가 3을 반환한다. 일부 성공. (대기 시간 : 3b 쓰는 시간)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 버퍼 0b 남음 : 바로 0을 반환한다. (대기 시간 : 없음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;주의할 점은 논블로킹이라고 해서 아예 대기가 없는 것은 아니다. 쓰기 작업이 수행되는 동안에는 블로킹된다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단지, 블로킹모드는 요청한 작업을 수행할 수 있을 때까지 무한정 대기하는데 논블로킹 모드는 요청한 작업을 수행할 수 없다면 반환하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론, 디스크 자체에 문제가 생겨서 IO가 아예 불가능한 상황이 된다면 블로킹 모드나 논블로킹 모드나 바로 에러로 반환한다. (이 때는 0을 반환하는 것이 아니라 -1을 반환함)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;아무튼 블로킹 모드나 논블로킹 모드나 IO 요청 후 실제 수행하는 동안은 IO 대기 상태가 되고, IO가 완료되면 반환하는 것은 동일하다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이러한 성격 때문에 여러 개의 IO 요청이 있을 때, 요청과 완료의 순서가 뒤바뀔 일이 없다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;write(disk_fd, &quot;01234&quot;, 5);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;write(disk_fd, &quot;56789&quot;, 5);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;를 나눠서 순서대로 호출했을 때, 절대 &quot;56789&quot; 쓰기가 &quot;01234&quot;보다 먼저 완료될 일이 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 블로킹 모드나 논블로킹나 마찬가지다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;요청으로부터 완료되는 순서가 보장되어 있다. 다시 말해, 요청부터 완료까지의 동작들이 한 묶음으로 동기화 되어 있기 때문에 이를 동기(synchronous) IO라고 한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(물론, 동일한 쓰레드 내에서의 이야기다. 서로 다른 쓰레드에서 write를 호출했다면 보장되지 않는다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동기 IO에서는 함수 호출이 곧 요청이고, 해당 함수의 반환이 곧 완료다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 함수가 요청과 완료 통지 기능을 전부 갖추고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;비동기(asynchronous) IO는&lt;/b&gt; 동기 IO와 다르게 &lt;b&gt;일반적으로 요청과 완료가 분리&lt;/b&gt;된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비동기 IO는 IO 요청 후 작업이 완료될 때까지 대기하지 않고 바로 반환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 작업을 수행할 수 있든 없든 상관 없이 단순 &lt;b&gt;요청만 하고 반환&lt;/b&gt;한다. 그리고 &lt;b&gt;별도의 완료 통지 메커니즘&lt;/b&gt;을 갖는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어서 디스크에 비동기 쓰기 aio_write(disk_fd, &quot;0123456789&quot;, 10); 함수를 호출한다고 가정하자. (실제 aio_write 함수는 struct aiocb를 인자로 받아야 하지만 이해를 위해 간략화한다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디스크 버퍼가 얼마나 남아있는지 상관 없다. 그냥 디스크에 이거 써줘 를 요청하고, 바로 반환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후에 별도의 함수들(aio_error, aio_return)을 통해서 작업이 진행중인지, 완료되었는지, 실패했는지, 최종적인 결과가 어떻게 되었는지 등을 알 수 있다. 원한다면 작업이 완료되었을 때 비동기적으로 완료 통지(signal이나 callback)를 받을 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이처럼 &lt;b&gt;비동기 IO는 요청과 실제 동작 및 완료가 분리되어있기 때문에, 요청 후 완료 전까지 다른 작업들을 수행할 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동기 IO에서는 블로킹/논블로킹 상관 없이 IO 요청 후 실제 작업이 완료되기 전까지는 다른 작업을 수행할 수 없었다. 즉, IO 요청부터 완료될 때까지는 해당 IO를 요청한 쓰레드가 CPU 연산을 사용할 수 없었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면 비동기 IO는 요청 후 IO와 관련 없는 CPU 연산을 얼마든지 수행할 수 있다. 실제 작업은 백그라운드에서 커널과 디바이스가 열심히 처리해준다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 &lt;b&gt;비동기 IO의 동작 방식 때문에 여러 개의 IO 요청이 있을 때, 요청과 완료의 순서가 동일하도록 보장되지 않는다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;aio_write(disk_fd, &quot;01234&quot;, 5);&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// 실제 인자는 aiocb 객체를 넘겨야 함&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;aio_write(disk_fd, &quot;56789&quot;, 5);&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;를 나눠서 호출했다면 &quot;56789&quot; 쓰기가 &quot;01234&quot;보다 먼저 완료될 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;어차피 커널은 먼저 요청한걸 먼저 처리하는 것이 아니라, 여러 요청들을 모아서 효율적으로 동작할 수 있도록 알아서 잘 처리한다. 커널에 &quot;01234&quot; 쓰기 요청과 &quot;56789&quot; 쓰기 요청이 (거의) 동시에 들어왔을 때 &quot;56789&quot; 를 먼저 쓰는 것이 효율적이라고 판단되면 그렇게 작업을 진행한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;앗, 그렇다면 디스크에 &quot;0123456789&quot;가 써지는 것을 원했는데 &quot;5678901234&quot;가 써질 수 있다는 것일까?&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;당연히 이런 문제가 발생할 수 있기 때문에 애초에 비동기 IO는 보통 어디에 작성할지 오프셋을 지정하도록 되어있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이처럼 비동기 IO는 요청부터 완료까지의 동작들이 한 묶음으로 동기화되지 않는다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;결국 동기 IO와 비동기 IO의 가장 큰 차이는 'IO 수행 시작 이 후 완료되기 전까지 다른 작업을 할 수 있는지 여부' 와 '요청과 완료 순서가 동일한가' 이다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;'동기는 블로킹이고, 비동기는 논블로킹이다' 는 시스템 콜 레벨에서 아예 틀린 문장임을 알 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;시스템 콜에서는 블로킹 IO나 논블로킹 IO나 모두 동기 IO이고, 비동기 IO는 이와 아예 별도의 방식이라고 할 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;시스템콜 함수에 대응한다면 read/write 함수는 동기 IO, aio_read/aio_write 함수는 비동기 IO 로 분류한다. 그리고 동기 IO인 read/write 함수는 O_NONBLOCK 세팅 여부에 따라 블로킹과 논블로킹으로 분류한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;하지만 &lt;b&gt;시스템 콜이 아닌 특정언어/라이브러리/프레임워크 레벨에서는 블로킹/논블로킹 IO를 자체적으로 정의하기도 한다.&lt;/b&gt; 비동기 IO는 대부분의 분야 및 레벨에서 동일한 개념으로 이야기하지만, 유독 블로킹/논블로킹은 의미가 달라지기도 한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 블로킹 IO를 'IO 요청에 의해서 쓰레드의 블로킹이 조금이라도 발생하는 IO' 라는 의미로 사용하고, 논블로킹 IO를 'IO 요청에 의해서 쓰레드의 블로킹이 아예 발생하지 않는 IO'라는 의미로 사용하기도 한다. 이 경우엔 보통 구조적으로 블로킹 IO가 동기 IO가 되고, 논블로킹 IO가 비동기 IO가 될 것이다. (이 개념을 시스템콜에 적용한다면 read/write 함수는 논블로킹 모드여도 쓰레드 블로킹이 발생하기 때문에 블로킹 IO가 된다.)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;또 간혹 블로킹 IO는 '함수 호출 이 후 실제 IO 작업이 시작할 때까지 블로킹될 수 있는 IO' 라는 의미로 사용하고, 논블로킹 IO를 '함수 호출 이 후 실제 IO 작업이 시작할 때까지 블로킹되지 않는 IO' 라는 의미로 사용하기도 한다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 경우엔 동기 &amp;amp; 블로킹, 동기 &amp;amp; 논블로킹, 비동기 &amp;amp; 논블로킹 로 구분이 가능하며, 비동기 &amp;amp; 블로킹은 구조적으로 불가능하다. (굳이 그러한 라이브러리를 만들 수는 있으나 구조적으로 잘못된 설계다.)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;결국 어느 레벨에서 이야기하는지에 따라 용어의 개념은 달라진다. 혼동을 피하기 위하여 언급을 피했지만, 커널 레벨에서는 결국 대부분의 IO가 비동기로 동작한다. 따라서 쓰레드 A와 쓰레드 B가 둘 다 write를 호출했을 때, 쓰레드 A가 먼저 호출했더라도 쓰레드 B의 write가 먼저 완료될 수도 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;아무튼 특정 언어나 라이브러리에서 용어를 따로 정의할 수는 있지만, 유저 어플리케이션이 IO 작업을 요청하기 위한 근간은 결국 시스템 콜이다. 시스템 콜 레벨에서는 언급한 바와 같이 블로킹/논블로킹은 동기 IO 내에서 구분하는 방식이고, 비동기 IO는 동기 IO와 아예 별도의 방식이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;---&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Reference&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://man.freebsd.org/cgi/man.cgi?query=fcntl&amp;amp;sektion=2&amp;amp;n=1&quot;&gt;fcntl(2) (freebsd.org)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1722157725882&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;fcntl(2)&quot; data-og-description=&quot;FreeBSD Manual Pages FCNTL(2) System Calls Manual FCNTL(2) NAME fcntl -- file control LIBRARY Standard C Library (libc, -lc) SYNOPSIS #include int fcntl(int fd, int cmd, ...); DESCRIPTION The fcntl() system call provides for control over descriptors. The a&quot; data-og-host=&quot;man.freebsd.org&quot; data-og-source-url=&quot;https://man.freebsd.org/cgi/man.cgi?query=fcntl&amp;amp;sektion=2&amp;amp;n=1&quot; data-og-url=&quot;https://man.freebsd.org/cgi/man.cgi?n=1&amp;amp;query=fcntl&amp;amp;sektion=2&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://man.freebsd.org/cgi/man.cgi?query=fcntl&amp;amp;sektion=2&amp;amp;n=1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://man.freebsd.org/cgi/man.cgi?query=fcntl&amp;amp;sektion=2&amp;amp;n=1&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;fcntl(2)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;FreeBSD Manual Pages FCNTL(2) System Calls Manual FCNTL(2) NAME fcntl -- file control LIBRARY Standard C Library (libc, -lc) SYNOPSIS #include int fcntl(int fd, int cmd, ...); DESCRIPTION The fcntl() system call provides for control over descriptors. The a&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;man.freebsd.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&lt;code&gt;Non-blocking  I/O;	if  no	data is	available to a read(2)
		    system call, or if a write(2) operation would  block,  the
		    read or write call returns -1 with the error EAGAIN.
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://man.freebsd.org/cgi/man.cgi?query=aio&amp;amp;sektion=4&amp;amp;manpath=freebsd-release-ports&quot;&gt;aio(4) (freebsd.org)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1722157751755&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;aio(4)&quot; data-og-description=&quot;FreeBSD Manual Pages AIO(4) Kernel Interfaces Manual AIO(4) NAME aio -- asynchronous I/O DESCRIPTION The aio facility provides system calls for asynchronous I/O. Asynchro- nous I/O operations are not completed synchronously by the calling thread. Instead, &quot; data-og-host=&quot;man.freebsd.org&quot; data-og-source-url=&quot;https://man.freebsd.org/cgi/man.cgi?query=aio&amp;amp;sektion=4&amp;amp;manpath=freebsd-release-ports&quot; data-og-url=&quot;https://man.freebsd.org/cgi/man.cgi?manpath=freebsd-release-ports&amp;amp;query=aio&amp;amp;sektion=4&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://man.freebsd.org/cgi/man.cgi?query=aio&amp;amp;sektion=4&amp;amp;manpath=freebsd-release-ports&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://man.freebsd.org/cgi/man.cgi?query=aio&amp;amp;sektion=4&amp;amp;manpath=freebsd-release-ports&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;aio(4)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;FreeBSD Manual Pages AIO(4) Kernel Interfaces Manual AIO(4) NAME aio -- asynchronous I/O DESCRIPTION The aio facility provides system calls for asynchronous I/O. Asynchro- nous I/O operations are not completed synchronously by the calling thread. Instead,&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;man.freebsd.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&lt;code&gt;The aio facility	provides system	calls for asynchronous I/O.  Asynchro-
       nous  I/O  operations  are  not	completed synchronously	by the calling
       thread.	Instead, the calling thread invokes one	system call to request
       an asynchronous I/O operation.  The status of a	completed  request  is
       retrieved later via a separate system call.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Asynchronous_I/O&quot;&gt;Asynchronous I/O - Wikipedia&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1722157767606&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Asynchronous I/O - Wikipedia&quot; data-og-description=&quot;From Wikipedia, the free encyclopedia Form of input/output processing In computer science, asynchronous I/O (also non-sequential I/O) is a form of input/output processing that permits other processing to continue before the I/O operation has finished. A na&quot; data-og-host=&quot;en.wikipedia.org&quot; data-og-source-url=&quot;https://en.wikipedia.org/wiki/Asynchronous_I/O&quot; data-og-url=&quot;https://en.wikipedia.org/wiki/Asynchronous_I/O&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Asynchronous_I/O&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://en.wikipedia.org/wiki/Asynchronous_I/O&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Asynchronous I/O - Wikipedia&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;From Wikipedia, the free encyclopedia Form of input/output processing In computer science, asynchronous I/O (also non-sequential I/O) is a form of input/output processing that permits other processing to continue before the I/O operation has finished. A na&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;en.wikipedia.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #202122; text-align: start;&quot;&gt;Forms of I/O and examples of POSIX functions:&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;Blocking&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;Non-Blocking&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;Asynchronous&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;API&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;write, read&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;write, read + poll / select&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;aio_write, aio_read&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT</category>
      <author>pr0gr4m</author>
      <guid isPermaLink="true">https://pr0gr4m.tistory.com/54</guid>
      <comments>https://pr0gr4m.tistory.com/entry/blocknonblocksyncasync#entry54comment</comments>
      <pubDate>Sun, 28 Jul 2024 08:19:19 +0900</pubDate>
    </item>
    <item>
      <title>병렬성(Parallelism)과 동시성(Concurrency)</title>
      <link>https://pr0gr4m.tistory.com/entry/%EB%B3%91%EB%A0%AC%EC%84%B1Parallelism%EA%B3%BC-%EB%8F%99%EC%8B%9C%EC%84%B1Concurrency</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;concurrency&amp;nbsp;is&amp;nbsp;the&amp;nbsp;ability&amp;nbsp;of&amp;nbsp;different&amp;nbsp;parts&amp;nbsp;or&amp;nbsp;units&amp;nbsp;of&amp;nbsp;a&amp;nbsp;program,&amp;nbsp;algorithm,&amp;nbsp;or&amp;nbsp;problem&amp;nbsp;to&amp;nbsp;be&amp;nbsp;executed&amp;nbsp;out-of-order&amp;nbsp;or&amp;nbsp;in&amp;nbsp;partial&amp;nbsp;order,&amp;nbsp;without&amp;nbsp;affecting&amp;nbsp;the&amp;nbsp;outcome.&amp;nbsp;This&amp;nbsp;allows&amp;nbsp;for&amp;nbsp;parallel&amp;nbsp;execution&amp;nbsp;of&amp;nbsp;the&amp;nbsp;concurrent&amp;nbsp;units,&amp;nbsp;which&amp;nbsp;can&amp;nbsp;significantly&amp;nbsp;improve&amp;nbsp;overall&amp;nbsp;speed&amp;nbsp;of&amp;nbsp;the&amp;nbsp;execution&amp;nbsp;in&amp;nbsp;multi-processor&amp;nbsp;and&amp;nbsp;multi-core&amp;nbsp;systems.&amp;nbsp;In&amp;nbsp;more&amp;nbsp;technical&amp;nbsp;terms,&amp;nbsp;concurrency&amp;nbsp;refers&amp;nbsp;to&amp;nbsp;the&amp;nbsp;decomposability&amp;nbsp;of&amp;nbsp;a&amp;nbsp;program,&amp;nbsp;algorithm,&amp;nbsp;or&amp;nbsp;problem&amp;nbsp;into&amp;nbsp;order-independent&amp;nbsp;or&amp;nbsp;partially-ordered&amp;nbsp;components&amp;nbsp;or&amp;nbsp;units&amp;nbsp;of&amp;nbsp;computation. &lt;br /&gt;&lt;br /&gt;Parallel&amp;nbsp;computing&amp;nbsp;is&amp;nbsp;a&amp;nbsp;type&amp;nbsp;of&amp;nbsp;computation&amp;nbsp;in&amp;nbsp;which&amp;nbsp;many&amp;nbsp;calculations&amp;nbsp;or&amp;nbsp;processes&amp;nbsp;are&amp;nbsp;carried&amp;nbsp;out&amp;nbsp;simultaneously. &lt;br /&gt;&lt;br /&gt;parallelism&amp;nbsp;and&amp;nbsp;concurrency&amp;nbsp;are&amp;nbsp;two&amp;nbsp;different&amp;nbsp;things:&amp;nbsp;a&amp;nbsp;parallel&amp;nbsp;program&amp;nbsp;uses&amp;nbsp;multiple&amp;nbsp;CPU&amp;nbsp;cores,&amp;nbsp;each&amp;nbsp;core&amp;nbsp;performing&amp;nbsp;a&amp;nbsp;task&amp;nbsp;independently.&amp;nbsp;On&amp;nbsp;the&amp;nbsp;other&amp;nbsp;hand,&amp;nbsp;concurrency&amp;nbsp;enables&amp;nbsp;a&amp;nbsp;program&amp;nbsp;to&amp;nbsp;deal&amp;nbsp;with&amp;nbsp;multiple&amp;nbsp;tasks&amp;nbsp;even&amp;nbsp;on&amp;nbsp;a&amp;nbsp;single&amp;nbsp;CPU&amp;nbsp;core;&amp;nbsp;the&amp;nbsp;core&amp;nbsp;switches&amp;nbsp;between&amp;nbsp;tasks&amp;nbsp;(i.e.&amp;nbsp;threads)&amp;nbsp;without&amp;nbsp;necessarily&amp;nbsp;completing&amp;nbsp;each&amp;nbsp;one.&amp;nbsp;A&amp;nbsp;program&amp;nbsp;can&amp;nbsp;have&amp;nbsp;both,&amp;nbsp;neither&amp;nbsp;or&amp;nbsp;a&amp;nbsp;combination&amp;nbsp;of&amp;nbsp;parallelism&amp;nbsp;and&amp;nbsp;concurrency&amp;nbsp;characteristics.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Note that in computer science, parallelism and concurrency are two different things: a parallel program uses multiple CPU cores, each core performing a task independently. On the other hand, concurrency enables a program to deal with multiple tasks even on a single CPU core; the core switches between tasks (i.e. threads) without necessarily completing each one. A program can have both, neither of or a combination of parallelism and concurrency characteristics.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Concurrenty is a property of the program and parallel execution is a property of the machine. &lt;br /&gt;&lt;br /&gt;Concurrency는&amp;nbsp;프로그램의&amp;nbsp;성질이고&amp;nbsp;parallel&amp;nbsp;execution은&amp;nbsp;기계의&amp;nbsp;성질이다.&lt;/p&gt;</description>
      <category>IT</category>
      <author>pr0gr4m</author>
      <guid isPermaLink="true">https://pr0gr4m.tistory.com/53</guid>
      <comments>https://pr0gr4m.tistory.com/entry/%EB%B3%91%EB%A0%AC%EC%84%B1Parallelism%EA%B3%BC-%EB%8F%99%EC%8B%9C%EC%84%B1Concurrency#entry53comment</comments>
      <pubDate>Sun, 21 Jul 2024 16:21:25 +0900</pubDate>
    </item>
    <item>
      <title>동일한 포인터 역참조 시 값이 다른 케이스</title>
      <link>https://pr0gr4m.tistory.com/entry/same-pointer-different-value</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;다음 코드의 결과를 예상해보자.&lt;/p&gt;
&lt;pre class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot;&gt;&lt;code&gt;    int x = 1, y = 2;    // clang을 사용한다면 x와 y 선언 순서 변경
    int *px = &amp;amp;x + 1;
    int *py = &amp;amp;y;
    if (!memcmp(px, py, sizeof(*px))) {    // px와 py는 같은 주소를 참조함
        *px = 3;
        printf(&quot;x : %d, y : %d, *px : %d, *py : %d\n&quot;, x, y, *px, *py);
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오브젝트 x와 y가 메모리상에 연속되어있는 시스템에서는 당연히 다음과 같은 결과를 보일 것이다.&lt;/p&gt;
&lt;pre class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot;&gt;&lt;code&gt;#1
x : 1, y : 3, *px : 3, *py : 3&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 이는 Undefined Behavior 코드로, 다음과 같은 결과를 만들어낼 수 있다.&lt;/p&gt;
&lt;pre class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot;&gt;&lt;code&gt;#2
x : 1, y : 2, *px : 3, *py : 2&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어째서 이런 결과가 가능할까?&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;표준 본문에서 역참조 연산에 대한 UB 언급은 다음과 같다 : If an invalid value has been assigned to the pointer, the behavior of the unary * operator is undefined.&lt;/li&gt;
&lt;li&gt;배열의 원소는 항상 연속적인 것이 보장된다. 따라서 &lt;code&gt;int arr[2] = { 0, 1 };&lt;/code&gt; 와 같은 코드가 있을 때 &lt;code&gt;&amp;amp;arr[0] + 1 == &amp;amp;arr[1]&lt;/code&gt; 이 '보장' 된다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;int x = 1, y = 2;&lt;/code&gt; 라는 코드는 메모리 상에서 통상적으로 &lt;code&gt;&amp;amp;x + 1 == &amp;amp;y&lt;/code&gt; 의 레이아웃을 가지게 된다. 하지만 언어 차원에서 이를 '보장'하지 않는다. 예를 들어, x는 스택 메모리에 y는 레지스터에 할당된 경우를 생각해보자.&lt;/li&gt;
&lt;li&gt;해당 내용에 의해 컴파일러는 px가 참조하는 대상이 y라는 것을 '보장'할 필요가 없어진다. 따라서, 컴파일러는 &lt;code&gt;px == &amp;amp;y&lt;/code&gt; 라는 가정하에 생기는 최적화 방어를 할 필요가 없어진다.&lt;/li&gt;
&lt;li&gt;결국 현재 위 코드에서 포인터 px가 특정한 오브젝트를 참조하고 있다는 보장이 없기에, 역참조한 값을 lvalue로 사용했을 때 발생하는 side effect를 항상 발생할 필요가 없어진다.&lt;/li&gt;
&lt;li&gt;따라서 &lt;code&gt;if (!memcmp(px, py, sizeof(*px)))&lt;/code&gt; 에서 볼 수 있듯이, 두 포인터는 동일한 곳을 참조하는 포인터이지만, py는 y 오브젝트를 참조하고 있음이 보장되며, px는 y 오브젝트를 참조하고 있음이 보장되지 않는다.&lt;/li&gt;
&lt;li&gt;그러므로 &lt;code&gt;*px = 3;&lt;/code&gt; 이라는 코드는 실제로 px를 역참조하여 3을 대입하는 side effect를 발생시키지 않고, 상수 전파로 최적화가 가능해진다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;printf(&quot;x : %d, y : %d, *px : %d, *py : %d\n&quot;, x, y, *px, *py);&lt;/code&gt; 코드에서 &lt;code&gt;*px&lt;/code&gt; 는 상수 전파로 인해 3을 바로 사용할 수 있게 된다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 흐름으로 동일한 주소를 참조하고 있는 포인터가 역참조 시 서로 다른 값이 나오게 된다.&lt;br /&gt;실제로 위 코드를 gcc나 clang 컴파일러를 이용해서 -O0 으로 최적화 없이 컴파일하면 1번과 같은 결과가 나오지만, -O2 으로 최적화하면 2번과 같은 결과가 나오게 된다. (clang을 사용하는 경우 &lt;code&gt;int y = 2, x = 1;&lt;/code&gt;와 같이 선언해야 한다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결론적으로 past to end of object 포인터가 또 다른 object를 참조한다고 보장되지 않는 경우 invalid 포인터로 취급하여 UB 동작을 발생시킨다. (past to end of object 참조는 UB가 아니지만, 해당 참조 포인터를 역참조하면 UB이다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 이는 패딩 등의 이유로 구조체 내의 멤버 또한 마찬가지다.&lt;/p&gt;
&lt;pre class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot;&gt;&lt;code&gt;struct T {
    int x, y;
};

struct T t;
// &amp;amp;t.x + 1이 t.y를 참조한다고 보장하지 않음&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, 제너럴한 자료 구조의 구현 시 past to end of object 포인터를 사용할때 유의가 필요하다.&lt;br /&gt;(제너럴한 자료 구조는 &lt;a href=&quot;https://pr0gr4m.tistory.com/entry/Linux-Kernel-5-Linked-List&quot;&gt;https://pr0gr4m.tistory.com/entry/Linux-Kernel-5-Linked-List&lt;/a&gt; 참고)&lt;/p&gt;</description>
      <category>IT/C Language</category>
      <author>pr0gr4m</author>
      <guid isPermaLink="true">https://pr0gr4m.tistory.com/52</guid>
      <comments>https://pr0gr4m.tistory.com/entry/same-pointer-different-value#entry52comment</comments>
      <pubDate>Fri, 6 Oct 2023 19:24:15 +0900</pubDate>
    </item>
    <item>
      <title>Linux Kernel Network Commit #3</title>
      <link>https://pr0gr4m.tistory.com/entry/Linux-Kernel-Network-Commit-3</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Netdev 트리의 net-next 브랜치 커밋&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://patchwork.kernel.org/project/netdevbpf/patch/20210823102118.17966-1-l4stpr0gr4m@gmail.com/&quot;&gt;[v3,net-next] net: bridge: change return type of br_handle_ingress_vlan_tunnel - Patchwork (kernel.org)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1629871908890&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;[v3,net-next] net: bridge: change return type of br_handle_ingress_vlan_tunnel - Patchwork&quot; data-og-description=&quot;&quot; data-og-host=&quot;patchwork.kernel.org&quot; data-og-source-url=&quot;https://patchwork.kernel.org/project/netdevbpf/patch/20210823102118.17966-1-l4stpr0gr4m@gmail.com/&quot; data-og-url=&quot;https://patchwork.kernel.org/project/netdevbpf/patch/20210823102118.17966-1-l4stpr0gr4m@gmail.com/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://patchwork.kernel.org/project/netdevbpf/patch/20210823102118.17966-1-l4stpr0gr4m@gmail.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://patchwork.kernel.org/project/netdevbpf/patch/20210823102118.17966-1-l4stpr0gr4m@gmail.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[v3,net-next] net: bridge: change return type of br_handle_ingress_vlan_tunnel - Patchwork&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;patchwork.kernel.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 번째 커밋과 비슷하게, 현재 br_handle_ingress_vlan_tunnel() 함수는 모든 종료 경로에서 return 0;으로 끝난다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에는 pair 함수 br_handle_egress_vlan_tunnel() 함수에서는 skb_vlan_pop()을 호출해서 해당 반환 값을 반환하는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ingress 함수에서는 skb_vlan_push() 함수를 호출하지 않고 __vlan_hwaccel_put_tag() 함수만 호출하고 return 0;으로 종료하는게 이상해 보였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, __vlan_hwaccel_put_tag() 호출 대신 skb_vlan_push() 함수를 호출해서 반환값을 반환하도록 하는 패치를 보냈다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이에 대해 메인테이너분이 다음과 같이 답을 주셨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;This changes behaviour though, I don't like changing code just for the sake of it.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Perhaps the author had a reason to use hwaccel_put_tag instead.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Before we would just put hwaccel tag, now if there already is hwaccel tag we'll push it inside the skb and then push the new tag in hwaccel. &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;In fact I think you can even trigger the warning inside skb_vlan_push, so&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대충 hwaccel tag 넣기 전에 이미 hwaccel tag가 있다면 skb에 해당 tag를 push하고, hwaccel에 새 tag를 push한다는 내용인데.. 여기서는 skb_vlan_push() 함수가 아니라 hwaccel put tag를 쓰는게 맞다는 이야기같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 해당 패치는 포기하고, 대신 현재 함수가 항상 return 0;로 끝나므로 이 부분 cleanup을 수행하겠다고 메일 드렸더니 이 부분에 대해서는 긍정적으로 반응해주셨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇게 br_handle_ingress_vlan_tunnel() 함수의 return type을 void로 변경하고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 함수를 호출하는 br_handle_frame() 함수에서도 cleanup을 수행했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 전 두 커밋은 기능 Fix나 성능 최적화가 이루어지는 contribute이었던 것에 비해, 해당 커밋은 단순히 cleanup이기 때문에 큰 성과는 아닌 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더군다나 해당 패치는 이 전 패치들과 달리 직접 찾은게 아니라 제보를 받은 내용이라.. 그래도 보낸 패치가 accepted 되는건 역시 기분이 좋긴 하다.&lt;/p&gt;</description>
      <category>IT</category>
      <category>bridge</category>
      <category>commit</category>
      <category>contribute</category>
      <category>Kernel</category>
      <category>Linux</category>
      <category>Network</category>
      <category>vlan</category>
      <author>pr0gr4m</author>
      <guid isPermaLink="true">https://pr0gr4m.tistory.com/51</guid>
      <comments>https://pr0gr4m.tistory.com/entry/Linux-Kernel-Network-Commit-3#entry51comment</comments>
      <pubDate>Wed, 25 Aug 2021 15:23:49 +0900</pubDate>
    </item>
    <item>
      <title>Linux Kernel Network Commit #2</title>
      <link>https://pr0gr4m.tistory.com/entry/Linux-Kernel-Network-Commit-2</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;BlueZ 트리의 bluetooth-next 브랜치에 커밋했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://patchwork.kernel.org/project/bluetooth/patch/20210819152718.2713-1-l4stpr0gr4m@gmail.com/&quot;&gt;[v4] Bluetooth: Fix return value in hci_dev_do_close() - Patchwork (kernel.org)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1629387560548&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;[v4] Bluetooth: Fix return value in hci_dev_do_close() - Patchwork&quot; data-og-description=&quot;&quot; data-og-host=&quot;patchwork.kernel.org&quot; data-og-source-url=&quot;https://patchwork.kernel.org/project/bluetooth/patch/20210819152718.2713-1-l4stpr0gr4m@gmail.com/&quot; data-og-url=&quot;https://patchwork.kernel.org/project/bluetooth/patch/20210819152718.2713-1-l4stpr0gr4m@gmail.com/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://patchwork.kernel.org/project/bluetooth/patch/20210819152718.2713-1-l4stpr0gr4m@gmail.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://patchwork.kernel.org/project/bluetooth/patch/20210819152718.2713-1-l4stpr0gr4m@gmail.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[v4] Bluetooth: Fix return value in hci_dev_do_close() - Patchwork&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;patchwork.kernel.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 hci_dev_do_close() 함수는 모든 종료 경로에서 return 0;으로 끝난다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;종료 루틴이 실패하면 에러 값을 반환해야 하는데, 어떤 상황에서도 0을 반환하는 상황이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기기 에러 상황에서 reset하는 경우, hci_error_reset 함수에서 이 함수를 호출하는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;종료 동작이 정상적으로 수행되면 이어서 hci_dev_do_open() 함수를 호출하여 재시작하지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;종료 동작이 비정상적으로 끝나면 hci_dev_do_open() 함수를 호출하지 않고 끝내야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, ioctl() 함수에서 종료 동작 수행 시에도 이 함수를 호출하는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;종료가 제대로 수행되지 못했다면 에러값을 반환해줘야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, 종료 과정에 에러가 생긴 경우 해당 에러 값을 반환하도록 수정해줘야 하는데..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제는 hdev에 등록되는 모든 close 콜백은 단순히 return 0;으로 끝난다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 그냥 넘어가도 되는건가? 싶겠지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위쪽에 shutdown 콜백은 수행 중에 오류가 생길 수 있으며, 에러 값도 제대로 반환해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러므로 이 shutdown 콜백의 반환 값을 저장해뒀다가, 종료 시 반환하도록 코드를 수정해서 패치를 보냈다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패치가 v4까지 되었는데, 실수한 점을 짚으면 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;v1 : bluetooth-next 브랜치가 아니라 net-next 브랜치에서 작업하였음 (블루투스 브랜치가 따로 있는지 몰랐음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;v2 : obsolete된 bluetooth-next 브랜치에서 작업하였음 (블루투스 브랜치는 세 개가 있으며, bluetooth group의 브랜치 외에는 obsolete 된 것을 몰랐음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;v3 : 여기서는 메인테이너분의 리뷰 메일을 받았는데 변수 이름을 ret이 아니라 err로 해달라고 요청해주셨음 (관련 메일 : &lt;a href=&quot;https://lkml.org/lkml/2021/8/19/577&quot;&gt;LKML: Marcel Holtmann: Re: [PATCH v3] Bluetooth: Fix return value in hci_dev_do_close()&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;v4 : bluetooth-next 브랜치에 merge 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블루투스 내에서는 가장 코어라고 할 수 있는 부분인데, 이 또한 좋은 성과이다.&lt;/p&gt;</description>
      <category>IT</category>
      <category>BLUETOOTH</category>
      <category>bluez</category>
      <category>commit</category>
      <category>Kernel</category>
      <category>Linux</category>
      <category>Network</category>
      <author>pr0gr4m</author>
      <guid isPermaLink="true">https://pr0gr4m.tistory.com/50</guid>
      <comments>https://pr0gr4m.tistory.com/entry/Linux-Kernel-Network-Commit-2#entry50comment</comments>
      <pubDate>Fri, 20 Aug 2021 00:54:43 +0900</pubDate>
    </item>
    <item>
      <title>Linux Kernel 참고 사이트 추천</title>
      <link>https://pr0gr4m.tistory.com/entry/Linux-Kernel-%EC%B0%B8%EA%B3%A0-%EC%82%AC%EC%9D%B4%ED%8A%B8-%EC%B6%94%EC%B2%9C</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;리눅스 커널을 분석하는데 있어 참고하기 좋은 사이트들을 소개한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좋은 사이트를 찾으면 지속적으로 업데이트 할 예정이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최초 글 작성 2021-07-27.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;해외&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Elixir Linux&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://elixir.bootlin.com/linux/latest/source&quot;&gt;Linux source code (v5.13.5) - Bootlin&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1627323871857&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Linux source code (v5.13.5) - Bootlin&quot; data-og-description=&quot;&quot; data-og-host=&quot;elixir.bootlin.com&quot; data-og-source-url=&quot;https://elixir.bootlin.com/linux/latest/source&quot; data-og-url=&quot;https://elixir.bootlin.com/linux/latest/source&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://elixir.bootlin.com/linux/latest/source&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://elixir.bootlin.com/linux/latest/source&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Linux source code (v5.13.5) - Bootlin&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;elixir.bootlin.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리눅스 커널 소스 코드를 버전별로 볼 수 있는 사이트이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;심볼 검색 및 크로스 레퍼런스 기능을 제공한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;커널 분석에는 vim + ctags + cscope + taglist 를 사용하는 것이 소위 말하는 국룰이었지만,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;지금은 (인터넷이 연결되는 상황이라면) 엘릭서 사이트를 이용하는 것이 가장 편한 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;2. LWN&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://lwn.net/&quot;&gt;Welcome to LWN.net [LWN.net]&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1627324102842&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Welcome to LWN.net [LWN.net]&quot; data-og-description=&quot;[Security] Posted Jul 26, 2021 15:13 UTC (Mon) by ris Security updates have been issued by Debian (aspell, intel-microcode, krb5, rabbitmq-server, and ruby-actionpack-page-caching), Fedora (chromium, containernetworking-plugins, containers-common, crun, fo&quot; data-og-host=&quot;lwn.net&quot; data-og-source-url=&quot;https://lwn.net/&quot; data-og-url=&quot;https://lwn.net/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://lwn.net/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://lwn.net/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Welcome to LWN.net [LWN.net]&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;[Security] Posted Jul 26, 2021 15:13 UTC (Mon) by ris Security updates have been issued by Debian (aspell, intel-microcode, krb5, rabbitmq-server, and ruby-actionpack-page-caching), Fedora (chromium, containernetworking-plugins, containers-common, crun, fo&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;lwn.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세상에서 가장 유명한 유닉스 계열 웹진이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유료 구독 시 최신 게시글을 볼 수 있고, 1주일이 지난 글들은 아카이브에서 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최신 동향과 기술들을 파악할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. LKML&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://lkml.org/&quot;&gt;LKML.ORG - the Linux Kernel Mailing List Archive&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1627324531467&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;LKML.ORG - the Linux Kernel Mailing List Archive&quot; data-og-description=&quot;&quot; data-og-host=&quot;lkml.org&quot; data-og-source-url=&quot;https://lkml.org/&quot; data-og-url=&quot;https://lkml.org/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://lkml.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://lkml.org/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;LKML.ORG - the Linux Kernel Mailing List Archive&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;lkml.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리눅스 커널 개발을 위한 메일 아카이브 사이트이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패치, 토론, 발표 등 다양한 이야기가 오고간다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리눅스 커널의 최신 동향을 가장 빠르게 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Linux Kernel Documentation&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.kernel.org/doc/html/latest/#&quot;&gt;The Linux Kernel documentation &amp;mdash; The Linux Kernel documentation&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1627324656686&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;The Linux Kernel documentation &amp;mdash; The Linux Kernel  documentation&quot; data-og-description=&quot;This is the top level of the kernel&amp;rsquo;s documentation tree. Kernel documentation, like the kernel itself, is very much a work in progress; that is especially true as we work to integrate our many scattered documents into a coherent whole. Please note that &quot; data-og-host=&quot;www.kernel.org&quot; data-og-source-url=&quot;https://www.kernel.org/doc/html/latest/#&quot; data-og-url=&quot;https://www.kernel.org/doc/html/latest/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.kernel.org/doc/html/latest/#&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.kernel.org/doc/html/latest/#&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;The Linux Kernel documentation &amp;mdash; The Linux Kernel documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;This is the top level of the kernel&amp;rsquo;s documentation tree. Kernel documentation, like the kernel itself, is very much a work in progress; that is especially true as we work to integrate our many scattered documents into a coherent whole. Please note that&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.kernel.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리눅스 커널 공식 다큐먼트 사이트이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내용이 공신력 있지만, 부실하거나 오래된 내용의 문서도 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래도 처음 접하는 기술에 대해 가장 먼저 참고할만한 사이트이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;국내&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 문c 블로그&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;http://jake.dothome.co.kr/&quot;&gt;문c 블로그 &amp;ndash; 최신 ARM 리눅스 5.x 커널 분석 (dothome.co.kr)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1627324958868&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;문c 블로그&quot; data-og-description=&quot;최신 ARM 리눅스 5.x 커널 분석&quot; data-og-host=&quot;jake.dothome.co.kr&quot; data-og-source-url=&quot;http://jake.dothome.co.kr/&quot; data-og-url=&quot;http://jake.dothome.co.kr&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;http://jake.dothome.co.kr/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;http://jake.dothome.co.kr/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;문c 블로그&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;최신 ARM 리눅스 5.x 커널 분석&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jake.dothome.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실상 지구에서 리눅스 커널에 대해 가장 자세히 분석해둔 사이트가 아닌가 싶다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블로그 포스트 중 메모리 포스팅 할 때 굉장히 많이 참고한 사이트이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(여담으로, 블로그에 메모리 외에도 프로세스, 스케줄링, 인터럽트 등 다양한 내용에 대해 분석 포스팅을 해보고 싶었는데, 해당 내용들은 아무리 열심히 해도 문c 님 블로그의 하위호환밖에 되지 않을 것 같아서 포기했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 후로 블로그에 직접 쓰는 커널 포스팅은 사실 전부 필자 본인이 나중에 참고하기 위하여 작성한 글이고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 분들에게 도움이 되기 위한 포스트는 문c님 블로그와 겹치지 않는 내용으로 깃헙 페이지에 작성하고 있다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Arm Linux Kernel Hacks 블로그&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;http://rousalome.egloos.com/&quot;&gt;Arm Linux Kernel Hacks (egloos.com)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1627325213503&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Arm Linux Kernel Hacks&quot; data-og-description=&quot;This blog contains Linux Kernel Analysis(4.x/5.x), Arm architecture and debugging skills for seminar and lecture.&quot; data-og-host=&quot;rousalome.egloos.com&quot; data-og-source-url=&quot;http://rousalome.egloos.com/&quot; data-og-url=&quot;http://rousalome.egloos.com&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bipSvC/hyK1plXRcg/b9tedKpX85RxtPabd5Msv0/img.jpg?width=580&amp;amp;height=537&amp;amp;face=245_262_338_363,https://scrap.kakaocdn.net/dn/4tOeM/hyK1rKPK5I/CJCTgkW4aqjiHySzIgHfm1/img.png?width=600&amp;amp;height=432&amp;amp;face=0_0_600_432,https://scrap.kakaocdn.net/dn/ddcJAT/hyK1fDDEBG/P6iMhak6Ni9HK9LeP9qqv0/img.png?width=600&amp;amp;height=240&amp;amp;face=0_0_600_240&quot;&gt;&lt;a href=&quot;http://rousalome.egloos.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;http://rousalome.egloos.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bipSvC/hyK1plXRcg/b9tedKpX85RxtPabd5Msv0/img.jpg?width=580&amp;amp;height=537&amp;amp;face=245_262_338_363,https://scrap.kakaocdn.net/dn/4tOeM/hyK1rKPK5I/CJCTgkW4aqjiHySzIgHfm1/img.png?width=600&amp;amp;height=432&amp;amp;face=0_0_600_432,https://scrap.kakaocdn.net/dn/ddcJAT/hyK1fDDEBG/P6iMhak6Ni9HK9LeP9qqv0/img.png?width=600&amp;amp;height=240&amp;amp;face=0_0_600_240');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Arm Linux Kernel Hacks&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;This blog contains Linux Kernel Analysis(4.x/5.x), Arm architecture and debugging skills for seminar and lecture.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;rousalome.egloos.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Austin Kim님의 커널 분석 블로그로, 어려운 내용들에 대해서도 쉽게 잘 설명해주신다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 블로그의 내용들을 업그레이드하여 출간하신 '리눅스 커널의 구조와 원리' 책은 세상에서 커널에 본격적으로 입문하기 가장 좋은 자료라고 생각한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 두 블로그가 한국어 블로그라는 것에 깊은 감사를 느낄 수 밖에 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(커널 공부 시작하는 사람들이라면 누구나 공감할 수 밖에 없을 것이다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. hyeyoo 블로그&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://hyeyoo.com/&quot;&gt;Bonjour, tout le monde! (hyeyoo.com)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1627325640622&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Bonjour, tout le monde!&quot; data-og-description=&quot;공부를 하다보니 기록을 남기는게 좋을거같아 만들어버린 블로그&quot; data-og-host=&quot;hyeyoo.com&quot; data-og-source-url=&quot;https://hyeyoo.com/&quot; data-og-url=&quot;https://hyeyoo.com&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cSjSOj/hyK1k51qeB/StuVkQaYfiLSIDR4OYNKc1/img.jpg?width=920&amp;amp;height=839&amp;amp;face=0_0_920_839,https://scrap.kakaocdn.net/dn/bNjRBm/hyK1e5NRsC/EgCL09p57HPgCx3XcGKukK/img.jpg?width=920&amp;amp;height=839&amp;amp;face=0_0_920_839,https://scrap.kakaocdn.net/dn/S3QWu/hyK1dTmII0/vM5e0PK6dk3nnj0CouePB1/img.png?width=276&amp;amp;height=260&amp;amp;face=0_0_276_260&quot;&gt;&lt;a href=&quot;https://hyeyoo.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://hyeyoo.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cSjSOj/hyK1k51qeB/StuVkQaYfiLSIDR4OYNKc1/img.jpg?width=920&amp;amp;height=839&amp;amp;face=0_0_920_839,https://scrap.kakaocdn.net/dn/bNjRBm/hyK1e5NRsC/EgCL09p57HPgCx3XcGKukK/img.jpg?width=920&amp;amp;height=839&amp;amp;face=0_0_920_839,https://scrap.kakaocdn.net/dn/S3QWu/hyK1dTmII0/vM5e0PK6dk3nnj0CouePB1/img.png?width=276&amp;amp;height=260&amp;amp;face=0_0_276_260');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Bonjour, tout le monde!&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;공부를 하다보니 기록을 남기는게 좋을거같아 만들어버린 블로그&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;hyeyoo.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;얼마 전에 알게 된 블로그인데, 안타깝지만 블로그 주인이 최근에 군대를 간 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근에 커널 공부를 시작하여 포스팅중인 것 같은데, 정리를 굉장히 잘 하는 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 유일하게 나보다 어린 친구인데, 잘 다녀와서 꾸준히 분석 및 포스팅 했으면 좋겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Lazenca TechNote&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;http://www.lazenca.net/display/TEC/07.Linux+Kernel+exploitation+techniques&quot;&gt;07.Linux Kernel exploitation techniques - TechNote - Lazenca.0x0&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1627326190767&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;07.Linux Kernel exploitation techniques - TechNote - Lazenca.0x0&quot; data-og-description=&quot;페이지 TechNote 02.TechNote 배너의 맨 끝으로 배너의 맨 처음으로 07.Linux Kernel exploitation techniques 메타 데이터의 끝으로 건너뛰기 Lazenca.0x0님이 작성, 10월 26, 2019에 최종 변경 메타 데이터의 시작으로 &quot; data-og-host=&quot;www.lazenca.net&quot; data-og-source-url=&quot;http://www.lazenca.net/display/TEC/07.Linux+Kernel+exploitation+techniques&quot; data-og-url=&quot;http://www.lazenca.net/display/TEC/07.Linux+Kernel+exploitation+techniques&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;http://www.lazenca.net/display/TEC/07.Linux+Kernel+exploitation+techniques&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;http://www.lazenca.net/display/TEC/07.Linux+Kernel+exploitation+techniques&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;07.Linux Kernel exploitation techniques - TechNote - Lazenca.0x0&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;페이지 TechNote 02.TechNote 배너의 맨 끝으로 배너의 맨 처음으로 07.Linux Kernel exploitation techniques 메타 데이터의 끝으로 건너뛰기 Lazenca.0x0님이 작성, 10월 26, 2019에 최종 변경 메타 데이터의 시작으로&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.lazenca.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여태까지 다른 사이트들은 당연하지만 전부 커널 분석 자체에 초점을 둔 사이트였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라젠카님의 테크노트의 경우 해킹/보안에 관련된 기술 블로그인데, 커널 익스플로잇 자료들 중에 가장 참고하기 좋은 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;익스플로잇 테크닉을 익히는 과정에서 커널 시스템에 대한 이해도를 좀 더 높일 수도 있다.&lt;/p&gt;</description>
      <category>IT</category>
      <category>Blog</category>
      <category>Kernel</category>
      <category>Linux</category>
      <category>reference</category>
      <category>site</category>
      <author>pr0gr4m</author>
      <guid isPermaLink="true">https://pr0gr4m.tistory.com/49</guid>
      <comments>https://pr0gr4m.tistory.com/entry/Linux-Kernel-%EC%B0%B8%EA%B3%A0-%EC%82%AC%EC%9D%B4%ED%8A%B8-%EC%B6%94%EC%B2%9C#entry49comment</comments>
      <pubDate>Tue, 27 Jul 2021 03:51:34 +0900</pubDate>
    </item>
    <item>
      <title>Linux Kernel Network Commit #1</title>
      <link>https://pr0gr4m.tistory.com/entry/Linux-Kernel-Commit</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;netdev 트리에 ip6_forward() 함수와 mpls_forward() 함수에 커밋했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git/commit/?id=46c7655f0b56b1ac864115441064cde9ed124f4a&quot;&gt;kernel/git/netdev/net.git - Netdev Group's networking tree&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1627056715957&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;kernel/git/netdev/net.git - Netdev Group's networking tree&quot; data-og-description=&quot;ipv6: decrease hop limit counter in ip6_forward()HEADmaster Decrease hop limit counter when deliver skb to ndp proxy. Signed-off-by: Kangmin Park &amp;lt;l4stpr0gr4m@gmail.com&amp;gt; Signed-off-by: David S. Miller &amp;lt;davem@davemloft.net&amp;gt; 1 files changed, 3 insertions, 2 &quot; data-og-host=&quot;git.kernel.org&quot; data-og-source-url=&quot;https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git/commit/?id=46c7655f0b56b1ac864115441064cde9ed124f4a&quot; data-og-url=&quot;https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git/commit/?id=46c7655f0b56b1ac864115441064cde9ed124f4a&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git/commit/?id=46c7655f0b56b1ac864115441064cde9ed124f4a&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git/commit/?id=46c7655f0b56b1ac864115441064cde9ed124f4a&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;kernel/git/netdev/net.git - Netdev Group's networking tree&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;ipv6: decrease hop limit counter in ip6_forward()HEADmaster Decrease hop limit counter when deliver skb to ndp proxy. Signed-off-by: Kangmin Park &amp;lt;l4stpr0gr4m@gmail.com&amp;gt; Signed-off-by: David S. Miller &amp;lt;davem@davemloft.net&amp;gt; 1 files changed, 3 insertions, 2 &amp;lt;/davem@davemloft.net&amp;gt;&amp;lt;/l4stpr0gr4m@gmail.com&amp;gt;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;git.kernel.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ip6_forward() 함수에서 hop_limit 카운터 체크 -&amp;gt; 온전성 검사 -&amp;gt; hop_limit 카운터 감소 순으로 작업을 수행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;온전성 검사 중에 NDP 프록시 체크 부분이 있는데, 패킷을 drop하는 다른 검사들과 달리 NDP 프록시라면 SKB를 로컬에 deliver해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 과정에서 NDP 프록시 또한 hop이므로 hop_limit 감소가 필요한데, 해당 내용이 누락되어서 추가하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/torvalds/linux/commit/46c7655f0b56b1ac864115441064cde9ed124f4a&quot;&gt;ipv6: decrease hop limit counter in ip6_forward() &amp;middot; torvalds/linux@46c7655 (github.com)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1627761743788&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;ipv6: decrease hop limit counter in ip6_forward() &amp;middot; torvalds/linux@46c7655&quot; data-og-description=&quot;Decrease hop limit counter when deliver skb to ndp proxy. Signed-off-by: Kangmin Park &amp;lt;l4stpr0gr4m@gmail.com&amp;gt; Signed-off-by: David S. Miller &amp;lt;davem@davemloft.net&amp;gt;&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/torvalds/linux/commit/46c7655f0b56b1ac864115441064cde9ed124f4a&quot; data-og-url=&quot;https://github.com/torvalds/linux/commit/46c7655f0b56b1ac864115441064cde9ed124f4a&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bpXpDG/hyK3HO01ao/Sw1LDccINowSCpLdKYx6K1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/torvalds/linux/commit/46c7655f0b56b1ac864115441064cde9ed124f4a&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/torvalds/linux/commit/46c7655f0b56b1ac864115441064cde9ed124f4a&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bpXpDG/hyK3HO01ao/Sw1LDccINowSCpLdKYx6K1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;ipv6: decrease hop limit counter in ip6_forward() &amp;middot; torvalds/linux@46c7655&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Decrease hop limit counter when deliver skb to ndp proxy. Signed-off-by: Kangmin Park &amp;lt;l4stpr0gr4m@gmail.com&amp;gt; Signed-off-by: David S. Miller &amp;lt;davem@davemloft.net&amp;gt;&amp;lt;/davem@davemloft.net&amp;gt;&amp;lt;/l4stpr0gr4m@gmail.com&amp;gt;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git/commit/?id=6a6b83ca471c&quot;&gt;kernel/git/netdev/net-next.git - Netdev Group's -next networking tree&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1627057281656&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;kernel/git/netdev/net-next.git - Netdev Group's -next networking tree&quot; data-og-description=&quot;mpls: defer ttl decrement in mpls_forward()HEADmaster Defer ttl decrement to optimize in tx_err case. There is no need to decrease ttl in the case of goto tx_err. Signed-off-by: Kangmin Park &amp;lt;l4stpr0gr4m@gmail.com&amp;gt; Signed-off-by: David S. Miller &amp;lt;davem@dav&quot; data-og-host=&quot;git.kernel.org&quot; data-og-source-url=&quot;https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git/commit/?id=6a6b83ca471c&quot; data-og-url=&quot;https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git/commit/?id=6a6b83ca471c&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git/commit/?id=6a6b83ca471c&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git/commit/?id=6a6b83ca471c&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;kernel/git/netdev/net-next.git - Netdev Group's -next networking tree&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;mpls: defer ttl decrement in mpls_forward()HEADmaster Defer ttl decrement to optimize in tx_err case. There is no need to decrease ttl in the case of goto tx_err. Signed-off-by: Kangmin Park &amp;lt;l4stpr0gr4m@gmail.com&amp;gt; Signed-off-by: David S. Miller &amp;lt;davem@dav&amp;lt; p=&quot;&quot;&amp;gt; &amp;lt;/davem@dav&amp;lt;&amp;gt;&amp;lt;/l4stpr0gr4m@gmail.com&amp;gt;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;git.kernel.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mpls_forward() 함수에서 포워딩 시 레이블의 ttl 값을 감소시킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데, ip_forward() 함수나 ip6_forward()에서 수행하는 것처럼 ttl 값을 체크한 후 바로 감소할 필요 없이, 온전성 검사를 수행한 이 후 감소해도 무관한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;온전성 검사를 통과하지 못하여 drop되는 패킷에 대해서는 ttl 감소를 수행하지 않는 것으로 최적화를 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단, mpls_egress() 함수에서 감소된 ttl 값을 사용하기 때문에 해당 함수가 호출되기 전에 ttl 감소를 수행해줘야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, 기존에 ttl을 바로 감소시키던 루틴을 온전성 검사 수행 후에 감소시키는 루틴으로 변경시켰다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마이너 트리에만 커밋하거나, 메이저 트리에는 trivial 커밋만 하다가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메이저 트리에 의미 있는 커밋이 들어가 기분 좋은 성과이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT</category>
      <category>commit</category>
      <category>Kernel</category>
      <category>Linux</category>
      <category>Network</category>
      <author>pr0gr4m</author>
      <guid isPermaLink="true">https://pr0gr4m.tistory.com/48</guid>
      <comments>https://pr0gr4m.tistory.com/entry/Linux-Kernel-Commit#entry48comment</comments>
      <pubDate>Sat, 24 Jul 2021 01:14:08 +0900</pubDate>
    </item>
    <item>
      <title>[Linux Kernel] network (networking stack)</title>
      <link>https://pr0gr4m.tistory.com/entry/Linux-Kernel-network-networking-stack</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;리눅스 커널 네트워킹 스택에 대해 설명합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sk_buff, ICMP, IP, 라우팅 서브시스템, 이웃 서브시스템(ARP, NDISC), TCP, UDP, SCTP, netfilter 등에 대해 포스팅 중입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블로그가 아닌 깃허브 페이지에 작성하였기 때문에 링크들을 첨부합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 해당 포스트 내용들은 기본적으로 Linux Kernel Networking 서적을 레퍼런스로 하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0-1. Linux Kernel Build&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://pr0gr4m.github.io/linux/kernel/kernel-build/&quot;&gt;Linux Kernel Build - Linux Kernel Analysis (pr0gr4m.github.io)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1626263910505&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Linux Kernel Build&quot; data-og-description=&quot;해당 포스트는 Ubuntu 20.04 버전을 기준으로 리눅스 커널을 빌드하고 설치하는 방법을 설명합니다.&quot; data-og-host=&quot;pr0gr4m.github.io&quot; data-og-source-url=&quot;https://pr0gr4m.github.io/linux/kernel/kernel-build/&quot; data-og-url=&quot;https://pr0gr4m.github.io/linux/kernel/kernel-build/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://pr0gr4m.github.io/linux/kernel/kernel-build/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://pr0gr4m.github.io/linux/kernel/kernel-build/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Linux Kernel Build&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;해당 포스트는 Ubuntu 20.04 버전을 기준으로 리눅스 커널을 빌드하고 설치하는 방법을 설명합니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;pr0gr4m.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0-2. Debugging Filesystem&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://pr0gr4m.github.io/linux/kernel/debug-fs/&quot;&gt;Linux Debugging FileSystem - Linux Kernel Analysis (pr0gr4m.github.io)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1626263935937&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Linux Debugging FileSystem&quot; data-og-description=&quot;해당 포스트에서는 커스텀 디버깅 파일시스템을 통하여 커널 디버깅하는 방법을 설명합니다.&quot; data-og-host=&quot;pr0gr4m.github.io&quot; data-og-source-url=&quot;https://pr0gr4m.github.io/linux/kernel/debug-fs/&quot; data-og-url=&quot;https://pr0gr4m.github.io/linux/kernel/debug-fs/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bFEbrD/hyKSSP2ucd/KLl3Tpq4dm8hg9o9C7B9hK/img.png?width=1110&amp;amp;height=713&amp;amp;face=0_0_1110_713&quot;&gt;&lt;a href=&quot;https://pr0gr4m.github.io/linux/kernel/debug-fs/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://pr0gr4m.github.io/linux/kernel/debug-fs/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bFEbrD/hyKSSP2ucd/KLl3Tpq4dm8hg9o9C7B9hK/img.png?width=1110&amp;amp;height=713&amp;amp;face=0_0_1110_713');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Linux Debugging FileSystem&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;해당 포스트에서는 커스텀 디버깅 파일시스템을 통하여 커널 디버깅하는 방법을 설명합니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;pr0gr4m.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0-3. ftrace&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://pr0gr4m.github.io/linux/kernel/ftrace/&quot;&gt;Linux Ftrace - Linux Kernel Analysis (pr0gr4m.github.io)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1626263944642&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Linux Ftrace&quot; data-og-description=&quot;해당 포스트에서는 기본적인 ftrace 사용법에 대하여 설명합니다. ftrace는 커널 내부 동작을 파악하기 위하여 사용하는 디버깅 도구입니다. 다음과 같은 기능들이 있습니다. dynamic kernel function traci&quot; data-og-host=&quot;pr0gr4m.github.io&quot; data-og-source-url=&quot;https://pr0gr4m.github.io/linux/kernel/ftrace/&quot; data-og-url=&quot;https://pr0gr4m.github.io/linux/kernel/ftrace/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://pr0gr4m.github.io/linux/kernel/ftrace/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://pr0gr4m.github.io/linux/kernel/ftrace/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Linux Ftrace&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;해당 포스트에서는 기본적인 ftrace 사용법에 대하여 설명합니다. ftrace는 커널 내부 동작을 파악하기 위하여 사용하는 디버깅 도구입니다. 다음과 같은 기능들이 있습니다. dynamic kernel function traci&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;pr0gr4m.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. sk_buff 구조체&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://pr0gr4m.github.io/linux/kernel/sk_buff/&quot;&gt;Linux Kernel SKB - Linux Kernel Analysis (pr0gr4m.github.io)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1626263785810&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Linux Kernel SKB&quot; data-og-description=&quot;해당 포스트에서는 sk_buff 구조체에 대하여 설명합니다.&quot; data-og-host=&quot;pr0gr4m.github.io&quot; data-og-source-url=&quot;https://pr0gr4m.github.io/linux/kernel/sk_buff/&quot; data-og-url=&quot;https://pr0gr4m.github.io/linux/kernel/sk_buff/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/MHTJo/hyKSTOWH4A/NHLlum7h2i2QYI9qklB1J0/img.png?width=550&amp;amp;height=322&amp;amp;face=0_0_550_322,https://scrap.kakaocdn.net/dn/cJR3Zf/hyKSYiop6L/xhkVPkB3hmhzya9SMnNxyk/img.png?width=550&amp;amp;height=322&amp;amp;face=0_0_550_322,https://scrap.kakaocdn.net/dn/e3h6j/hyKSP6OILe/yLyEFzMKpssXtZAJrghjt1/img.png?width=550&amp;amp;height=315&amp;amp;face=0_0_550_315&quot;&gt;&lt;a href=&quot;https://pr0gr4m.github.io/linux/kernel/sk_buff/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://pr0gr4m.github.io/linux/kernel/sk_buff/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/MHTJo/hyKSTOWH4A/NHLlum7h2i2QYI9qklB1J0/img.png?width=550&amp;amp;height=322&amp;amp;face=0_0_550_322,https://scrap.kakaocdn.net/dn/cJR3Zf/hyKSYiop6L/xhkVPkB3hmhzya9SMnNxyk/img.png?width=550&amp;amp;height=322&amp;amp;face=0_0_550_322,https://scrap.kakaocdn.net/dn/e3h6j/hyKSP6OILe/yLyEFzMKpssXtZAJrghjt1/img.png?width=550&amp;amp;height=315&amp;amp;face=0_0_550_315');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Linux Kernel SKB&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;해당 포스트에서는 sk_buff 구조체에 대하여 설명합니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;pr0gr4m.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. ICMPv4&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://pr0gr4m.github.io/linux/kernel/icmpv4/&quot;&gt;Linux Kernel ICMPv4 - Linux Kernel Analysis (pr0gr4m.github.io)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1628634568553&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Linux Kernel ICMPv4&quot; data-og-description=&quot;해당 포스트에서는 리눅스 커널의 ICMPv4 구현에 대해 설명합니다.&quot; data-og-host=&quot;pr0gr4m.github.io&quot; data-og-source-url=&quot;https://pr0gr4m.github.io/linux/kernel/icmpv4/&quot; data-og-url=&quot;https://pr0gr4m.github.io/linux/kernel/icmpv4/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bh9swA/hyLcqFcl0k/p3gQTY2LkENj2atCKnLKKk/img.png?width=948&amp;amp;height=587&amp;amp;face=0_0_948_587&quot;&gt;&lt;a href=&quot;https://pr0gr4m.github.io/linux/kernel/icmpv4/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://pr0gr4m.github.io/linux/kernel/icmpv4/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bh9swA/hyLcqFcl0k/p3gQTY2LkENj2atCKnLKKk/img.png?width=948&amp;amp;height=587&amp;amp;face=0_0_948_587');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Linux Kernel ICMPv4&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;해당 포스트에서는 리눅스 커널의 ICMPv4 구현에 대해 설명합니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;pr0gr4m.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. IPv4&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://pr0gr4m.github.io/linux/kernel/ipv4/&quot;&gt;Linux Kernel IPv4 - Linux Kernel Analysis (pr0gr4m.github.io)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1626263841890&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Linux Kernel IPv4&quot; data-og-description=&quot;해당 포스트에서는 리눅스 커널의 IPv4 구현에 대해 설명합니다.&quot; data-og-host=&quot;pr0gr4m.github.io&quot; data-og-source-url=&quot;https://pr0gr4m.github.io/linux/kernel/ipv4/&quot; data-og-url=&quot;https://pr0gr4m.github.io/linux/kernel/ipv4/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/KrFKE/hyKSR4DesO/JE4GDNUJvkASWxPIqKZ2Uk/img.png?width=2560&amp;amp;height=1398&amp;amp;face=0_0_2560_1398,https://scrap.kakaocdn.net/dn/bsuqCC/hyKSTBoz5u/hyDJW4k5k5vMfAjsWLk5U0/img.png?width=2560&amp;amp;height=1398&amp;amp;face=0_0_2560_1398,https://scrap.kakaocdn.net/dn/bKo61h/hyKSOGQJZa/YCiLKA4rfyOsWqfr8CRGZK/img.png?width=1045&amp;amp;height=1200&amp;amp;face=0_0_1045_1200&quot;&gt;&lt;a href=&quot;https://pr0gr4m.github.io/linux/kernel/ipv4/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://pr0gr4m.github.io/linux/kernel/ipv4/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/KrFKE/hyKSR4DesO/JE4GDNUJvkASWxPIqKZ2Uk/img.png?width=2560&amp;amp;height=1398&amp;amp;face=0_0_2560_1398,https://scrap.kakaocdn.net/dn/bsuqCC/hyKSTBoz5u/hyDJW4k5k5vMfAjsWLk5U0/img.png?width=2560&amp;amp;height=1398&amp;amp;face=0_0_2560_1398,https://scrap.kakaocdn.net/dn/bKo61h/hyKSOGQJZa/YCiLKA4rfyOsWqfr8CRGZK/img.png?width=1045&amp;amp;height=1200&amp;amp;face=0_0_1045_1200');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Linux Kernel IPv4&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;해당 포스트에서는 리눅스 커널의 IPv4 구현에 대해 설명합니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;pr0gr4m.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. IPv4 Routing Subsystem&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://pr0gr4m.github.io/linux/kernel/ipv4_routing/&quot;&gt;Linux Kernel IPv4 Routing Subsystem - Linux Kernel Analysis (pr0gr4m.github.io)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1626263847656&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Linux Kernel IPv4 Routing Subsystem&quot; data-og-description=&quot;해당 포스트에서는 리눅스 커널의 IPv4 라우팅 서브시스템 구현에 대해 설명합니다.&quot; data-og-host=&quot;pr0gr4m.github.io&quot; data-og-source-url=&quot;https://pr0gr4m.github.io/linux/kernel/ipv4_routing/&quot; data-og-url=&quot;https://pr0gr4m.github.io/linux/kernel/ipv4_routing/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ydEDD/hyKSOmyZru/SuvkqrNIWdpMQaMaKi0kRk/img.png?width=653&amp;amp;height=776&amp;amp;face=0_0_653_776,https://scrap.kakaocdn.net/dn/emOSC2/hyKSIGEnPY/Ol4EEE16AYUc4lWbcELXc0/img.png?width=981&amp;amp;height=315&amp;amp;face=0_0_981_315&quot;&gt;&lt;a href=&quot;https://pr0gr4m.github.io/linux/kernel/ipv4_routing/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://pr0gr4m.github.io/linux/kernel/ipv4_routing/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ydEDD/hyKSOmyZru/SuvkqrNIWdpMQaMaKi0kRk/img.png?width=653&amp;amp;height=776&amp;amp;face=0_0_653_776,https://scrap.kakaocdn.net/dn/emOSC2/hyKSIGEnPY/Ol4EEE16AYUc4lWbcELXc0/img.png?width=981&amp;amp;height=315&amp;amp;face=0_0_981_315');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Linux Kernel IPv4 Routing Subsystem&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;해당 포스트에서는 리눅스 커널의 IPv4 라우팅 서브시스템 구현에 대해 설명합니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;pr0gr4m.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. Neighbour Subsystem&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://pr0gr4m.github.io/linux/kernel/neighbour/&quot;&gt;Linux Kernel Neighbour Subsystem - Linux Kernel Analysis (pr0gr4m.github.io)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1626263859814&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Linux Kernel Neighbour Subsystem&quot; data-og-description=&quot;해당 포스트에서는 리눅스 커널의 이웃 탐색 시스템과 ARP 프로토콜 구현에 대해 설명합니다.&quot; data-og-host=&quot;pr0gr4m.github.io&quot; data-og-source-url=&quot;https://pr0gr4m.github.io/linux/kernel/neighbour/&quot; data-og-url=&quot;https://pr0gr4m.github.io/linux/kernel/neighbour/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/srVbI/hyKSLXETHZ/xu82VK5sF9mBz2ytxxdBc1/img.png?width=1083&amp;amp;height=587&amp;amp;face=0_0_1083_587,https://scrap.kakaocdn.net/dn/rkTA8/hyKSI7FZc2/uldSkleC6ffHn9UNg1ekj0/img.png?width=674&amp;amp;height=331&amp;amp;face=0_0_674_331&quot;&gt;&lt;a href=&quot;https://pr0gr4m.github.io/linux/kernel/neighbour/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://pr0gr4m.github.io/linux/kernel/neighbour/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/srVbI/hyKSLXETHZ/xu82VK5sF9mBz2ytxxdBc1/img.png?width=1083&amp;amp;height=587&amp;amp;face=0_0_1083_587,https://scrap.kakaocdn.net/dn/rkTA8/hyKSI7FZc2/uldSkleC6ffHn9UNg1ekj0/img.png?width=674&amp;amp;height=331&amp;amp;face=0_0_674_331');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Linux Kernel Neighbour Subsystem&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;해당 포스트에서는 리눅스 커널의 이웃 탐색 시스템과 ARP 프로토콜 구현에 대해 설명합니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;pr0gr4m.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. IPv6&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://pr0gr4m.github.io/linux/kernel/ipv6/&quot;&gt;Linux Kernel IPv6 - Linux Kernel Analysis (pr0gr4m.github.io)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1626943894010&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Linux Kernel IPv6&quot; data-og-description=&quot;해당 포스트에서는 리눅스 커널의 IPv6 구현에 대해 설명합니다.&quot; data-og-host=&quot;pr0gr4m.github.io&quot; data-og-source-url=&quot;https://pr0gr4m.github.io/linux/kernel/ipv6/&quot; data-og-url=&quot;https://pr0gr4m.github.io/linux/kernel/ipv6/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/fRWHL/hyKX1fnHRj/1vBDvURlFFLtB8Vl7EWTLK/img.png?width=876&amp;amp;height=785&amp;amp;face=0_0_876_785,https://scrap.kakaocdn.net/dn/PvSFF/hyKXS3PseK/NUe68WCFGK5XggTX4saHe0/img.png?width=740&amp;amp;height=425&amp;amp;face=0_0_740_425,https://scrap.kakaocdn.net/dn/DuW2U/hyKZh1Zwjm/XcSWn7X0J9G7vg5KeqxhH0/img.png?width=941&amp;amp;height=215&amp;amp;face=0_0_941_215&quot;&gt;&lt;a href=&quot;https://pr0gr4m.github.io/linux/kernel/ipv6/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://pr0gr4m.github.io/linux/kernel/ipv6/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/fRWHL/hyKX1fnHRj/1vBDvURlFFLtB8Vl7EWTLK/img.png?width=876&amp;amp;height=785&amp;amp;face=0_0_876_785,https://scrap.kakaocdn.net/dn/PvSFF/hyKXS3PseK/NUe68WCFGK5XggTX4saHe0/img.png?width=740&amp;amp;height=425&amp;amp;face=0_0_740_425,https://scrap.kakaocdn.net/dn/DuW2U/hyKZh1Zwjm/XcSWn7X0J9G7vg5KeqxhH0/img.png?width=941&amp;amp;height=215&amp;amp;face=0_0_941_215');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Linux Kernel IPv6&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;해당 포스트에서는 리눅스 커널의 IPv6 구현에 대해 설명합니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;pr0gr4m.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. ICMPv6&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://pr0gr4m.github.io/linux/kernel/icmpv6/&quot;&gt;Linux Kernel ICMPv6 - Linux Kernel Analysis (pr0gr4m.github.io)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1626943876102&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Linux Kernel ICMPv6&quot; data-og-description=&quot;해당 포스트에서는 리눅스 커널의 ICMPv6 구현에 대해 설명합니다.&quot; data-og-host=&quot;pr0gr4m.github.io&quot; data-og-source-url=&quot;https://pr0gr4m.github.io/linux/kernel/icmpv6/&quot; data-og-url=&quot;https://pr0gr4m.github.io/linux/kernel/icmpv6/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bOISnJ/hyKXYiDXYV/yG42ibFymVzyyWALEKGAj0/img.png?width=1101&amp;amp;height=659&amp;amp;face=0_0_1101_659,https://scrap.kakaocdn.net/dn/dhcgOo/hyKZmCdEQ8/oBspxpa5Y6B2Emy2KAGTeK/img.png?width=1019&amp;amp;height=613&amp;amp;face=0_0_1019_613&quot;&gt;&lt;a href=&quot;https://pr0gr4m.github.io/linux/kernel/icmpv6/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://pr0gr4m.github.io/linux/kernel/icmpv6/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bOISnJ/hyKXYiDXYV/yG42ibFymVzyyWALEKGAj0/img.png?width=1101&amp;amp;height=659&amp;amp;face=0_0_1101_659,https://scrap.kakaocdn.net/dn/dhcgOo/hyKZmCdEQ8/oBspxpa5Y6B2Emy2KAGTeK/img.png?width=1019&amp;amp;height=613&amp;amp;face=0_0_1019_613');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Linux Kernel ICMPv6&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;해당 포스트에서는 리눅스 커널의 ICMPv6 구현에 대해 설명합니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;pr0gr4m.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. Netfilter&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://pr0gr4m.github.io/linux/kernel/netfilter/&quot;&gt;Linux Kernel Netfilter - Linux Kernel Analysis (pr0gr4m.github.io)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1628842800921&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Linux Kernel Netfilter&quot; data-og-description=&quot;해당 포스트에서는 리눅스 커널의 넷필터에 대해 설명합니다. 넷필터 서브시스템은 네트워크 스택 내에서 패킷이 이동하는 여러 지점에 콜백을 등록하는 것을 비롯해 주소나 포트 변경, 패킷 dr&quot; data-og-host=&quot;pr0gr4m.github.io&quot; data-og-source-url=&quot;https://pr0gr4m.github.io/linux/kernel/netfilter/&quot; data-og-url=&quot;https://pr0gr4m.github.io/linux/kernel/netfilter/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dn3gkg/hyLdwTWPdb/ge33yrg6UtXGEXfQ7lMiYK/img.png?width=1293&amp;amp;height=1053&amp;amp;face=0_0_1293_1053,https://scrap.kakaocdn.net/dn/c2Xoj0/hyLdBVgiTC/4sEUtyfx8AY5uPvN610ML1/img.png?width=938&amp;amp;height=725&amp;amp;face=0_0_938_725,https://scrap.kakaocdn.net/dn/bHWvCX/hyLdrZnCMJ/eFaHPinK0aSDELkKCfU1y1/img.png?width=725&amp;amp;height=839&amp;amp;face=0_0_725_839&quot;&gt;&lt;a href=&quot;https://pr0gr4m.github.io/linux/kernel/netfilter/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://pr0gr4m.github.io/linux/kernel/netfilter/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dn3gkg/hyLdwTWPdb/ge33yrg6UtXGEXfQ7lMiYK/img.png?width=1293&amp;amp;height=1053&amp;amp;face=0_0_1293_1053,https://scrap.kakaocdn.net/dn/c2Xoj0/hyLdBVgiTC/4sEUtyfx8AY5uPvN610ML1/img.png?width=938&amp;amp;height=725&amp;amp;face=0_0_938_725,https://scrap.kakaocdn.net/dn/bHWvCX/hyLdrZnCMJ/eFaHPinK0aSDELkKCfU1y1/img.png?width=725&amp;amp;height=839&amp;amp;face=0_0_725_839');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Linux Kernel Netfilter&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;해당 포스트에서는 리눅스 커널의 넷필터에 대해 설명합니다. 넷필터 서브시스템은 네트워크 스택 내에서 패킷이 이동하는 여러 지점에 콜백을 등록하는 것을 비롯해 주소나 포트 변경, 패킷 dr&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;pr0gr4m.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9. Socket, UDP, TCP&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://pr0gr4m.github.io/linux/kernel/layer4/&quot;&gt;Linux Kernel Layer 4 Network - Linux Kernel Analysis (pr0gr4m.github.io)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1628842809102&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Linux Kernel Layer 4 Network&quot; data-og-description=&quot;해당 포스트는 리눅스 커널의 Layer 4 계층에 대하여 설명합니다.&quot; data-og-host=&quot;pr0gr4m.github.io&quot; data-og-source-url=&quot;https://pr0gr4m.github.io/linux/kernel/layer4/&quot; data-og-url=&quot;https://pr0gr4m.github.io/linux/kernel/layer4/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://pr0gr4m.github.io/linux/kernel/layer4/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://pr0gr4m.github.io/linux/kernel/layer4/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Linux Kernel Layer 4 Network&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;해당 포스트는 리눅스 커널의 Layer 4 계층에 대하여 설명합니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;pr0gr4m.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT/Linux Kernel</category>
      <category>icmp</category>
      <category>IP</category>
      <category>Kernel</category>
      <category>Linux</category>
      <category>Netfilter</category>
      <category>Network</category>
      <category>networking</category>
      <category>SOCKET</category>
      <category>TCP</category>
      <category>UDP</category>
      <author>pr0gr4m</author>
      <guid isPermaLink="true">https://pr0gr4m.tistory.com/47</guid>
      <comments>https://pr0gr4m.tistory.com/entry/Linux-Kernel-network-networking-stack#entry47comment</comments>
      <pubDate>Wed, 14 Jul 2021 20:59:27 +0900</pubDate>
    </item>
    <item>
      <title>리눅스 커널 책 리뷰 및 가이드</title>
      <link>https://pr0gr4m.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%BB%A4%EB%84%90-%EC%B1%85-%EB%A6%AC%EB%B7%B0-%EB%B0%8F-%EA%B0%80%EC%9D%B4%EB%93%9C</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 디버깅을 통해 배우는 리눅스 커널의 구조와 원리&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://www.yes24.com/Product/Goods/90085976&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;www.yes24.com/Product/Goods/90085976&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1595413174676&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;book&quot; data-og-title=&quot;디버깅을 통해 배우는 리눅스 커널의 구조와 원리 1&quot; data-og-description=&quot;신입 리눅스 시스템 개발자부터 5년차 개발자가 실무를 하기 위해 알아야 할 리눅스 커널의 주요 서브시스템!실전 개발에서 신입 사원 옆에 친절한 선배 개발자가 앉아서 리눅스 커널에 대해 꼼&quot; data-og-host=&quot;www.yes24.com&quot; data-og-source-url=&quot;http://www.yes24.com/Product/Goods/90085976&quot; data-og-url=&quot;http://www.yes24.com/Product/Goods/90085976&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bi6Glv/hyGQJcfcwL/aGz7r1BCVTWzoD7qrVYCv1/img.jpg?width=329&amp;amp;height=400&amp;amp;face=0_0_329_400&quot;&gt;&lt;a href=&quot;http://www.yes24.com/Product/Goods/90085976&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;http://www.yes24.com/Product/Goods/90085976&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bi6Glv/hyGQJcfcwL/aGz7r1BCVTWzoD7qrVYCv1/img.jpg?width=329&amp;amp;height=400&amp;amp;face=0_0_329_400');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;디버깅을 통해 배우는 리눅스 커널의 구조와 원리 1&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;신입 리눅스 시스템 개발자부터 5년차 개발자가 실무를 하기 위해 알아야 할 리눅스 커널의 주요 서브시스템!실전 개발에서 신입 사원 옆에 친절한 선배 개발자가 앉아서 리눅스 커널에 대해 꼼&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;www.yes24.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;a href=&quot;http://www.yes24.com/Product/Goods/90087307&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;www.yes24.com/Product/Goods/90087307&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1595413182008&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;book&quot; data-og-title=&quot;디버깅을 통해 배우는 리눅스 커널의 구조와 원리 2&quot; data-og-description=&quot;신입 리눅스 시스템 개발자부터 5년차 개발자가 실무를 하기 위해 알아야 할 리눅스 커널의 주요 서브시스템!실전 개발에서 신입 사원 옆에 친절한 선배 개발자가 앉아서 리눅스 커널에 대해 꼼&quot; data-og-host=&quot;www.yes24.com&quot; data-og-source-url=&quot;http://www.yes24.com/Product/Goods/90087307&quot; data-og-url=&quot;http://www.yes24.com/Product/Goods/90087307&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/P8cNK/hyGQQvFwB2/ZNvA72BkuSghMkye0sj0d1/img.jpg?width=328&amp;amp;height=400&amp;amp;face=0_0_328_400&quot;&gt;&lt;a href=&quot;http://www.yes24.com/Product/Goods/90087307&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;http://www.yes24.com/Product/Goods/90087307&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/P8cNK/hyGQQvFwB2/ZNvA72BkuSghMkye0sj0d1/img.jpg?width=328&amp;amp;height=400&amp;amp;face=0_0_328_400');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;디버깅을 통해 배우는 리눅스 커널의 구조와 원리 2&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;신입 리눅스 시스템 개발자부터 5년차 개발자가 실무를 하기 위해 알아야 할 리눅스 커널의 주요 서브시스템!실전 개발에서 신입 사원 옆에 친절한 선배 개발자가 앉아서 리눅스 커널에 대해 꼼&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;www.yes24.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;기본적인 커널 컨셉 설명, 구조체와 함수 설명, 커널 디버깅 설명을 쉽게 풀어쓴 책이다.&lt;/p&gt;
&lt;p&gt;커널 공부를 본격적으로 시작하기 가장 좋은 책같다.&lt;/p&gt;
&lt;p&gt;아주 깊은 내용을 세세하게 설명하지는 않는다.&lt;/p&gt;
&lt;p&gt;여태까지 공부했던 커널 책중에 가장 가독성이 뛰어나다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 코드로 알아보는 ARM 리눅스 커널&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://www.yes24.com/Product/Goods/60856943&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;www.yes24.com/Product/Goods/60856943&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1595413336491&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;book&quot; data-og-title=&quot;코드로 알아보는 ARM 리눅스 커널&quot; data-og-description=&quot;최신 ARM64 커널을 코드 레벨에서 상세히 분석하다!현업에서 커널 업무를 하고 있거나, 취미로 커널 분석을 시작했지만 방대한 양과 난해한 코드 때문에 어려움을 겪고 있는가? 시간이 부족하여 �&quot; data-og-host=&quot;www.yes24.com&quot; data-og-source-url=&quot;http://www.yes24.com/Product/Goods/60856943&quot; data-og-url=&quot;http://www.yes24.com/Product/Goods/60856943&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/hapZm/hyGQCxrF9W/BLsWxpFtU9RaNwzJgiQY7k/img.jpg?width=301&amp;amp;height=400&amp;amp;face=0_0_301_400&quot;&gt;&lt;a href=&quot;http://www.yes24.com/Product/Goods/60856943&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;http://www.yes24.com/Product/Goods/60856943&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/hapZm/hyGQCxrF9W/BLsWxpFtU9RaNwzJgiQY7k/img.jpg?width=301&amp;amp;height=400&amp;amp;face=0_0_301_400');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;코드로 알아보는 ARM 리눅스 커널&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;최신 ARM64 커널을 코드 레벨에서 상세히 분석하다!현업에서 커널 업무를 하고 있거나, 취미로 커널 분석을 시작했지만 방대한 양과 난해한 코드 때문에 어려움을 겪고 있는가? 시간이 부족하여 �&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;www.yes24.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;리눅스 커널 코드의 핵심부분을 세세하게 분석한 책이다.&lt;/p&gt;
&lt;p&gt;아키텍처 종속적인 부분은 ARM 코드로 분석하는데, 많은 내용이 아키텍처 독립적이고 범용적이다.&lt;/p&gt;
&lt;p&gt;솔직히 가독성이 좋지는 않다.&lt;/p&gt;
&lt;p&gt;1번 책을 완독한 후 더 자세하게 분석한 자료가 필요하다면 해당 책을 공부하면 좋다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 리눅스 커널 소스 해설 기초입문&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://www.yes24.com/Product/Goods/89174355&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;www.yes24.com/Product/Goods/89174355&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1595413526457&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;book&quot; data-og-title=&quot;리눅스 커널 소스 해설 기초입문&quot; data-og-description=&quot;저자가 리눅스 커널 소스를 분석한 내용을 바탕으로 이해하기 쉽게 구어체로 설명하는 형식으로 구성되어 있다. 이 책을 통해서 최신 리눅스 커널 소스를 컴파일/빌드/분석하는 방법을 단계별��&quot; data-og-host=&quot;www.yes24.com&quot; data-og-source-url=&quot;http://www.yes24.com/Product/Goods/89174355&quot; data-og-url=&quot;http://www.yes24.com/Product/Goods/89174355&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/fJhY3/hyGQIdkug2/0LdcS6V3fQFB6BYRkzzkQK/img.jpg?width=280&amp;amp;height=400&amp;amp;face=0_0_280_400&quot;&gt;&lt;a href=&quot;http://www.yes24.com/Product/Goods/89174355&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;http://www.yes24.com/Product/Goods/89174355&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/fJhY3/hyGQIdkug2/0LdcS6V3fQFB6BYRkzzkQK/img.jpg?width=280&amp;amp;height=400&amp;amp;face=0_0_280_400');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;리눅스 커널 소스 해설 기초입문&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;저자가 리눅스 커널 소스를 분석한 내용을 바탕으로 이해하기 쉽게 구어체로 설명하는 형식으로 구성되어 있다. 이 책을 통해서 최신 리눅스 커널 소스를 컴파일/빌드/분석하는 방법을 단계별��&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;www.yes24.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;아예 리눅스 커널 자체를 처음 접하는 사람이 입문하기 좋은 책이다.&lt;/p&gt;
&lt;p&gt;커널 설정, 빌드와 수정 등을 어떻게 하면 되는지와, 커널에서 대표적으로 사용하는 자료구조를 설명한다.&lt;/p&gt;
&lt;p&gt;사실 그다지 깊은 내용을 다루지는 않는다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. DevOps와 SE를 위한 리눅스 커널 이야기&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://www.yes24.com/Product/Goods/44376723&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;www.yes24.com/Product/Goods/44376723&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1595413628741&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;book&quot; data-og-title=&quot;DevOps와 SE를 위한 리눅스 커널 이야기&quot; data-og-description=&quot;커널은 오랜 세월 기능이 추가되고 개선되어 오면서 완벽하게 이해하기 힘들 정도로 방대해졌다. 하지만 변하지 않는 기본 기능들이 있다. 이런 근간이 되는 기능에 대한 이해를 바탕으로 시스�&quot; data-og-host=&quot;www.yes24.com&quot; data-og-source-url=&quot;http://www.yes24.com/Product/Goods/44376723&quot; data-og-url=&quot;http://www.yes24.com/Product/Goods/44376723&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/buyCM3/hyGRYlj7zr/1VYK6KznKqKk54S4XdJTJK/img.jpg?width=304&amp;amp;height=400&amp;amp;face=0_0_304_400&quot;&gt;&lt;a href=&quot;http://www.yes24.com/Product/Goods/44376723&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;http://www.yes24.com/Product/Goods/44376723&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/buyCM3/hyGRYlj7zr/1VYK6KznKqKk54S4XdJTJK/img.jpg?width=304&amp;amp;height=400&amp;amp;face=0_0_304_400');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;DevOps와 SE를 위한 리눅스 커널 이야기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;커널은 오랜 세월 기능이 추가되고 개선되어 오면서 완벽하게 이해하기 힘들 정도로 방대해졌다. 하지만 변하지 않는 기본 기능들이 있다. 이런 근간이 되는 기능에 대한 이해를 바탕으로 시스�&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;www.yes24.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;책 제목에서 볼 수 있는 것과 같이, 주로 SE를 위한 커널 컨셉과 설정들을 설명한다.&lt;/p&gt;
&lt;p&gt;소스 코드를 분석하거나 수정하기 위한 책은 아니다.&lt;/p&gt;
&lt;p&gt;리눅스 시스템을 조금 더 전문적으로 관리할 수 있는 지식을 쌓을 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. 리눅스 커널 프로그래밍&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://www.yes24.com/Product/Goods/19660111&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;www.yes24.com/Product/Goods/19660111&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1595413730453&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;book&quot; data-og-title=&quot;리눅스 커널 프로그래밍&quot; data-og-description=&quot;이 책은 커널을 과감히 뜯어고쳐가면서 다양한 실습을 하는 데 집중하고 있다. 눈으로 보고, 머릿 속으로 생각하는 것이 아니라 손가락을 바삐 움직이면서 커널을 이해하는 것을 목표로 하고 있&quot; data-og-host=&quot;www.yes24.com&quot; data-og-source-url=&quot;http://www.yes24.com/Product/Goods/19660111&quot; data-og-url=&quot;http://www.yes24.com/Product/Goods/19660111&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/er5kSt/hyGR3fRIhT/LJbnuIJdokzGK2HZzRgNYK/img.jpg?width=298&amp;amp;height=400&amp;amp;face=0_0_298_400&quot;&gt;&lt;a href=&quot;http://www.yes24.com/Product/Goods/19660111&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;http://www.yes24.com/Product/Goods/19660111&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/er5kSt/hyGR3fRIhT/LJbnuIJdokzGK2HZzRgNYK/img.jpg?width=298&amp;amp;height=400&amp;amp;face=0_0_298_400');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;리눅스 커널 프로그래밍&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;이 책은 커널을 과감히 뜯어고쳐가면서 다양한 실습을 하는 데 집중하고 있다. 눈으로 보고, 머릿 속으로 생각하는 것이 아니라 손가락을 바삐 움직이면서 커널을 이해하는 것을 목표로 하고 있&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;www.yes24.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;2.4 - 2.6 버전 커널을 실습하며 익힐 수 있는 책이다. (절판되었다.)&lt;/p&gt;
&lt;p&gt;깊은 내용을 세세하게 설명하지는 않지만, 커널 수정 및 모듈 프로그래밍 실습을 진행하며 이해도를 높일 수 있다.&lt;/p&gt;
&lt;p&gt;커널 4,5버전과는 맞지 않는 내용이 대부분이지만, 해당 내용들을 최신 커널에 맞춰 업데이트해가며 실습하면 이해도를 더욱 높일 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6. 리눅스 커널 네트워킹&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://www.yes24.com/Product/Goods/31918354&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;www.yes24.com/Product/Goods/31918354&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1595413873307&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;book&quot; data-og-title=&quot;리눅스 커널 네트워킹&quot; data-og-description=&quot;『리눅스 커널 네트워킹』은 최신의 리눅스 네트워킹 서브 시스템을 다루는 책이다. 리눅스 네트워킹 서브 시스템이 기초적이고, 안정적이지만 수많은 프로토콜과 기술이 녹아들어 있는 네트��&quot; data-og-host=&quot;www.yes24.com&quot; data-og-source-url=&quot;http://www.yes24.com/Product/Goods/31918354&quot; data-og-url=&quot;http://www.yes24.com/Product/Goods/31918354&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/coBZhu/hyGQKPLZ4D/Z46k0gvyC82l1WOYl1nsc1/img.jpg?width=321&amp;amp;height=400&amp;amp;face=0_0_321_400&quot;&gt;&lt;a href=&quot;http://www.yes24.com/Product/Goods/31918354&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;http://www.yes24.com/Product/Goods/31918354&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/coBZhu/hyGQKPLZ4D/Z46k0gvyC82l1WOYl1nsc1/img.jpg?width=321&amp;amp;height=400&amp;amp;face=0_0_321_400');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;리눅스 커널 네트워킹&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;『리눅스 커널 네트워킹』은 최신의 리눅스 네트워킹 서브 시스템을 다루는 책이다. 리눅스 네트워킹 서브 시스템이 기초적이고, 안정적이지만 수많은 프로토콜과 기술이 녹아들어 있는 네트��&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;www.yes24.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;커널 네트워크 부분을 상세하게 설명한 책이다.&lt;/p&gt;
&lt;p&gt;1,2번 책이 네트워크 부분을 다루지는 않는데, 이 책을 공부하면서 해당 부분을 커버할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7. 리눅스 커널 HACKS&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://www.yes24.com/Product/Goods/12474141&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;www.yes24.com/Product/Goods/12474141&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1595413980818&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;book&quot; data-og-title=&quot;리눅스 커널 HACKS&quot; data-og-description=&quot;인터넷상에는 리눅스에 관한 정보가 넘쳐나고 있지만, 대단히 복잡하게 진화한 리눅스 커널을 능숙하게 사용하거나 리눅스 커널 개발에 참가하는 데 필요한 정보는 충분히 얻을 수 없는 현실에&quot; data-og-host=&quot;www.yes24.com&quot; data-og-source-url=&quot;http://www.yes24.com/Product/Goods/12474141&quot; data-og-url=&quot;http://www.yes24.com/Product/Goods/12474141&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/fJmDB/hyGSaeZRFL/tlhwb38kat7aXyjE4SrTkk/img.jpg?width=318&amp;amp;height=400&amp;amp;face=0_0_318_400&quot;&gt;&lt;a href=&quot;http://www.yes24.com/Product/Goods/12474141&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;http://www.yes24.com/Product/Goods/12474141&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/fJmDB/hyGSaeZRFL/tlhwb38kat7aXyjE4SrTkk/img.jpg?width=318&amp;amp;height=400&amp;amp;face=0_0_318_400');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;리눅스 커널 HACKS&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;인터넷상에는 리눅스에 관한 정보가 넘쳐나고 있지만, 대단히 복잡하게 진화한 리눅스 커널을 능숙하게 사용하거나 리눅스 커널 개발에 참가하는 데 필요한 정보는 충분히 얻을 수 없는 현실에&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;www.yes24.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;리눅스 커널에 있는 컨셉들을 설명하고 어떻게 시스템을 최적화하는지 설명한 책이다.&lt;/p&gt;
&lt;p&gt;절판된 책이며 2.6버전 커널이기에 커널 4,5버전과 일부 맞지 않을 수는 있다.&lt;/p&gt;
&lt;p&gt;하지만 수록된 테크닉들은 전반적인 시스템 세팅 능력 향상에 도움이 된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;8. 리눅스 커널 IN A NUTSHELL&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://www.yes24.com/Product/Goods/3224540&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;www.yes24.com/Product/Goods/3224540&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1595414227437&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;book&quot; data-og-title=&quot;리눅스 커널 IN A NUTSHELL&quot; data-og-description=&quot;리눅스 커널이 무료로 사용할 수 있는 운영체제라 할지라도 이를 어떻게 활용하는지에 따라 발휘할 수 있는 성능은 천차만별이라고 말하면서 커널 소스를 보배로 변화시킬 수 있는 기본적인 사&quot; data-og-host=&quot;www.yes24.com&quot; data-og-source-url=&quot;http://www.yes24.com/Product/Goods/3224540&quot; data-og-url=&quot;http://www.yes24.com/Product/Goods/3224540&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/pMswF/hyGQMz25Ab/JWrziNe7zUtDrjZEtFrrSk/img.jpg?width=270&amp;amp;height=400&amp;amp;face=0_0_270_400&quot;&gt;&lt;a href=&quot;http://www.yes24.com/Product/Goods/3224540&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;http://www.yes24.com/Product/Goods/3224540&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/pMswF/hyGQMz25Ab/JWrziNe7zUtDrjZEtFrrSk/img.jpg?width=270&amp;amp;height=400&amp;amp;face=0_0_270_400');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;리눅스 커널 IN A NUTSHELL&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;리눅스 커널이 무료로 사용할 수 있는 운영체제라 할지라도 이를 어떻게 활용하는지에 따라 발휘할 수 있는 성능은 천차만별이라고 말하면서 커널 소스를 보배로 변화시킬 수 있는 기본적인 사&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;www.yes24.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;커널 권위자 그렉옹의 레퍼런스북이다.&lt;/p&gt;
&lt;p&gt;마찬가지로 구버전 커널 내용이긴 하지만, 원래 커널에 어떤 개념들이 있었나 살펴보기 좋다.&lt;/p&gt;
&lt;p&gt;7번 책과 병행하면 시너지효과가 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;9. Linux Kernel Development&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://www.yes24.com/Product/Goods/3124201&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;www.yes24.com/Product/Goods/3124201&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1595414337626&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;book&quot; data-og-title=&quot;Love: Linux Kernel Development _p3&quot; data-og-description=&quot; &quot; data-og-host=&quot;www.yes24.com&quot; data-og-source-url=&quot;http://www.yes24.com/Product/Goods/3124201&quot; data-og-url=&quot;http://www.yes24.com/Product/Goods/3124201&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/TkUcp/hyGQM08XyM/mFdUNWf3RA3WzawGO5ImDK/img.jpg?width=311&amp;amp;height=400&amp;amp;face=0_0_311_400&quot;&gt;&lt;a href=&quot;http://www.yes24.com/Product/Goods/3124201&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;http://www.yes24.com/Product/Goods/3124201&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/TkUcp/hyGQM08XyM/mFdUNWf3RA3WzawGO5ImDK/img.jpg?width=311&amp;amp;height=400&amp;amp;face=0_0_311_400');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Love: Linux Kernel Development _p3&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;www.yes24.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;리눅스 커널의 전반적인 내용을 설명한다.&lt;/p&gt;
&lt;p&gt;과거 공부할만한 자료가 없었을땐 입문하기 좋은 책이었지만,&lt;/p&gt;
&lt;p&gt;현재는 국내에 1번같은 서적도 있고 해당 서적 내용이 마찬가지로 2.6 기준이라 그다지 추천하진 않는다.&lt;/p&gt;
&lt;p&gt;단, 커널이 아니라 OS 공부에 입문하려고 하는데 공룡책은 싫고 리눅스 기준으로 공부하고 싶다 하면 해당 책을 강추한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;10.&amp;nbsp; Understading the Linux Kernel&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://www.yes24.com/Product/Goods/1583489&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;www.yes24.com/Product/Goods/1583489&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1595414491972&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;book&quot; data-og-title=&quot;Understanding the Linux Kernel&quot; data-og-description=&quot;In order to thoroughly understand what makes Linux tick and why it works so well on a wide variety of systems, you need to delve deep into the heart of the kernel. The kernel handles all interactions ...&quot; data-og-host=&quot;www.yes24.com&quot; data-og-source-url=&quot;http://www.yes24.com/Product/Goods/1583489&quot; data-og-url=&quot;http://www.yes24.com/Product/Goods/1583489&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/e4VZF/hyGR6p7WQL/JKJtoWQS7IJcOajloHskC0/img.jpg?width=304&amp;amp;height=400&amp;amp;face=107_278_129_302&quot;&gt;&lt;a href=&quot;http://www.yes24.com/Product/Goods/1583489&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;http://www.yes24.com/Product/Goods/1583489&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/e4VZF/hyGR6p7WQL/JKJtoWQS7IJcOajloHskC0/img.jpg?width=304&amp;amp;height=400&amp;amp;face=107_278_129_302');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Understanding the Linux Kernel&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;In order to thoroughly understand what makes Linux tick and why it works so well on a wide variety of systems, you need to delve deep into the heart of the kernel. The kernel handles all interactions ...&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;www.yes24.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;9번과 약간 비슷한 양상이긴 하지만 좀 더 깊이있는 내용을 설명한다.&lt;/p&gt;
&lt;p&gt;커널의 많은 핵심 개념들, 구조체, 함수 등을 설명하는데 마찬가지로 out-of-date지만, 내용이 좋아서 추천할만하다.&lt;/p&gt;
&lt;p&gt;1,2번 책이 커널 자체에 집중해있다면 해당 책은 좀 더 넓은 OS 컨셉으로 시작해서 점차 리눅스 커널 내용으로 좁혀들어간다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;11. Linux Device Drivers&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://www.yes24.com/Product/Goods/1461176&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;www.yes24.com/Product/Goods/1461176&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1595414857243&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;book&quot; data-og-title=&quot;Linux Device Drivers&quot; data-og-description=&quot;This book, a classic entering its third edition, is a must-read for anyone who wants to support computer peripherals under the Linux operating system, wants to run new hardware under Linux, or is simp...&quot; data-og-host=&quot;www.yes24.com&quot; data-og-source-url=&quot;http://www.yes24.com/Product/Goods/1461176&quot; data-og-url=&quot;http://www.yes24.com/Product/Goods/1461176&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bnE4xT/hyGQR9cOX7/oKkBbEAwwIESdNJyW5ZeKk/img.jpg?width=302&amp;amp;height=400&amp;amp;face=0_0_302_400&quot;&gt;&lt;a href=&quot;http://www.yes24.com/Product/Goods/1461176&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;http://www.yes24.com/Product/Goods/1461176&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bnE4xT/hyGQR9cOX7/oKkBbEAwwIESdNJyW5ZeKk/img.jpg?width=302&amp;amp;height=400&amp;amp;face=0_0_302_400');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Linux Device Drivers&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;This book, a classic entering its third edition, is a must-read for anyone who wants to support computer peripherals under the Linux operating system, wants to run new hardware under Linux, or is simp...&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;www.yes24.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;해외 사이트들을 보면 이 책을 완독하기 전까지 커널 프로그래밍을 하지 말아라 라는 문구가 있을 정도의 바이블이다.&lt;/p&gt;
&lt;p&gt;아쉽게도 그렉옹이 레딧에 4판은 계획에 없다고 밝혔다.&lt;/p&gt;
&lt;p&gt;예제들이 마찬가지로 obsolete된 내용들이 많아 잘 되지 않지만,&lt;/p&gt;
&lt;p&gt;깃헙에 예제 up-to-date 프로젝트들이 꽤나 있다. (&lt;a href=&quot;https://github.com/martinezjavier/ldd3&quot;&gt;https://github.com/martinezjavier/ldd3&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;디바이스 드라이버 제작뿐만이 아니라 전반적인 커널 프로그래밍에 있어 바이블이 되는 책이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;개인적으로 목적에 따른 학습 커리큘럼은 아래와 같이 추천한다.&lt;/p&gt;
&lt;p&gt;(물론 리눅스 환경과 리눅스 시스템 프로그래밍에 익숙하다는 전제가 깔려있다.)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;시스템 최적화를 위한 커널 학습 : 4 -&amp;gt; 7 -&amp;gt; 8&lt;/p&gt;
&lt;p&gt;리눅스 커널 분석 및 연구 : 3(선택) -&amp;gt; 1 -&amp;gt; 10 -&amp;gt; 2 -&amp;gt; 6&lt;/p&gt;
&lt;p&gt;리눅스 커널 프로그래밍 : 5 -&amp;gt; 1 -&amp;gt; 11&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;p.s. 위 절판된 책들은 대부분 도서관에서 빌려볼 수 있습니다.&lt;/p&gt;</description>
      <category>Book/IT</category>
      <category>Book</category>
      <category>guide</category>
      <category>Kernel</category>
      <category>Linux</category>
      <category>Review</category>
      <author>pr0gr4m</author>
      <guid isPermaLink="true">https://pr0gr4m.tistory.com/46</guid>
      <comments>https://pr0gr4m.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%BB%A4%EB%84%90-%EC%B1%85-%EB%A6%AC%EB%B7%B0-%EB%B0%8F-%EA%B0%80%EC%9D%B4%EB%93%9C#entry46comment</comments>
      <pubDate>Wed, 22 Jul 2020 19:56:10 +0900</pubDate>
    </item>
    <item>
      <title>[Linux Kernel] spinlock</title>
      <link>https://pr0gr4m.tistory.com/entry/spinlock</link>
      <description>&lt;p&gt;arm 리눅스 커널의 spin lock 구현부를 보면 다음과 같다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;c arduino&quot; style=&quot;font-family: monospace;&quot;&gt;&lt;code&gt;typedef struct {
	union {
		u32 slock;
		struct __raw_tickets {
#ifdef __ARMEB__
			u16 next;
			u16 owner;
#else
			u16 owner;
			u16 next;
#endif
		} tickets;
	};
} arch_spinlock_t;

static inline void arch_spin_lock(arch_spinlock_t *lock)
{
	unsigned long tmp;
	u32 newval;
	arch_spinlock_t lockval;
&amp;nbsp;
	prefetchw(&amp;amp;lock-&amp;gt;slock);
	__asm__ __volatile__(
&quot;1:	ldrex	%0, [%3]\n&quot;
&quot;	add	%1, %0, %4\n&quot;
&quot;	strex	%2, %1, [%3]\n&quot;
&quot;	teq	%2, #0\n&quot;
&quot;	bne	1b&quot;
	: &quot;=&amp;amp;r&quot; (lockval), &quot;=&amp;amp;r&quot; (newval), &quot;=&amp;amp;r&quot; (tmp)
	: &quot;r&quot; (&amp;amp;lock-&amp;gt;slock), &quot;I&quot; (1 &amp;lt;&amp;lt; TICKET_SHIFT)
	: &quot;cc&quot;);
&amp;nbsp;
	while (lockval.tickets.next != lockval.tickets.owner) {
		wfe();
		lockval.tickets.owner = READ_ONCE(lock-&amp;gt;tickets.owner);
	}
&amp;nbsp;
	smp_mb();
}
&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;arch_spinlock_t 타입의 락 변수 lock의 tickets을 보면 next와 owner로 구성되어 있는데,&lt;/p&gt;
&lt;p&gt;next == owner이면 해당 스핀락은 점유되지 않은 상태이고,&lt;/p&gt;
&lt;p&gt;next가 owner보다 크다면 현재 점유되고 있는 상태이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;여기서 arch_spin_lock 코드를 보면 인라인 어셈블리 코드에서 lock의 next를 1 증가시키고&lt;/p&gt;
&lt;p&gt;이 후 while문에서 기존 lock의 next 값(1 증가시키기 전)과 owner 값을 비교하여 둘이 같으면 함수를 종료한다.&lt;/p&gt;
&lt;p&gt;(owner 값은 busy-waiting이 끝날 수 있도록 while문 내에서 READ_ONCE를 통해 계속 최신 값을 업데이트한다.)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;즉, next = owner = 1인 상황에서 spin_lock을 호출하면&amp;nbsp;&lt;/p&gt;
&lt;p&gt;1) next = 2, owner = 1이 됨&lt;/p&gt;
&lt;p&gt;2) 기존 next와 owner가 1이므로 함수 종료&lt;/p&gt;
&lt;p&gt;가 된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이 상태에서 unlock하지 않고 (next = 2, owner = 1) 다른 프로세스가 다시 한번 spin_lock을 호출하면&lt;/p&gt;
&lt;p&gt;1) next = 3, owner = 1이 됨&lt;/p&gt;
&lt;p&gt;2) 기존 next와 owner가 같지 않으므로 while문 반복&lt;/p&gt;
&lt;p&gt;2-1) lock ticket의 owner값을 읽음&lt;/p&gt;
&lt;p&gt;2-2) 먼저 락을 획득한 프로세스가 unlock하여 owner값이 2가 되면 기존 next와 owner값이 같아져서 while문 탈출&lt;/p&gt;
&lt;p&gt;3) 함수 종료&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;가 된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;여기서 체크 -&amp;gt; 증가 순서가 아닌, 증가 -&amp;gt; 체크를 하는 것에 의아할 수 있다.&lt;/p&gt;
&lt;p&gt;선 증가 후 체크라면 여러개의 프로세스가 동시에 점유되어있는 스핀락을 잠그려고 시도하면 버그가 일어나지 않을까 생각할 수 있다.&lt;/p&gt;
&lt;p&gt;예를 들어, next = 2, owner = 1인 상태에서 A와 B가 동시에 lock을 시도한다고 하면&lt;/p&gt;
&lt;p&gt;1) A가 next를 3으로 증가시킴&lt;/p&gt;
&lt;p&gt;2) B가 next를 4로 증가시킴&lt;/p&gt;
&lt;p&gt;3) 기존 태스크가 unlock함&lt;/p&gt;
&lt;p&gt;4) 기존 next는 2이며 owner는 2로 업데이트되어 A와 B가 동시에 함수를 빠져나감&lt;/p&gt;
&lt;p&gt;5) A와 B가 동시에 lock을 획득해버렸음&lt;/p&gt;
&lt;p&gt;같은 상황이 나올 수 있다고 생각할 수 있다.&lt;/p&gt;
&lt;p&gt;하지만 이는 strex라는 exclusive monitor instruction에 의해 방지된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;인라인 어셈블리 내용을 조금 자세히 살펴보면 다음과 같다.&lt;/p&gt;
&lt;ol&gt;
&lt;li style=&quot;font-weight: normal; vertical-align: top;&quot;&gt;
&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin: 0; padding: 0; background: none; vertical-align: top;&quot;&gt;__asm__ __volatile__&lt;span style=&quot;color: #009900; font-weight: bold;&quot;&gt;(&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;font-weight: normal; vertical-align: top;&quot;&gt;
&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin: 0; padding: 0; background: none; vertical-align: top;&quot;&gt;&lt;span style=&quot;color: #7f007f;&quot;&gt;&quot;1: ldrex %0, [%3]\n&quot;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;font-weight: normal; vertical-align: top;&quot;&gt;
&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin: 0; padding: 0; background: none; vertical-align: top;&quot;&gt;&lt;span style=&quot;color: #7f007f;&quot;&gt;&quot; add %1, %0, %4\n&quot;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;font-weight: normal; vertical-align: top;&quot;&gt;
&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin: 0; padding: 0; background: none; vertical-align: top;&quot;&gt;&lt;span style=&quot;color: #7f007f;&quot;&gt;&quot; strex %2, %1, [%3]\n&quot;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;font-weight: bold; vertical-align: top;&quot;&gt;
&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin: 0; padding: 0; background: none; vertical-align: top;&quot;&gt;&lt;span style=&quot;color: #7f007f;&quot;&gt;&quot; teq %2, #0\n&quot;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;font-weight: normal; vertical-align: top;&quot;&gt;
&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin: 0; padding: 0; background: none; vertical-align: top;&quot;&gt;&lt;span style=&quot;color: #7f007f;&quot;&gt;&quot; bne 1b&quot;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;font-weight: normal; vertical-align: top;&quot;&gt;
&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin: 0; padding: 0; background: none; vertical-align: top;&quot;&gt;&lt;span style=&quot;color: #339933;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #7f007f;&quot;&gt;&quot;=&amp;amp;r&quot;&lt;/span&gt; &lt;span style=&quot;color: #009900; font-weight: bold;&quot;&gt;(&lt;/span&gt;lockval&lt;span style=&quot;color: #009900; font-weight: bold;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #7f007f;&quot;&gt;&quot;=&amp;amp;r&quot;&lt;/span&gt; &lt;span style=&quot;color: #009900; font-weight: bold;&quot;&gt;(&lt;/span&gt;newval&lt;span style=&quot;color: #009900; font-weight: bold;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #7f007f;&quot;&gt;&quot;=&amp;amp;r&quot;&lt;/span&gt; &lt;span style=&quot;color: #009900; font-weight: bold;&quot;&gt;(&lt;/span&gt;tmp&lt;span style=&quot;color: #009900; font-weight: bold;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;font-weight: normal; vertical-align: top;&quot;&gt;
&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin: 0; padding: 0; background: none; vertical-align: top;&quot;&gt;&lt;span style=&quot;color: #339933;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #7f007f;&quot;&gt;&quot;r&quot;&lt;/span&gt; &lt;span style=&quot;color: #009900; font-weight: bold;&quot;&gt;(&lt;/span&gt;&amp;amp;&lt;span style=&quot;color: #00007f; font-weight: bold;&quot;&gt;lock&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;-&lt;/span&gt;&amp;gt;slock&lt;span style=&quot;color: #009900; font-weight: bold;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #7f007f;&quot;&gt;&quot;I&quot;&lt;/span&gt; &lt;span style=&quot;color: #009900; font-weight: bold;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;1&lt;/span&gt; &amp;lt;&amp;lt; TICKET_SHIFT&lt;span style=&quot;color: #009900; font-weight: bold;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;font-weight: normal; vertical-align: top;&quot;&gt;
&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin: 0; padding: 0; background: none; vertical-align: top;&quot;&gt;&lt;span style=&quot;color: #339933;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #7f007f;&quot;&gt;&quot;cc&quot;&lt;/span&gt;&lt;span style=&quot;color: #009900; font-weight: bold;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;%0, %1, %2, %3, %4는 차례대로 lockval, newval, tmp, &amp;amp;lock-&amp;gt;slock, 1 &amp;lt;&amp;lt; TICKET_SHIFT가 된다.&lt;/p&gt;
&lt;p&gt;2번 라인에서 lock의 ticket 값을 lockval에 로드한다.&lt;/p&gt;
&lt;p&gt;3번 라인에서 lockval + (1 &amp;lt;&amp;lt; TICKET_SHIFT) 값을 newval에 저장한다.&lt;/p&gt;
&lt;p&gt;4번 라인에서 lock의 ticket 값을 newval 값으로 업데이트한다.&lt;/p&gt;
&lt;p&gt;여기서 lock의 ticket값을 자신만 업데이트하였다면 exclusive monitor status가 변경되지 않아 tmp가 0으로 업데이트된다. 만약 다른 누군가가 lock의 ticket값을 건드렸다면, exclusive monitor status가 변경되어 tmp가 1이 된다.&lt;/p&gt;
&lt;p&gt;5번 라인에서 tmp값이 0인지 확인한다.&lt;/p&gt;
&lt;p&gt;6번 라인에서 tmp값이 0이 아니라면 1번 레이블로 돌아가서 처음부터 다시 수행한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;따라서 위 시나리오의 1번과 2번에서 A와 B가 동시에 next를 증가시켜 next가 4가 될 수 없다.&lt;/p&gt;
&lt;p&gt;STREX 명령어에 대해 더 자세히 알고싶다면 다음 &lt;a href=&quot;https://developer.arm.com/documentation/dui0204/j/arm-and-thumb-instructions/memory-access-instructions/ldrex-and-strex&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;링크&lt;/a&gt;를 참고한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;아무튼 arm상에서 스핀락의 구현은 위와 같다.&lt;/p&gt;
&lt;p&gt;(참고로 x86/amd64상에서는 스핀락이 struct qspinlock으로 구현되어있다.&lt;/p&gt;
&lt;p&gt;lock/unlock 함수들의 구현은 mutex와 상당히 유사하다.)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT/Linux Kernel</category>
      <category>Kernel</category>
      <category>Linux</category>
      <category>spinlock</category>
      <category>strex</category>
      <author>pr0gr4m</author>
      <guid isPermaLink="true">https://pr0gr4m.tistory.com/45</guid>
      <comments>https://pr0gr4m.tistory.com/entry/spinlock#entry45comment</comments>
      <pubDate>Fri, 10 Jul 2020 09:33:45 +0900</pubDate>
    </item>
  </channel>
</rss>