โ† Back

[์š”์•ฝ] ๐Ÿ–ฅ๏ธ์ž„๋ฒ ๋””๋“œ OS ํ”„๋กœ์ ํŠธ Ch.2

์ผ๋‹จ ์‹œ์ž‘ํ•˜๊ธฐ
์ธ๋„ค์ผ

์‹œ์ž‘ํ•˜๊ธฐ ์ „

์ฑ…์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์†Œ์Šค ์ฝ”๋“œ๋“ค์„ ํ•ด๋‹น ๋ ˆํฌ์ง€ํ† ๋ฆฌ์—์„œ ์‚ดํŽด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊นƒํ—ˆ๋ธŒ ๋ ˆํฌ์ง€ํ† ๋ฆฌ ๋งํฌ

3.1 ๋ฆฌ์…‹ ๋ฒกํ„ฐ

ARM ์ฝ”์–ด์— ์ „์›์ด ๋“ค์–ด๊ฐ€๋ฉด ๋ฆฌ์…‹ ๋ฒกํ„ฐ์— ์žˆ๋Š” ๋ช…๋ น์„ ๋จผ์ € ์‹คํ–‰์‹œํ‚ต๋‹ˆ๋‹ค.

๋ฆฌ์…‹ ๋ฒกํ„ฐ์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋Š” 0x00000000์ž…๋‹ˆ๋‹ค.

Entry.S ์†Œ์Šค ์ฝ”๋“œ

.text
    .code 32

    .global vector_start
    .global vector_end

    vector_start:
        MOV     R0, R1
    vector_end:
        .space 1024, 0
.end

.text ์„น์…˜์„ ์ •์˜ํ•œ๋‹ค .code 32๋Š” ํ•œ ๋ช…๋ น์–ด์˜ ํฌ๊ธฐ๊ฐ€ 32bits = 4Bytes์ž„์„ ์˜๋ฏธํ•œ๋‹ค. .global ์ง€์‹œ์–ด๋Š” C์˜ extern๊ณผ ๋™์ผํ•˜๋ฉฐ ์ „์—ญ๋ณ€์ˆ˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค. vector_start ๋ ˆ์ด๋ธ”์—์„œ๋Š” R1์˜ ๊ฐ’์„ R0๋กœ ์˜ฎ๊ธฐ๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. vector_end ๋ ˆ์ด๋ธ”์—์„œ๋Š” ํ˜„์žฌ ์œ„์น˜๋กœ๋ถ€ํ„ฐ 1,024bytes๋ฅผ 0์œผ๋กœ ์ฑ„์šฐ๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

Entry.S ํŒŒ์ผ์„ ์ปดํŒŒ์ผํ•˜๊ณ  ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๋คํ”„ํ•ด๋ดค์Šต๋‹ˆ๋‹ค.

arm-none-eabi-as -march=armv7-a -mcpu=cortex-a8 -o Entry.o ./Entry.S
arm-none-eabi-objcopy -O binary Entry.o Entry.bin

hexdump Entry.bin

0001 e1a0์ด ๋ณด์ž…๋‹ˆ๋‹ค.

์˜ˆ์ƒํ•œ ๋Œ€๋กœ ์ œ๋Œ€๋กœ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์ด ์ƒ์„ฑ๋์Šต๋‹ˆ๋‹ค.

3.2 ์‹คํ–‰ ํŒŒ์ผ ๋งŒ๋“ค๊ธฐ

QEMU๊ฐ€ ํŽŒ์›จ์–ด ํŒŒ์ผ์„ ์ฝ์–ด์„œ ๋ถ€ํŒ…ํ•˜๋ ค๋ฉด ์ง€์ •ํ•œ ํŽŒ์›จ์–ด ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์ด ELF ํŒŒ์ผ ํ˜•์‹์ด์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

arm-none-eabi-as๋ฅผ ์ด์šฉํ•˜์—ฌ ์ƒ์„ฑํ•œ Entry.o ํŒŒ์ผ์ด ELF ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.

ELF ํŒŒ์ผ์„ ๋งŒ๋“ค๋ ค๋ฉด ๋ง์ปค์˜ ๋„์›€์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋ง์ปค๊ฐ€ ๋™์ž‘ํ•˜๋ ค๋ฉด ๋ง์ปค ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

(๋ณดํ†ต ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ๋•Œ๋Š” ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์ง€๋งŒ, ํŽŒ์›จ์–ด๋ฅผ ๊ฐœ๋ฐœํ•  ๋•Œ๋Š” ๋‹ค๋ฅด๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.)

navilos.ld ์†Œ์Šค์ฝ”๋“œ

ENTRY(vector_start)
SECTIONS
{
    . = 0x0;


    .text :
    {
        *(vector_start)
        *(.text .rodata)
    }
    .data :
    {
        *(.data)
    }
    .bss :
    {
        *(.bss)
    }
} 

์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•˜์—ฌ ์‹คํ–‰ ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

arm-none-eabi-ld -n -T ./navilos.ld -o navilos.axf boot/Entry.o

arm-none-eabi-objdump ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ์ด ์–ด๋–ค ๋ช…๋ น์–ด๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ด๋ดค์Šต๋‹ˆ๋‹ค. ๋””์Šค์–ด์…ˆ๋ธ”ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์‚ดํŽด๋ณด๋ฉด mov r0, r1 ๋ช…๋ น์–ด๊ฐ€ ์ž˜ ๋ฐฐ์น˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

3.3 QEMU์—์„œ ์‹คํ–‰ํ•ด๋ณด๊ธฐ

์‹คํ–‰ ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด๋ดค์ง€๋งŒ ํ„ฐ๋ฏธ๋„์—์„œ ์‹คํ–‰์‹œํ‚ค๋ ค ์‹œ๋„ํ•ด๋ณด๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

ARM ๊ฐœ๋ฐœ ๋ณด๋“œ์— ๋‹ค์šด๋กœ๋“œ ์‹œ์ผœ์„œ ๋™์ž‘์„ ํ™•์ธํ•˜๊ฑฐ๋‚˜ QEMU๋กœ ์‹คํ–‰ํ•ด๋ณด๋ฉด ๋ฉ๋‹ˆ๋‹ค.

qemu-system-arm -M realview-pb-a8 -kernel navilos.axf -S gdb tcp::1234, ipv4

์‹ค์Šต์„ ํ•˜๋Š” ๋„์ค‘ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

arm-none-eabi-gdb ํŒŒ์ผ์ด ์–ด๋””์žˆ๋Š”์ง€ ์ฐพ์„ ์ˆ˜๊ฐ€ ์—†๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

askubuntu ์‚ฌ์ดํŠธ์—์„œ ์ €๋ž‘ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ๊ฒช์€ ์‚ฌ๋žŒ๋“ค์„ ์ฐพ์•„๋ดค๊ณ  ์‹ค์ œ๋กœ ์กด์žฌํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด์šฉ์„ ์‚ดํŽด๋ณด๋‹ˆ, gdb-multiarch ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•˜๋Š” ๋‹ต๋ณ€์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

sudo apt-get update
sudo apt-get install gdb-multiarch

์ž˜ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์„ ๋ณด์•„, ์‹ค์Šต์„ ์ง„ํ–‰ํ•˜๋Š” ๋ฐ ๋”ฑํžˆ ๋ฌธ์ œ๋Š” ์—†์–ด๋ณด์ž…๋‹ˆ๋‹ค.

gdb-multiarch

3.4 ๋นŒ๋“œ ์ž๋™ํ™”ํ•˜๊ธฐ

์ผ๋‹จ make์™€ ๊ด€๋ จ๋œ ํŒจํ‚ค์ง€๋“ค์„ ์„ค์น˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

sudo apt-get install make

Makefile์„ ๋งŒ๋“ค์–ด์„œ ๋นŒ๋“œ๋ฅผ ์ž๋™ํ™”ํ•ด๋ดค์Šต๋‹ˆ๋‹ค.

์ฑ…์—์„œ ๋‚˜์˜จ ์ฝ”๋“œ์™€ ์กฐ๊ธˆ ๋‹ฌ๋ผ์ง„ ์ ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

# ํƒ€๊ฒŸ ์•„ํ‚คํ…์ฒ˜์™€ CPU๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
ARCH = armv7-a
MCPU = cortex-a8

# GNU ARM Embedded Toolchain์˜ ๋„๊ตฌ๋“ค์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
CC = arm-none-eabi-gcc
AS = arm-none-eabi-as
LD = arm-none-eabi-ld
OC = arm-none-eabi-objcopy

# ๋ง์ปค ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
LINKER_SCRIPT = ./navilos.ld

# boot ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด์˜ ๋ชจ๋“  ์–ด์…ˆ๋ธ”๋ฆฌ ์†Œ์Šค ํŒŒ์ผ๋“ค์„ ์ฐพ์Šต๋‹ˆ๋‹ค.
ASM_SRCS = $(wildcard boot/\*.S)

# ์–ด์…ˆ๋ธ”๋ฆฌ ์†Œ์Šค ํŒŒ์ผ๋“ค์„ ๋Œ€์‘ํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ ๊ฒฝ๋กœ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
ASM_OBJS = $(patsubst boot/%.S, build/%.o, $(ASM_SRCS))

# ์ตœ์ข… ์ƒ์„ฑ๋  ์‹คํ–‰ ํŒŒ์ผ๊ณผ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
navilos = build/navilos.axf
navilos_bin = build/navilos.bin

# ์‹ค์ œ ํŒŒ์ผ๊ณผ ๊ด€๋ จ์ด ์—†๋Š” ํƒ€๊ฒŸ๋“ค์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
.PHONY: all clean run debug gdb

# ๊ธฐ๋ณธ ํƒ€๊ฒŸ์œผ๋กœ, navilos ์‹คํ–‰ ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
all: $(navilos)

# ๋นŒ๋“œ ๊ณผ์ •์—์„œ ์ƒ์„ฑ๋œ ํŒŒ์ผ๋“ค์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
clean:
    @rm -fr build

# QEMU ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋นŒ๋“œ๋œ ์ปค๋„์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
run: $(navilos)
    qemu-system-arm -M realview-pb-a8 -kernel $(navilos)

# ๋””๋ฒ„๊น… ๋ชจ๋“œ์—์„œ QEMU๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปค๋„์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
# GDB ์„œ๋ฒ„๊ฐ€ TCP ํฌํŠธ 1234๋ฅผ ํ†ตํ•ด ๋Œ€๊ธฐ ์ƒํƒœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
debug: $(navilos)
    qemu-system-arm -M realview-pb-a8 -kernel $(navilos) -S -gdb tcp::1234,ipv4

# GNU Debugger(GDB)๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
gdb:
    arm-none-eabi-gdb

# navilos ์‹คํ–‰ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋Š” ๊ทœ์น™์ž…๋‹ˆ๋‹ค.
# ์–ด์…ˆ๋ธ”๋ฆฌ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ๋“ค๊ณผ ๋ง์ปค ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งํฌํ•ฉ๋‹ˆ๋‹ค.
# ๊ทธ๋Ÿฐ ๋‹ค์Œ objcopy๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
$(navilos): $(ASM_OBJS) $(LINKER_SCRIPT)
    $(LD) -n -T $(LINKER_SCRIPT) -o $(navilos) $(ASM_OBJS)
    $(OC) -O binary $(navilos) $(navilos_bin)

# ๊ฐ ์–ด์…ˆ๋ธ”๋ฆฌ ์†Œ์Šค ํŒŒ์ผ์„ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ๋กœ ์ปดํŒŒ์ผํ•˜๋Š” ๊ทœ์น™์ž…๋‹ˆ๋‹ค.
# ํ•„์š”ํ•œ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•œ ํ›„ ์–ด์…ˆ๋ธ”๋ฆฌ ํŒŒ์ผ์„ ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค.
build/%.o: boot/%.S
    mkdir -p $(shell dirname $@)
    $(AS) -march=$(ARCH) -mcpu=$(MCPU) -g -o $@ $<

3.5 ํ•˜๋“œ์›จ์–ด ์ •๋ณด ์ฝ์–ด์˜ค๊ธฐ - ๋ฐ์ดํ„ฐ์‹œํŠธ๋ฅผ ์ฝ๋Š” ๋ฐฉ๋ฒ•

ํ•˜๋“œ์›จ์–ด์˜ ์ •๋ณด๋ฅผ ์ฝ์–ด์˜ค๋Š” ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์–ด๋ดค์Šต๋‹ˆ๋‹ค.

Entry.S ์†Œ์Šค ์ฝ”๋“œ

.text
    .code 32

    .global vector_start
    .global vector_end

    vector_start:
        LDR     R0, =0x10000000
        LDR     R1, [R0]
    vector_end:
        .space 1024, 0
.end

0x10000000์—๋Š” ์–ด๋–ค ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์žˆ์„๊นŒ ๊ถ๊ธˆํ•˜์—ฌ ์œ ์ ธ ๊ฐ€์ด๋“œ ๋ฌธ์„œ๋ฅผ ์ฐพ์•„๋ดค์Šต๋‹ˆ๋‹ค. SYS_ID ๋ ˆ์ง€์Šคํ„ฐ๋Š” 0x10000000 ์ฃผ์†Œ์— ์œ„์น˜ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์˜ค๋กœ์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ์ˆ˜๋งŒ ์žˆ๋‹ต๋‹ˆ๋‹ค. 32bit ํฌ๊ธฐ์˜ ๋ฐ์ดํ„ฐ๋ฅผ 5๊ฐœ์˜ ํ•ญ๋ชฉ์œผ๋กœ ์ชผ๊ฐœ๋†“์•˜๊ณ  ๊ฐ ํ•ญ๋ชฉ์ด ๊ฐ€์ง€๋Š” ๊ฐ’์— ๋”ฐ๋ผ ์˜๋ฏธ๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ํ•ด๋‹น ์ •๋ณด๋ฅผ ์–ด๋””์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„์ง€ ๊ฐ์ด ์žกํžˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์‹ค์Šต์ด ์„ฑ๊ณตํ–ˆ๋Š”์ง€ ํŒŒ์•…ํ•˜๋Š” ์šฉ๋„๋กœ๋Š” ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•˜์—ฌ ์‹ค์Šต์„ ์ง„ํ–‰ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

R0 ๋ ˆ์ง€์Šคํ„ฐ์— 0x10000000๊ฐ€ ๋“ค์–ด๊ฐ„ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ณ  ...

R1 ๋ ˆ์ง€์Šคํ„ฐ์— 0x1780500 ๊ฐ’์ด ์ €์žฅ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ์ฝ์–ด์˜จ ์ •๋ณด๋ฅผ ๋ถ„์„ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

SYS_ID_analysis.py ์†Œ์Šค ์ฝ”๋“œ

data = input("input data : ")
data = int(data,16)

fpga = (data & 0xFF)
arch = (data & 0xF00) >> 8
build = (data & 0xF000) >> 12
hbi = (data & 0xFFF0000) >> 16
rev = (data & 0xF0000000) >> 28

if rev == 0 :
    print("Board revision : Rev A")
elif rev == 1 :
    print("Board revision : Rev B")
elif rev == 2 :
    print("Board revision : Rev C")
else :
    print("rev : {0}".format(rev))

print("hbi board number : {0}".format(hex(hbi)))


if arch == 0x4 :
    print("Bus architecture : AHB")
elif arch == 0x5 :
    print("Bus architecture : AXI")
else : 
    print("Bus : {0}".format(hex(bus)))

์‹คํ–‰์‹œ์ผœ๋ณด๋ฉด ์ฑ…์—์„œ ๋‚˜์˜จ ์ •๋ณด์™€ ์ผ์น˜ํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3.6 ์š”์•ฝ

์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ํ•˜๋“œ์›จ์–ด์—์„œ ์‹คํ–‰ํ•ด๋ดค์Šต๋‹ˆ๋‹ค.

์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•ด๋ณด๊ธฐ ์œ„ํ•ด ํ•˜๋“œ์›จ์–ด์˜ ๋ ˆ์ง€์Šคํ„ฐ์— ์ ‘๊ทผํ•ด๋ดค์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด gdb๋„ ์‚ฌ์šฉํ•ด๋ดค์Šต๋‹ˆ๋‹ค.

3.7 ๋น„๊ณ 

gdb, Make, ๋ง์ปค ์Šคํฌ๋ฆฝํŠธ์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ์ •๋ฆฌ๊ฐ€ ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ผ๋‹จ ์‹ค์Šต์€ ๊ณ„์† ์ง„ํ–‰ํ•˜๋ฉด์„œ ์‹œ๊ฐ„์ ์œผ๋กœ ์—ฌ์œ ๊ฐ€ ์ƒ๊ธฐ๋ฉด ๋ธ”๋กœ๊ทธ์— ๋‚ด์šฉ์„ ์ •๋ฆฌํ•˜์—ฌ ํฌ์ŠคํŠธ๋กœ ์˜ฌ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

โ†

[์š”์•ฝ] ๐Ÿ–ฅ๏ธ์ž„๋ฒ ๋””๋“œ OS ํ”„๋กœ์ ํŠธ Ch.1

๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๊ตฌ์„ฑํ•˜๊ธฐ

โ†’

[์š”์•ฝ] ๐Ÿ–ฅ๏ธ์ž„๋ฒ ๋””๋“œ OS ํ”„๋กœ์ ํŠธ

[์šฉ์–ด ์ •๋ฆฌ]