<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>easy blog</title>
    <link>https://easy16.tistory.com/</link>
    <description>github

https://github.com/Jihyun-Lee/ </description>
    <language>ko</language>
    <pubDate>Sun, 5 Jul 2026 02:58:19 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>easy16</managingEditor>
    <image>
      <title>easy blog</title>
      <url>https://tistory1.daumcdn.net/tistory/1892189/attach/054fedf98c5e4cffa6218876c26715ae</url>
      <link>https://easy16.tistory.com</link>
    </image>
    <item>
      <title>ftrace script</title>
      <link>https://easy16.tistory.com/436</link>
      <description>&lt;pre id=&quot;code_1766914760881&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#!/bin/bash


echo 0 &amp;gt; /sys/kernel/debug/tracing/tracing_on
echo &quot;ftrace off&quot;
sleep 3
cp /sys/kernel/debug/tracing/trace .
mv trace ftrace_log&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;setter&lt;/p&gt;
&lt;pre id=&quot;code_1766914740237&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#!/bin/bash


echo 0 &amp;gt; /sys/kernel/debug/tracing/tracing_on
sleep 1

echo 0 &amp;gt; /sys/kernel/debug/tracing/events/enable
sleep 1
echo &quot;events disabled&quot;

#echo secondary_start_kernel &amp;gt; /sys/kernel/debug/tracing/set_ftrace_filter
#sleep 1
#echo &quot;set_ftrace_filter init&quot;


echo function &amp;gt; /sys/kernel/debug/tracing/current_tracer
sleep 1
echo &quot;function tracer enabled&quot;

#echo rpi_get_interrupt_info &amp;gt; /sys/kernel/debug/tracing/set_ftrace_filter
#echo show_interrupts &amp;gt; /sys/kernel/debug/tracing/set_ftrace_filter
echo zoneinfo_show &amp;gt; /sys/kernel/debug/tracing/set_ftrace_filter
sleep 1
echo &quot;set_ftrace_filter enabled&quot;

#echo 1 &amp;gt; /sys/kernel/debug/tracing/events/irq/irq_handler_entry/enable
#echo 1 &amp;gt; /sys/kernel/debug/tracing/events/irq/irq_handler_exit/enable

echo &quot;event enabled&quot;

echo 1 &amp;gt; /sys/kernel/debug/tracing/options/func_stack_trace
echo &quot;function stack trace enabled&quot;

echo 1 &amp;gt; /sys/kernel/debug/tracing/options/func_stack_trace
echo 1 &amp;gt; /sys/kernel/debug/tracing/options/sym-offset
echo &quot;function stack trace enabled&quot;


echo 1 &amp;gt; /sys/kernel/debug/tracing/tracing_on
echo &quot;tracing on&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;getter&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;</description>
      <category>linux</category>
      <author>easy16</author>
      <guid isPermaLink="true">https://easy16.tistory.com/436</guid>
      <comments>https://easy16.tistory.com/436#entry436comment</comments>
      <pubDate>Sun, 28 Dec 2025 18:39:39 +0900</pubDate>
    </item>
    <item>
      <title>/proc/meminfo와 zoneinfo의 관계</title>
      <link>https://easy16.tistory.com/435</link>
      <description>&lt;div data-test-render-count=&quot;2&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-testid=&quot;user-message&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/proc/meminfo의 값들을 계산할 때도 zoneinfo에서 사용되는 page 정보들을 이용해 계산되는가&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-state=&quot;closed&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div data-state=&quot;closed&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div data-state=&quot;closed&quot;&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div data-test-render-count=&quot;1&quot;&gt;
&lt;div&gt;
&lt;div data-is-streaming=&quot;false&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&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;/proc/meminfo의 값들은 /proc/zoneinfo의 페이지 정보들을 집계해서 계산됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;/proc/meminfo의 주요 항목 계산&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;c&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;// linux/mm/page_alloc.c에서
si_meminfo() 함수가 zoneinfo를 읽어서 meminfo 계산

MemTotal = &amp;Sigma;(모든 zone의 managed)
MemFree = &amp;Sigma;(모든 zone의 free)
MemAvailable = MemFree + 회수 가능한 페이지들
MemUsed = MemTotal - MemFree
```

## 당신의 RPi4 데이터로 검증
```
/proc/zoneinfo에서:
Node 0, DMA:      managed = 220735,  free = 215866
Node 0, DMA32:    managed = 253815,  free = 133994
Node 1, DMA32:    managed = 497449,  free = 380141
                  ──────────────────  ──────────────
                  합계 = 971999       합계 = 730001

&amp;darr; 이를 /proc/meminfo로 변환 &amp;darr;

MemTotal = 971999 &amp;times; 4 = 3,887,996 KB
MemFree = 730001 &amp;times; 4 = 2,920,004 KB&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;/proc/meminfo의 다른 항목들도 zoneinfo 기반&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;bash&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;ini&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;MemTotal       = &amp;Sigma; managed
MemFree        = &amp;Sigma; free
MemAvailable   = MemFree + (회수 가능한 파일 캐시)
Buffers        = 버퍼 캐시 (zoneinfo의 nr_file_pages 관련)
Cached         = 파일 캐시 (zoneinfo의 nr_active_file + nr_inactive_file)
Active         = &amp;Sigma; nr_active_anon + nr_active_file
Inactive       = &amp;Sigma; nr_inactive_anon + nr_inactive_file
AnonPages      = &amp;Sigma; nr_anon_pages
Slab           = &amp;Sigma; (nr_slab_reclaimable + nr_slab_unreclaimable)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;커널 소스코드&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;c&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;xl&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;// mm/page_alloc.c
void si_meminfo(struct sysinfo *val)
{
    unsigned long pages = 0;
    
    // 모든 zone 순회
    for_each_zone(zone) {
        pages += zone-&amp;gt;managed_pages;      // MemTotal 계산
    }
    val-&amp;gt;totalram = pages;
    
    // MemFree 계산
    val-&amp;gt;freeram = global_node_page_state(NR_FREE_PAGES);
    
    // 기타 항목들...
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실제 확인 방법&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;bash&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;tcl&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;# zoneinfo의 managed 합계
awk '/managed/{sum+=$2} END {print &quot;MemTotal = &quot; sum*4 &quot; KB&quot;}' /proc/zoneinfo

# zoneinfo의 free 합계
awk '/pages free/{sum+=$3} END {print &quot;MemFree = &quot; sum*4 &quot; KB&quot;}' /proc/zoneinfo

# /proc/meminfo 값과 비교
grep &quot;MemTotal\|MemFree&quot; /proc/meminfo
```

## 더 상세한 대응관계
```
/proc/meminfo 항목          zoneinfo 출처
─────────────────────────────────────────────
MemTotal                    &amp;Sigma; managed
MemFree                     &amp;Sigma; free
MemAvailable                MemFree + 회수 가능
Buffers                     (버퍼 캐시)
Cached                      &amp;Sigma; nr_file_pages
Active(anon)                &amp;Sigma; nr_active_anon
Inactive(anon)              &amp;Sigma; nr_inactive_anon
Active(file)                &amp;Sigma; nr_active_file
Inactive(file)              &amp;Sigma; nr_inactive_file
AnonPages                   &amp;Sigma; nr_anon_pages
Slab                        &amp;Sigma; nr_slab_reclaimable + 
                              nr_slab_unreclaimable
KernelStack                 &amp;Sigma; nr_kernel_stack
PageTables                  &amp;Sigma; nr_page_table_pages
```

## 계층 관계
```
/proc/zoneinfo (세부 정보)
        &amp;uarr;
        │ (커널이 집계)
        &amp;darr;
/proc/meminfo (통합 정보)
        &amp;uarr;
        │ (사용자가 조회)
        &amp;darr;
free, top 등의 도구&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;결론:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;✅ /proc/meminfo는 /proc/zoneinfo 정보를 실시간으로 집계해서 만들어짐&lt;/li&gt;
&lt;li&gt;✅ zoneinfo의 managed/free 합계 &amp;times; 4K = meminfo의 MemTotal/MemFree&lt;/li&gt;
&lt;li&gt;✅ 둘 다 같은 커널 메모리 관리 데이터 구조에서 나옴&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>linux</category>
      <author>easy16</author>
      <guid isPermaLink="true">https://easy16.tistory.com/435</guid>
      <comments>https://easy16.tistory.com/435#entry435comment</comments>
      <pubDate>Sun, 28 Dec 2025 16:53:57 +0900</pubDate>
    </item>
    <item>
      <title>/proc/zoneinfo 해석 방법</title>
      <link>https://easy16.tistory.com/434</link>
      <description>&lt;h1&gt;/proc/zoneinfo 해석 가이드&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;핵심 항목만 보기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복잡해 보이지만, &lt;b&gt;실제로 중요한 항목은 몇 개&lt;/b&gt;입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1단계: 노드(Node)와 존(Zone) 파악&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;crmsh&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;Node 0, zone DMA      &amp;larr; NUMA Node 0의 DMA 영역
Node 0, zone DMA32    &amp;larr; NUMA Node 0의 DMA32 영역
Node 1, zone DMA32    &amp;larr; NUMA Node 1의 DMA32 영역&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당신의 경우: &lt;b&gt;2개 노드, 각각 DMA + DMA32 영역만 사용&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2단계: 각 Zone의 메모리 상태&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;RPi4 기준으로 중요한 항목:&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;Node 0, zone DMA
  pages free     215866        &amp;larr; 사용 가능한 페이지 수
        managed  220735        &amp;larr; 관리 중인 전체 페이지 수
        cma      131072        &amp;larr; CMA 영역 (카메라/GPU용)
  nr_free_cma  126266          &amp;larr; 사용 가능한 CMA 페이지&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;간단한 계산:&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;basic&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;215866 pages &amp;times; 4KB = 약 843MB 자유 메모리 (DMA 존)
126266 CMA pages &amp;times; 4KB = 약 492MB (GPU/카메라용 예약)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3단계: 간단한 해석 패턴&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;bash&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;yaml&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;# 이 명령으로 깔끔하게 보기
grep -E &quot;zone|free|managed|cma&quot; /proc/zoneinfo
```

**출력 예:**
```
Node 0, zone      DMA
  pages free     215866        # ✓ 자유 메모리
        managed  220735        # 관리 중
        cma      131072        # GPU 예약
  nr_free_cma  126266          # ✓ 사용 가능한 CMA

Node 0, zone    DMA32
  pages free     133994        # ✓ 자유 메모리
        managed  253815        # 관리 중
```

## RPi4 당신의 상황 분석
```
Node 0 (CPU 0,1 담당):
  DMA:   215,866 pages free (약 843MB) - GPU 공유
  DMA32: 133,994 pages free (약 523MB)
  
Node 1 (CPU 2,3 담당):
  DMA32: 380,141 pages free (약 1.4GB)

전체: 약 2.7GB 자유 메모리
```

## 추가 유용한 해석

**per-cpu pageset (CPU별 캐시):**
```
pagesets
  cpu: 0
        count: 62           &amp;larr; CPU 0의 로컬 캐시 페이지 수
        high:  290         &amp;larr; 상한선 (초과하면 buddy로 반환)
        batch: 63          &amp;larr; 배치 크기
  cpu: 1
        count: 0           &amp;larr; CPU 1은 로컬 캐시 비어있음
```

**최소/최대 임계값:**
```
min:  930    &amp;larr; 이 이하면 메모리 부족
low:  1162   &amp;larr; kswapd 깨우는 수준
high: 1394   &amp;larr; 여유 있는 수준&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;한 줄로 상태 확인&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;bash&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;stata&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;# 전체 자유 메모리 계산
awk '/pages free/{sum+=$3} END {print sum*4 &quot;KB =&quot; sum/256 &quot;MB&quot;}' /proc/zoneinfo
```

**당신의 시스템:**
```
약 750,000 pages &amp;times; 4KB = 약 2.9GB 자유 메모리&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;스크립트로 간단하게 보기&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;bash&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;crmsh&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;#!/bin/bash
echo &quot;=== Zone 메모리 상태 ===&quot;
awk '/^Node/ {node=$2} /^  zone/ {zone=$2} /pages free/ {free=$3} /managed/ {managed=$2} /nr_free_cma/ {cma=$2} /^$/ {if(node) printf &quot;Node %s, %s: Free=%dMB (CMA=%dMB), Total=%dMB\n&quot;, node, zone, free*4/256, cma*4/256, managed*4/256}' /proc/zoneinfo&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;가장 간단한 방법&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;bash&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;perl&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;# 1. 전체 자유 메모리만 보기
free -h

# 2. Zone별 상세는 이 부분만 보기
grep -A3 &quot;^Node&quot; /proc/zoneinfo | grep -E &quot;free|managed&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;결론:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;free&lt;/b&gt; = 사용 가능한 페이지 수&lt;/li&gt;
&lt;li&gt;&lt;b&gt;managed&lt;/b&gt; = 관리 중인 전체 페이지 수&lt;/li&gt;
&lt;li&gt;&lt;b&gt;cma&lt;/b&gt; = GPU/카메라용 예약 영역&lt;/li&gt;
&lt;li&gt;나머지는 대부분 무시해도 됨&lt;/li&gt;
&lt;/ul&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;div data-test-render-count=&quot;2&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-testid=&quot;user-message&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;nr_은 무엇의 약자야? , managed는 어떤 의미인지 모르겠어 사용 중인거야 사용 가능한거야&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span data-state=&quot;closed&quot;&gt;오후 4:27&lt;/span&gt;
&lt;div&gt;
&lt;div data-state=&quot;closed&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div data-state=&quot;closed&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div data-state=&quot;closed&quot;&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div data-test-render-count=&quot;2&quot;&gt;
&lt;div&gt;
&lt;div data-is-streaming=&quot;false&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h1&gt;nr_과 managed의 의미&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;nr_ = &quot;number of&quot;의 약자&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;c&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;yaml&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;nr_free_pages   = number of free pages (자유 페이지의 수)
nr_dirty        = number of dirty pages (더티 페이지의 수)
nr_slab_reclaimable = number of slab reclaimable (회수 가능한 slab의 수)
```

**정리:**
- `nr_` = **개수/숫자**를 나타내는 접두사
- 항상 &quot;몇 개인가&quot;를 의미

---

## managed = 커널이 관리하는 페이지
```
물리 메모리
├─ 예약된 영역 (BIOS, 부트로더 등) - 커널이 건드리지 않음
├─ managed &amp;larr; 커널이 관리할 수 있는 영역
│   ├─ free (사용 가능)
│   ├─ used (사용 중)
│   └─ ...
└─ (기타)
```

**쉽게 말하면:**
- **managed** = 커널이 할당/관리하는 페이지 풀
- **free** = managed 중에서 **지금 비어있는** 것

---

## 구체적 예시
```
Node 0, zone DMA
  pages free     215866    &amp;larr; 현재 비어있는 페이지
        managed  220735    &amp;larr; 커널이 관리할 수 있는 전체 페이지
        
사용 중인 페이지 = managed - free
               = 220735 - 215866
               = 4869 pages (약 19MB 사용 중)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;다른 항목들과의 관계&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;c&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;yaml&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;struct zone {
    // 페이지 상태 분류
    managed          // 커널이 관리 가능한 전체 페이지
    ├─ free          // 사용 가능한 페이지 (할당 대기 중)
    └─ used (암묵적)
        ├─ nr_active_anon        // 활성 익명 페이지 (메모리)
        ├─ nr_inactive_anon      // 비활성 익명 페이지
        ├─ nr_active_file        // 활성 파일 캐시
        ├─ nr_inactive_file      // 비활성 파일 캐시
        ├─ nr_kernel_stack       // 커널 스택
        ├─ nr_page_table_pages   // 페이지 테이블
        └─ ... (기타 사용 중인 페이지)
};
```

## 당신의 RPi4 데이터로 분석
```
Node 0, zone DMA
  managed: 220735 pages (전체 관리 페이지)
  free:    215866 pages (현재 사용 가능)
  
  사용 중: 220735 - 215866 = 4869 pages
         = 약 19MB 사용 중
         
  내역:
    nr_active_anon:     0      (익명 페이지)
    nr_active_file:     0      (파일 캐시)
    nr_kernel_stack:    ?      (커널 스택)
    ... (합쳐서 4869)

Node 0, zone DMA32
  managed: 253815 pages (전체 관리 페이지)
  free:    133994 pages (현재 사용 가능)
  
  사용 중: 253815 - 133994 = 119821 pages
         = 약 467MB 사용 중
         
  내역:
    nr_zone_active_anon:  22471  (활성 메모리)
    nr_zone_inactive_anon: 0
    nr_zone_active_file:  32489  (파일 캐시)
    nr_zone_inactive_file: 45782
    ... (합쳐서 119821)
```

## 메모리 상태 정리

| 항목 | 의미 | 상태 |
|------|------|------|
| **managed** | 커널이 관리 가능 | 포함된 범위 정의 |
| **free** | 현재 비어있음 | ✓ 할당 가능 |
| **used** (managed - free) | 현재 사용 중 | 이미 할당됨 |
| **nr_active_anon** | 활성 메모리 페이지 | used에 포함 |
| **nr_active_file** | 활성 캐시 페이지 | used에 포함 |

## 간단한 공식
```
managed = free + used
        = free + (nr_active_anon + nr_inactive_anon + 
                  nr_active_file + nr_inactive_file + 
                  nr_kernel_stack + ...)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;결론:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;nr_&lt;/b&gt; = &quot;개수&quot; (number of)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;managed&lt;/b&gt; = 커널이 관리하는 페이지 풀의 크기&lt;/li&gt;
&lt;li&gt;&lt;b&gt;free&lt;/b&gt; = managed 중 현재 비어있는 것&lt;/li&gt;
&lt;li&gt;&lt;b&gt;used&lt;/b&gt; = managed 중 현재 사용 중인 것&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-state=&quot;closed&quot;&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div data-state=&quot;closed&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div data-state=&quot;closed&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div data-state=&quot;closed&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div data-test-render-count=&quot;2&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-testid=&quot;user-message&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;present와 managed 차이&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span data-state=&quot;closed&quot;&gt;오후 4:29&lt;/span&gt;
&lt;div&gt;
&lt;div data-state=&quot;closed&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div data-state=&quot;closed&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div data-state=&quot;closed&quot;&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div data-test-render-count=&quot;1&quot;&gt;
&lt;div&gt;
&lt;div data-is-streaming=&quot;false&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h1&gt;present vs managed 차이&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;핵심&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;ini&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;present  = 물리적으로 실제 존재하는 페이지
managed  = 커널이 실제로 관리/할당할 수 있는 페이지&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;구체적 차이&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;yaml&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;physical memory (물리 메모리)
│
├─ present: 242688 pages (실제 존재)
│  │
│  ├─ reserved (예약됨 - 커널이 건드리지 않음)
│  │  ├─ BIOS 영역
│  │  ├─ 부트로더
│  │  └─ 펌웨어 (RPi4의 GPU 펌웨어)
│  │
│  └─ manageable (관리 가능)
│     └─ managed: 220735 pages &amp;larr; 커널이 할당/관리
│        ├─ free: 215866 (사용 가능)
│        └─ used: 4869 (사용 중)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;당신의 RPi4 데이터로 보기&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;Node 0, zone DMA
  present  242688    &amp;larr; 실제 존재하는 물리 페이지
  managed  220735    &amp;larr; 커널이 관리하는 페이지
  
  예약됨 = present - managed
        = 242688 - 220735
        = 21953 pages (약 85MB)
        
이 85MB는 GPU, 부트로더, BIOS 등이 사용

Node 0, zone DMA32
  present  262144    &amp;larr; 실제 존재
  managed  253815    &amp;larr; 커널이 관리
  
  예약됨 = 262144 - 253815
        = 8329 pages (약 32MB)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;왜 managed &amp;lt; present일까?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;RPi4 특성:&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;yaml&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;present = 242688 pages
  ├─ GPU 펌웨어 영역 (RPi4는 ARM CPU와 GPU 공유)
  ├─ 부트로더
  ├─ 디바이스 트리 (device tree)
  ├─ BIOS/UEFI 영역
  └─ managed: 220735 pages만 Linux가 관리&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;일반 PC vs RPi4:&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;properties&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;일반 PC:
  present &amp;asymp; managed (대부분 예약 영역 없음)
  
RPi4:
  present &amp;gt; managed (GPU가 메모리 독점, 공유 메모리 존재)
  present - managed = 약 10% (GPU 펌웨어용)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;메모리 계층 구조 (정확한 버전)&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;yaml&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;Physical Memory (물리적으로 존재)
│
├─ Node 0, zone DMA
│  │
│  ├─ present: 242688 pages
│  │  │
│  │  ├─ reserved (커널이 관리 안 함)
│  │  │  └─ 21953 pages (GPU, 펌웨어 등)
│  │  │
│  │  └─ managed: 220735 pages &amp;larr; 커널이 관리
│  │     ├─ free: 215866 pages (할당 가능)
│  │     └─ used: 4869 pages (사용 중)
│  │        ├─ nr_kernel_stack
│  │        ├─ nr_page_table_pages
│  │        └─ ...
│  │
│  └─ cma: 131072 pages (GPU용 연속 메모리, managed에 포함)
│     ├─ nr_free_cma: 126266 (사용 가능)
│     └─ used_cma: ~5000
│
└─ Node 0, zone DMA32
   ├─ present: 262144
   └─ managed: 253815
      ├─ free: 133994
      └─ used: 119821&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;spanned vs present vs managed&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;yaml&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;Node 0, zone DMA
  spanned: 262144   &amp;larr; 이 zone이 담당하는 주소 범위의 페이지 수
  present: 242688   &amp;larr; 그 중 실제 존재하는 페이지 수
  managed: 220735   &amp;larr; 그 중 커널이 관리하는 페이지 수
  
spanned &amp;gt; present (어떤 주소는 비어있을 수 있음)
present &amp;gt; managed (일부는 예약됨)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;공식&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;c&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;makefile&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;spanned   = zone의 주소 범위로 계산한 페이지 수
present   = spanned 중 실제 물리 메모리가 있는 페이지
managed   = present 중 커널이 할당 가능한 페이지
free      = managed 중 현재 비어있는 페이지

따라서:
spanned &amp;ge; present &amp;ge; managed &amp;ge; free&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;요약표&lt;/h2&gt;
&lt;div&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&gt;&lt;b&gt;spanned&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;이론적 범위&lt;/td&gt;
&lt;td&gt;262144 pages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;present&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;실제 존재&lt;/td&gt;
&lt;td&gt;242688 pages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;managed&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;커널 관리&lt;/td&gt;
&lt;td&gt;220735 pages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;free&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;현재 사용 가능&lt;/td&gt;
&lt;td&gt;215866 pages&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;결론:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;present&lt;/b&gt; = 물리적으로 &quot;실제 있는&quot; 페이지&lt;/li&gt;
&lt;li&gt;&lt;b&gt;managed&lt;/b&gt; = 물리적으로 있으면서 &quot;커널이 관리하는&quot; 페이지&lt;/li&gt;
&lt;li&gt;RPi4에서 present - managed &amp;asymp; GPU 펌웨어용 메모리&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>linux</category>
      <author>easy16</author>
      <guid isPermaLink="true">https://easy16.tistory.com/434</guid>
      <comments>https://easy16.tistory.com/434#entry434comment</comments>
      <pubDate>Sun, 28 Dec 2025 16:25:06 +0900</pubDate>
    </item>
    <item>
      <title>zone, free_area, list_head[MIGRATE_TYPES] 관련</title>
      <link>https://easy16.tistory.com/433</link>
      <description>&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;b&gt;Q.f&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;ree_area는 4K의 승수별로 존재, list_head는 type 별 리스트를 가진다고 이해하면 되나&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;div data-test-render-count=&quot;2&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-state=&quot;closed&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div data-test-render-count=&quot;2&quot;&gt;
&lt;div data-is-streaming=&quot;false&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정확합니다! 당신의 이해가 맞습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;정리&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;prolog&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;free_area[order]의 구조:

free_area[0]  (2^0 = 1 page = 4KB)
├─ free_list[MIGRATE_UNMOVABLE]  &amp;rarr; [page] &amp;rarr; [page] &amp;rarr; ...
├─ free_list[MIGRATE_MOVABLE]    &amp;rarr; [page] &amp;rarr; [page] &amp;rarr; ...
├─ free_list[MIGRATE_RECLAIMABLE]&amp;rarr; [page] &amp;rarr; [page] &amp;rarr; ...
├─ free_list[MIGRATE_HIGHATOMIC] &amp;rarr; [page] &amp;rarr; ...
└─ free_list[MIGRATE_CMA]        &amp;rarr; [page] &amp;rarr; ...

free_area[1]  (2^1 = 2 pages = 8KB)
├─ free_list[MIGRATE_UNMOVABLE]  &amp;rarr; [page] &amp;rarr; [page] &amp;rarr; ...
├─ free_list[MIGRATE_MOVABLE]    &amp;rarr; [page] &amp;rarr; [page] &amp;rarr; ...
├─ free_list[MIGRATE_RECLAIMABLE]&amp;rarr; ...
├─ free_list[MIGRATE_HIGHATOMIC] &amp;rarr; ...
└─ free_list[MIGRATE_CMA]        &amp;rarr; ...

free_area[2]  (2^2 = 4 pages = 16KB)
├─ free_list[...]
└─ ...

...

free_area[10] (2^10 = 1024 pages = 4MB)
├─ free_list[...]
└─ ...&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드로 보면&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;cpp&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;struct zone {
    struct free_area free_area[MAX_ORDER];  // MAX_ORDER = 11
};

struct free_area {
    struct list_head free_list[MIGRATE_TYPES];  // MIGRATE_TYPES = 5
    unsigned long nr_free;
};&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;예시: 8KB 메모리 블록 찾기&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;rust&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;// 8KB (2 pages) 크기의 MOVABLE 타입 메모리를 찾고 싶다면
struct list_head *target = &amp;amp;zone-&amp;gt;free_area[1].free_list[MIGRATE_MOVABLE];
//                                          &amp;uarr;                        &amp;uarr;
//                                     order=1 (8KB)        type별 리스트
//                                    (2^1 page blocks)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;할당/해제 관점&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;less&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;// 8KB 할당 요청이 오면
// &amp;rarr; order=1, migratetype=MIGRATE_MOVABLE인 경우
// &amp;rarr; zone-&amp;gt;free_area[1].free_list[MIGRATE_MOVABLE]에서 페이지 블록 추출

// 8KB 메모리 해제
// &amp;rarr; order=1, migratetype=MIGRATE_MOVABLE
// &amp;rarr; zone-&amp;gt;free_area[1].free_list[MIGRATE_MOVABLE]에 페이지 블록 추가
```

## 마이그레이션 타입 분리의 이점
```
같은 크기(order)여도 타입별로 분리:

free_area[1].free_list[MIGRATE_MOVABLE]    &amp;rarr; 이동 가능한 8KB 블록들
free_area[1].free_list[MIGRATE_UNMOVABLE] &amp;rarr; 이동 불가능한 8KB 블록들

&amp;rarr; 커널이 8KB 메모리를 할당할 때 UNMOVABLE 영역에서만 찾기
&amp;rarr; MOVABLE 영역을 보존 (메모리 압축/조각화 방지)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;당신의 이해가 정확합니다!&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;✅ 크기: 4KB의 승수별로 존재 (2^0, 2^1, ... 2^10)&lt;/li&gt;
&lt;li&gt;✅ 리스트: 각 크기별로 타입에 따른 5개의 리스트 보유&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-state=&quot;closed&quot;&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div data-state=&quot;closed&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div data-state=&quot;closed&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div data-state=&quot;closed&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div data-test-render-count=&quot;2&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-testid=&quot;user-message&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Q. 여기서 MIGRATE_TYPES는 zone의 종류와는다른거야?&lt;/b&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-test-render-count=&quot;1&quot;&gt;
&lt;div data-is-streaming=&quot;false&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네, &lt;b&gt;완전히 다른 개념&lt;/b&gt;입니다!&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;구분&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;MIGRATE_TYPES&lt;/b&gt; = 페이지의 &lt;b&gt;이동 가능성&lt;/b&gt; 속성&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;cpp&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;#define MIGRATE_UNMOVABLE       0  // 커널이 사용, 이동 불가
#define MIGRATE_MOVABLE         1  // 사용자 프로세스, 이동 가능
#define MIGRATE_RECLAIMABLE     2  // 캐시, 회수 가능
#define MIGRATE_HIGHATOMIC      3  // 원자적 할당 예약
#define MIGRATE_CMA             4  // Contiguous Memory Allocator&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Zone&lt;/b&gt; = 메모리의 &lt;b&gt;물리적 위치&lt;/b&gt; 기준&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;less&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;enum zone_type {
    ZONE_DMA,        // 0-16MB (DMA 가능)
    ZONE_DMA32,      // 0-4GB (32bit DMA)
    ZONE_NORMAL,     // 일반 메모리
    ZONE_HIGHMEM,    // 고위 메모리 (32bit)
    ZONE_MOVABLE,    // 이동 가능 영역
    // ...
};

struct zone {
    struct free_area free_area[MAX_ORDER];
    // ...
};
```

## 계층 구조
```
Node (NUMA)
  &amp;darr;
Zone (DMA, NORMAL, HIGHMEM, ...)
  &amp;darr;
free_area[0..10] (크기별: 4KB, 8KB, 16KB, ..., 4MB)
  &amp;darr;
free_list[MIGRATE_TYPES] (타입별: UNMOVABLE, MOVABLE, ...)
  &amp;darr;
[페이지] &amp;rarr; [페이지] &amp;rarr; [페이지] &amp;rarr; ...&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;구체적 예시&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;prolog&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;// ZONE_NORMAL에서 8KB 메모리 할당

struct zone *zone = &amp;amp;NODE_DATA(0)-&amp;gt;node_zones[ZONE_NORMAL];
//                                           &amp;uarr;
//                                     물리적 위치 (Zone)

struct free_area *area = &amp;amp;zone-&amp;gt;free_area[1];
//                                        &amp;uarr;
//                                    크기 (8KB = 2^1)

struct list_head *list = &amp;amp;area-&amp;gt;free_list[MIGRATE_MOVABLE];
//                                         &amp;uarr;
//                                 이동 가능성 (Type)

// 실제 페이지 추출
page = list_first_entry_or_null(list, struct page, lru);
```

## 메모리 레이아웃
```
ZONE_DMA (0-16MB)
├─ free_area[0]
│  ├─ free_list[MIGRATE_UNMOVABLE]
│  ├─ free_list[MIGRATE_MOVABLE]
│  └─ ...
├─ free_area[1]
│  ├─ free_list[MIGRATE_UNMOVABLE]
│  └─ ...
└─ ...

ZONE_NORMAL (16MB-4GB)
├─ free_area[0]
│  ├─ free_list[MIGRATE_UNMOVABLE]
│  ├─ free_list[MIGRATE_MOVABLE]
│  └─ ...
├─ free_area[1]
│  ├─ free_list[MIGRATE_UNMOVABLE]
│  └─ ...
└─ ...

ZONE_HIGHMEM (4GB 이상)
├─ free_area[0]
│  ├─ free_list[MIGRATE_UNMOVABLE]
│  └─ ...
└─ ...&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;커널 코드에서&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;rust&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;// mm/page_alloc.c
static struct page *
get_page_from_freelist(gfp_t gfp_mask, unsigned int order,
                       int alloc_flags, const struct alloc_context *ac)
{
    struct zoneref *z;
    struct zone *zone;
    struct page *page = NULL;
    
    // 1. Zone 순회 (DMA &amp;rarr; NORMAL &amp;rarr; ...)
    for_each_zone_zonelist_nodemask(zone, z, ac-&amp;gt;zonelist,
                                    ac-&amp;gt;highest_zoneidx, ac-&amp;gt;nodemask) {
        // 2. free_area[order] 선택
        // 3. free_list[migratetype] 선택
        // 4. 페이지 추출
    }
    
    return page;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;정리&lt;/h2&gt;
&lt;div&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&gt;&lt;b&gt;Zone&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;물리적 위치&lt;/td&gt;
&lt;td&gt;DMA, NORMAL, HIGHMEM, ...&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;free_area[order]&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;메모리 크기&lt;/td&gt;
&lt;td&gt;4KB, 8KB, 16KB, ..., 4MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;MIGRATE_TYPES&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;페이지 속성/이동성&lt;/td&gt;
&lt;td&gt;UNMOVABLE, MOVABLE, ...&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;MIGRATE_TYPES는 Zone과 무관하게&lt;/b&gt;, 각 Zone의 모든 free_area에서 &lt;b&gt;타입별로 페이지를 분류&lt;/b&gt;하는 것입니다!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>linux</category>
      <author>easy16</author>
      <guid isPermaLink="true">https://easy16.tistory.com/433</guid>
      <comments>https://easy16.tistory.com/433#entry433comment</comments>
      <pubDate>Sun, 28 Dec 2025 16:20:14 +0900</pubDate>
    </item>
    <item>
      <title>raspberry pi4 kernel dump test</title>
      <link>https://easy16.tistory.com/432</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;objdump&amp;nbsp;-x&amp;nbsp;vmlinux&amp;nbsp;|&amp;nbsp;grep&amp;nbsp;show_interrupts&amp;nbsp;-A&amp;nbsp;10&lt;/p&gt;
&lt;pre id=&quot;code_1766890031683&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ELF Header:
  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
  Class:                             ELF64
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              DYN (Shared object file)
  Machine:                           AArch64
  Version:                           0x1
  Entry point address:               0xffffffc080000000
  Start of program headers:          64 (bytes into file)
  Start of section headers:          35974344 (bytes into file)
  Flags:                             0x0
  Size of this header:               64 (bytes)
  Size of program headers:           56 (bytes)
  Number of program headers:         4
  Size of section headers:           64 (bytes)
  Number of section headers:         38
  Section header string table index: 37&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;readelf&amp;nbsp;-h&amp;nbsp;vmlinux &lt;/p&gt;
&lt;pre id=&quot;code_1766889994935&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ELF Header:
  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
  Class:                             ELF64
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              DYN (Shared object file)
  Machine:                           AArch64
  Version:                           0x1
  Entry point address:               0xffffffc080000000
  Start of program headers:          64 (bytes into file)
  Start of section headers:          35974344 (bytes into file)
  Flags:                             0x0
  Size of this header:               64 (bytes)
  Size of program headers:           56 (bytes)
  Number of program headers:         4
  Size of section headers:           64 (bytes)
  Number of section headers:         38
  Section header string table index: 37&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;#특정 심볼의 주소 찾기&lt;/b&gt;&lt;br /&gt;vi&amp;nbsp;System.map &lt;br /&gt;echo ffffffc0801319a8 //show_interrupts의 심볼 및 start/end address 검색&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;#특정함수의 어셈블리 보기&lt;/b&gt;&lt;br /&gt;aarch64-linux-gnu-objdump&amp;nbsp;--start-address=0xffffffc0801319a8&amp;nbsp;--stop-address=0xffffffc080131d38&amp;nbsp;-d&amp;nbsp;vmlinux&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1766889967812&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vmlinux:     file format elf64-littleaarch64


Disassembly of section .text:

ffffffc0801319a8 &amp;lt;show_interrupts&amp;gt;:
ffffffc0801319a8:       d503201f        nop
ffffffc0801319ac:       d503201f        nop
ffffffc0801319b0:       d503233f        paciasp
ffffffc0801319b4:       a9bb7bfd        stp     x29, x30, [sp, #-80]!
ffffffc0801319b8:       9000bba2        adrp    x2, ffffffc0818a5000 &amp;lt;_printk_rb_static_descs+0x17b10&amp;gt;
ffffffc0801319bc:       910003fd        mov     x29, sp
ffffffc0801319c0:       a9025bf5        stp     x21, x22, [sp, #32]
ffffffc0801319c4:       b9492844        ldr     w4, [x2, #2344]
ffffffc0801319c8:       f9400035        ldr     x21, [x1]
ffffffc0801319cc:       6b15009f        cmp     w4, w21
ffffffc0801319d0:       5400156b        b.lt    ffffffc080131c7c &amp;lt;show_interrupts+0x2d4&amp;gt;  // b.tstop
ffffffc0801319d4:       540015e0        b.eq    ffffffc080131c90 &amp;lt;show_interrupts+0x2e8&amp;gt;  // b.none
ffffffc0801319d8:       a90153f3        stp     x19, x20, [sp, #16]
ffffffc0801319dc:       aa0003f3        mov     x19, x0
ffffffc0801319e0:       35000615        cbnz    w21, ffffffc080131aa0 &amp;lt;show_interrupts+0xf8&amp;gt;
ffffffc0801319e4:       a90363f7        stp     x23, x24, [sp, #48]
ffffffc0801319e8:       52800082        mov     w2, #0x4                        // #4
ffffffc0801319ec:       52807d01        mov     w1, #0x3e8                      // #1000
ffffffc0801319f0:       710f9c9f        cmp     w4, #0x3e7
ffffffc0801319f4:       5400164d        b.le    ffffffc080131cbc &amp;lt;show_interrupts+0x314&amp;gt;
ffffffc0801319f8:       0b010821        add     w1, w1, w1, lsl #2
ffffffc0801319fc:       2a0203e3        mov     w3, w2&lt;/code&gt;&lt;/pre&gt;</description>
      <author>easy16</author>
      <guid isPermaLink="true">https://easy16.tistory.com/432</guid>
      <comments>https://easy16.tistory.com/432#entry432comment</comments>
      <pubDate>Sun, 28 Dec 2025 11:49:26 +0900</pubDate>
    </item>
    <item>
      <title>raspberry pi 4 커널 빌드 및 교체 시 주의 사항</title>
      <link>https://easy16.tistory.com/431</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;config 생성 및 커널 이미지 빌드는 아래 스크립트의 명령어 참조&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 OUTPUT를 O 옵션으로 지정하면, 커널 코드 내 변경 없이 깔끔하게 빌드할 수 있는 장점이 있음&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;윈도우 wsl에서 cross compile 환경으로 빌드를 하다보니, 가이드 대로 하는게 불가능함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;편의를 위해 먼저 rpi4의 root 패스워드를 지정하고 dtb* 및 Image 만 복사하면 될 줄 알았는데, 커널 부팅이 안된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다행이도 윈도우에서 kernel8.img를 간단히 복사 가능하므로 복구해주고..&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;결과물 중, vmlinux는 add2line이나 gdb 사용을 위한 이미지로 부팅이 불가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Image는 raw 형태로 대략 26M쯤 나간다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를&amp;nbsp; z 또는 lz 형태로 압축하면 8~9M로 줄고, 이게 기존 rpi4에서 배포된 이미지로 보임. (귀찮으니 확인은 생략)&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;&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;매우 귀찮지만, modules_install을 wsl내 임의의 경로에서 진행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타겟에서 lsblk을 실행하면, boot는 mmcblock1 root는 2에 있다는게 확인 가능하므로 가이드대로 적당히 마운트 후 복사하면 됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 tar로 묶어 타겟의 /lib/modules 경로에서 풀고 재부팅하면, 동작이 가능하다.&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;장난감 완성~&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;pre id=&quot;code_1766754159650&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#!/bin/bash
#
#
#KERNEL_TOP_PATH=&quot;$( cd &quot;$(dirname &quot;$0&quot;)&quot; ; pwd -P )&quot;
KERNEL_TOP_PATH=&quot;$( cd &quot;$(dirname &quot;$0&quot;)&quot; ; pwd -P )&quot;
#KERNEL_TOP_PATH=&quot;/root/workspace/project/rpi4/linux&quot;
OUTPUT=&quot;$KERNEL_TOP_PATH/out&quot;
BUILD_LOG=$KERNEL_TOP_PATH/rpi_build_log.txt
echo &quot;$OUTPUT&quot;

cd linux
#if build error happens
#make ARCH=arm64 mrproper -j10
KERNEL=kernel8
make O=$OUTPUT ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc) bcm2711_defconfig
#make O=$OUTPUT ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc) Image modules dtbs 2&amp;gt;&amp;amp;1 | tee $BUILD_LOG
#tar the output dir in /lib/modules/xxx and scp to target
make O=$OUTPUT ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc) INSTALL_MOD_PATH=../out/mnt/root modules_install&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.raspberrypi.com/documentation/computers/linux_kernel.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.raspberrypi.com/documentation/computers/linux_kernel.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1766754107127&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 - Raspberry Pi Documentation&quot; data-og-description=&quot;The official documentation for Raspberry Pi computers and microcontrollers&quot; data-og-host=&quot;www.raspberrypi.com&quot; data-og-source-url=&quot;https://www.raspberrypi.com/documentation/computers/linux_kernel.html&quot; data-og-url=&quot;https://www.raspberrypi.com/documentation/computers/linux_kernel.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Vm6Uy/hyZPKJLsge/Kjtb9ZIKusDzGhXd1rgmS1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://www.raspberrypi.com/documentation/computers/linux_kernel.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.raspberrypi.com/documentation/computers/linux_kernel.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Vm6Uy/hyZPKJLsge/Kjtb9ZIKusDzGhXd1rgmS1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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 - Raspberry Pi Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The official documentation for Raspberry Pi computers and microcontrollers&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.raspberrypi.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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>linux</category>
      <author>easy16</author>
      <guid isPermaLink="true">https://easy16.tistory.com/431</guid>
      <comments>https://easy16.tistory.com/431#entry431comment</comments>
      <pubDate>Fri, 26 Dec 2025 22:12:45 +0900</pubDate>
    </item>
    <item>
      <title>BFT 의견</title>
      <link>https://easy16.tistory.com/430</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Playstore link&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.baby.feeding.calculator&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://play.google.com/store/apps/details?id=com.baby.feeding.calculator&lt;/a&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;WEB link&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://play.google.com/apps/internaltest/4701564922685857537&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://play.google.com/apps/internaltest/4701564922685857537&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://play.google.com/apps/testing/com.baby.feeding.calculator&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://play.google.com/apps/testing/com.baby.feeding.calculator&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GoogleGroups&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://groups.google.com/g/bftbetatester1/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://groups.google.com/g/bftbetatester1/&lt;/a&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;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.baby.feeding.calculator&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://play.google.com/store/apps/details?id=com.baby.feeding.calculator&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://play.google.com/apps/testing/com.baby.feeding.calculator&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://play.google.com/apps/testing/com.baby.feeding.calculator&lt;/a&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;</description>
      <category>android</category>
      <author>easy16</author>
      <guid isPermaLink="true">https://easy16.tistory.com/430</guid>
      <comments>https://easy16.tistory.com/430#entry430comment</comments>
      <pubDate>Wed, 1 Oct 2025 17:31:46 +0900</pubDate>
    </item>
    <item>
      <title>Baby Feed Timer 개인정보 처리 방침</title>
      <link>https://easy16.tistory.com/429</link>
      <description>&lt;h1 style=&quot;color: #2196f3; text-align: center;&quot;&gt;개인정보처리방침&lt;/h1&gt;
&lt;div style=&quot;background-color: #e3f2fd; color: #000000; text-align: start;&quot;&gt;&lt;b&gt;아기 수유 타이머&lt;/b&gt;(이하 &quot;앱&quot;)는 사용자의 개인정보를 중요하게 생각하며, 개인정보보호법, 정보통신망 이용촉진 및 정보보호 등에 관한 법률 등 관련 법령을 준수하고 있습니다.&lt;/div&gt;
&lt;h2 style=&quot;color: #1976d2; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;1. 수집하는 개인정보의 항목&lt;/h2&gt;
&lt;h3 style=&quot;color: #424242; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;1.1 직접 수집 정보&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;본 앱은 다음과 같은 정보를 수집합니다:&lt;/p&gt;
&lt;p&gt;수집 항목수집 목적보관 기간&lt;/p&gt;
&lt;table style=&quot;color: #000000; text-align: start; 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;text-align: left;&quot;&gt;아기 이름&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;개인화된 수유 관리 서비스 제공&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;앱 삭제 시까지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;아기 출생일&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;연령별 맞춤 수유량 계산&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;앱 삭제 시까지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;아기 체중&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;체중별 적정 수유량 계산&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;앱 삭제 시까지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;수유 기록 (시간, 양)&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;수유 패턴 분석 및 다음 수유 시간 예측&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;앱 삭제 시까지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;언어 설정&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;다국어 서비스 제공&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;앱 삭제 시까지&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 style=&quot;color: #424242; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;1.2 자동 수집 정보&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;광고 식별자 (AdMob):&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;맞춤형 광고 제공을 위해 Google AdMob에서 수집&lt;/li&gt;
&lt;li&gt;&lt;b&gt;앱 사용 패턴:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;서비스 개선을 위한 익명화된 사용 통계&lt;/li&gt;
&lt;li&gt;&lt;b&gt;디바이스 정보:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;앱 최적화 및 오류 분석&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;background-color: #fff3e0; color: #000000; text-align: start;&quot;&gt;&lt;b&gt;중요:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;모든 개인정보는 사용자의 기기에만 저장되며, 외부 서버로 전송되지 않습니다.&lt;/div&gt;
&lt;h2 style=&quot;color: #1976d2; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;2. 개인정보 처리 목적&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;서비스 제공:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;아기의 수유량 계산, 수유 기록 관리, 수유 시간 알림&lt;/li&gt;
&lt;li&gt;&lt;b&gt;서비스 개선:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;사용자 경험 향상을 위한 기능 개발 및 최적화&lt;/li&gt;
&lt;li&gt;&lt;b&gt;광고 서비스:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Google AdMob을 통한 관련성 높은 광고 제공&lt;/li&gt;
&lt;li&gt;&lt;b&gt;알림 서비스:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;수유 시간 알림 및 중요 공지사항 전달&lt;/li&gt;
&lt;li&gt;&lt;b&gt;다국어 지원:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;사용자 언어 설정에 따른 맞춤형 인터페이스 제공&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 style=&quot;color: #1976d2; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;3. 개인정보 보유 및 이용기간&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;앱 내 저장 데이터:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;앱 삭제 시까지&lt;/li&gt;
&lt;li&gt;&lt;b&gt;광고 관련 데이터:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Google AdMob 정책에 따름 (일반적으로 13개월)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;크래시 로그:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;앱 안정성 향상을 위해 최대 1년간 보관 후 자동 삭제&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;color: #1976d2; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;4. 개인정보 제3자 제공&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;본 앱은 사용자의 개인정보를 제3자에게 제공하지 않습니다. 단, 다음의 경우는 예외입니다:&lt;/p&gt;
&lt;h3 style=&quot;color: #424242; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;4.1 Google AdMob&lt;/h3&gt;
&lt;p&gt;제공받는 자제공 목적제공 항목보관 기간&lt;/p&gt;
&lt;table style=&quot;color: #000000; text-align: start; 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;text-align: left;&quot;&gt;Google LLC&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;맞춤형 광고 제공&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;광고 식별자, 기기 정보, 앱 사용 통계&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;Google 광고 정책에 따름&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div style=&quot;background-color: #e3f2fd; color: #000000; text-align: start;&quot;&gt;&lt;b&gt;Google AdMob 관련 안내:&lt;/b&gt;&lt;br /&gt;&amp;bull; Google의 개인정보처리방침:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://policies.google.com/privacy&quot;&gt;https://policies.google.com/privacy&lt;/a&gt;&lt;br /&gt;&amp;bull; 광고 맞춤설정 관리:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://adssettings.google.com&quot;&gt;https://adssettings.google.com&lt;/a&gt;&lt;/div&gt;
&lt;h2 style=&quot;color: #1976d2; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;5. 개인정보 처리 위탁&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;본 앱은 더 나은 서비스 제공을 위해 다음과 같이 개인정보 처리를 위탁하고 있습니다:&lt;/p&gt;
&lt;p&gt;수탁업체위탁업무연락처&lt;/p&gt;
&lt;table style=&quot;color: #000000; text-align: start; 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;text-align: left;&quot;&gt;Google LLC&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;광고 서비스 제공&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;a href=&quot;https://support.google.com&quot;&gt;https://support.google.com&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 style=&quot;color: #1976d2; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;6. 사용자의 권리와 행사 방법&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;사용자는 다음과 같은 권리를 가집니다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;열람권:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;앱 내 설정에서 저장된 정보 확인 가능&lt;/li&gt;
&lt;li&gt;&lt;b&gt;정정&amp;middot;삭제권:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;앱 내에서 직접 수정 및 삭제 가능&lt;/li&gt;
&lt;li&gt;&lt;b&gt;처리정지권:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;앱 삭제를 통한 모든 데이터 처리 중단&lt;/li&gt;
&lt;li&gt;&lt;b&gt;광고 맞춤설정 해제:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;기기 설정 또는 Google 광고 설정에서 변경&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #424242; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;6.1 데이터 삭제 방법&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;개별 데이터:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;앱 내 각 화면에서 삭제 버튼 이용&lt;/li&gt;
&lt;li&gt;&lt;b&gt;전체 데이터:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;앱 삭제 또는 기기 설정에서 앱 데이터 삭제&lt;/li&gt;
&lt;li&gt;&lt;b&gt;광고 데이터:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Google 광고 설정에서 광고 맞춤설정 해제&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 style=&quot;color: #1976d2; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;7. 개인정보 보호를 위한 기술적/관리적 대책&lt;/h2&gt;
&lt;h3 style=&quot;color: #424242; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;7.1 기술적 대책&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로컬 데이터 암호화 저장&lt;/li&gt;
&lt;li&gt;앱 코드 난독화를 통한 역공학 방지&lt;/li&gt;
&lt;li&gt;최신 보안 프레임워크 적용&lt;/li&gt;
&lt;li&gt;정기적인 보안 업데이트&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #424242; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;7.2 관리적 대책&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개인정보 접근 권한 최소화&lt;/li&gt;
&lt;li&gt;개발자 보안 교육 실시&lt;/li&gt;
&lt;li&gt;개인정보 처리 현황 정기 점검&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;color: #1976d2; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;8. 사용 권한 안내&lt;/h2&gt;
&lt;p&gt;권한사용 목적필수/선택&lt;/p&gt;
&lt;table style=&quot;color: #000000; text-align: start; 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;text-align: left;&quot;&gt;알림 (POST_NOTIFICATIONS)&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;수유 시간 알림 제공&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;선택&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;정확한 알람 (SCHEDULE_EXACT_ALARM)&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;정확한 수유 시간 알림&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;선택&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;인터넷 (INTERNET)&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;광고 서비스 제공&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;필수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;네트워크 상태 (ACCESS_NETWORK_STATE)&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;광고 최적화&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;필수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;화면 켜짐 유지 (WAKE_LOCK)&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;알림 기능 안정성&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;필수&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 style=&quot;color: #1976d2; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;9. 아동의 개인정보 보호&lt;/h2&gt;
&lt;div style=&quot;background-color: #fff3e0; color: #000000; text-align: start;&quot;&gt;본 앱은 만 14세 미만 아동의 개인정보를 수집하지 않으며, 아기의 정보는 보호자가 입력하는 것으로 간주합니다. 만약 만 14세 미만 아동이 보호자 동의 없이 개인정보를 제공한 사실을 알게 될 경우, 즉시 해당 정보를 삭제하겠습니다.&lt;/div&gt;
&lt;h2 style=&quot;color: #1976d2; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;10. 개인정보 처리방침 변경&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;본 개인정보처리방침은 법령이나 서비스의 변경사항을 반영하기 위한 목적 등으로 수정될 수 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개인정보처리방침이 변경될 경우, 앱 업데이트를 통해 공지&lt;/li&gt;
&lt;li&gt;중요한 변경사항의 경우 앱 내 팝업으로 별도 안내&lt;/li&gt;
&lt;li&gt;변경된 개인정보처리방침은 게시된 날로부터 효력 발생&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;color: #1976d2; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;11. 개인정보 보호책임자 및 연락처&lt;/h2&gt;
&lt;div style=&quot;background-color: #f3e5f5; color: #000000; text-align: start;&quot;&gt;
&lt;h3 style=&quot;color: #424242;&quot; data-ke-size=&quot;size23&quot;&gt;개인정보 보호책임자&lt;/h3&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;b&gt;이메일:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;dontbeshy8888@gmail.com&lt;/p&gt;
&lt;h3 style=&quot;color: #424242;&quot; data-ke-size=&quot;size23&quot;&gt;개인정보 관련 문의&lt;/h3&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;/div&gt;
&lt;h2 style=&quot;color: #1976d2; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;12. 권익침해 구제방법&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;개인정보 침해신고센터, 개인정보 분쟁조정위원회, 대검찰청 사이버범죄수사단, 경찰청 사이버안전국 등에 신고하거나 상담을 받으실 수 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;개인정보 침해신고센터:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;privacy.go.kr (전화: 국번없이 182)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;개인정보 분쟁조정위원회:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;www.kopico.go.kr (전화: 1833-6972)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;대검찰청 사이버범죄수사단:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;www.spo.go.kr (전화: 02-3480-3571)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;경찰청 사이버안전국:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;cyberbureau.police.go.kr (전화: 국번없이 182)&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;background-color: #e3f2fd; color: #000000; text-align: start;&quot;&gt;
&lt;h3 style=&quot;color: #424242;&quot; data-ke-size=&quot;size23&quot;&gt;특별 안내사항&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;본 앱은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;오프라인 우선&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;방식으로 작동하며, 모든 핵심 데이터는 사용자 기기에만 저장됩니다.&lt;/li&gt;
&lt;li&gt;인터넷 연결은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;광고 표시 목적&lt;/b&gt;으로만 사용되며, 사용자 데이터 전송에는 사용되지 않습니다.&lt;/li&gt;
&lt;li&gt;앱 삭제 시 모든 데이터가 완전히 삭제되며, 복구할 수 없습니다.&lt;/li&gt;
&lt;li&gt;정기적인 보안 업데이트를 통해 사용자 데이터 보호에 최선을 다하고 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div style=&quot;color: #666666; text-align: right;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;시행일자:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;2024년 [월] [일]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;최종 수정일:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;2024년 [월] [일]&lt;/p&gt;
&lt;/div&gt;</description>
      <category>android</category>
      <author>easy16</author>
      <guid isPermaLink="true">https://easy16.tistory.com/429</guid>
      <comments>https://easy16.tistory.com/429#entry429comment</comments>
      <pubDate>Sun, 28 Sep 2025 15:55:24 +0900</pubDate>
    </item>
    <item>
      <title>android omx IL architecture</title>
      <link>https://easy16.tistory.com/428</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://source.android.com/docs/core/media&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://source.android.com/docs/core/media&lt;/a&gt;&lt;/p&gt;</description>
      <category>android</category>
      <author>easy16</author>
      <guid isPermaLink="true">https://easy16.tistory.com/428</guid>
      <comments>https://easy16.tistory.com/428#entry428comment</comments>
      <pubDate>Thu, 3 Nov 2022 22:03:47 +0900</pubDate>
    </item>
    <item>
      <title>gst와 omx IL의 관계</title>
      <link>https://easy16.tistory.com/427</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;gst-openmax &lt;br /&gt;openMAX&amp;nbsp;IL &lt;br /&gt;&lt;a href=&quot;https://freedesktop.org/wiki/GstOpenMAX/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://freedesktop.org/wiki/GstOpenMAX/&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;openMAX &lt;br /&gt;&lt;a href=&quot;https://www.khronos.org/api/openmax/il&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.khronos.org/api/openmax/il&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;gstreamer1 &lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://medium.com/may-i-lab/gstreamer-gstreamer-%EA%B8%B0%EC%B4%88-da5015f531fc&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://medium.com/may-i-lab/gstreamer-gstreamer-%EA%B8%B0%EC%B4%88-da5015f531fc&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;gstreamer2 &lt;br /&gt;&lt;a href=&quot;https://gstreamer.freedesktop.org/features/index.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://gstreamer.freedesktop.org/features/index.html&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;GStreamer&amp;nbsp;can&amp;nbsp;bridge&amp;nbsp;to&amp;nbsp;other&amp;nbsp;multimedia&amp;nbsp;frameworks&amp;nbsp;in&amp;nbsp;order&amp;nbsp;to&amp;nbsp;reuse&amp;nbsp;existing&amp;nbsp;components&amp;nbsp;(e.g.&amp;nbsp;codecs)&amp;nbsp;and&amp;nbsp;use&amp;nbsp;platform&amp;nbsp;input/output&amp;nbsp;mechanisms: &lt;br /&gt;&lt;br /&gt;Linux/Unix:&amp;nbsp;OpenMAX-IL&amp;nbsp;(via&amp;nbsp;gst-omx) &lt;br /&gt;Windows:&amp;nbsp;DirectShow &lt;br /&gt;Mac&amp;nbsp;OS&amp;nbsp;X:&amp;nbsp;QuickTime&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;br /&gt;GStreamer&amp;nbsp;+&amp;nbsp;OpenMAX-IL &lt;br /&gt;&lt;a href=&quot;https://www.khronos.org/files/openmax/whitepapers/OpenMAX_IL_with_GSstreamer.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.khronos.org/files/openmax/whitepapers/OpenMAX_IL_with_GSstreamer.pdf&lt;/a&gt;&lt;/p&gt;</description>
      <category>linux</category>
      <author>easy16</author>
      <guid isPermaLink="true">https://easy16.tistory.com/427</guid>
      <comments>https://easy16.tistory.com/427#entry427comment</comments>
      <pubDate>Thu, 3 Nov 2022 21:58:59 +0900</pubDate>
    </item>
  </channel>
</rss>