공개SW 테크앤팁



임베디드월드



글: 정재준 (rgbi3307@nate.com) / 커널연구회(www.kernel.bz) 2011-09-08


[연재 차례]

1. 임베디드보드 구조
2. 부트로더 이해
3. 리눅스 커널포팅
4. 디바이스 드라이버 이해1
5. 디바이스 드라이버 이해2
6. 디바이스 드라이버 이해3
7. 리눅스 시스템 프로그래밍1
8. 리눅스 시스템 프로그래밍2
9. 리눅스 시스템 프로그래밍3
10.영어학습기 구현1
11.영어학습기 구현2



임베디드보드 구조 요약

리눅스 임베디드보드에서 영어학습기 구현을 위한 12개의 연재 중에서 첫 번째인 임베디드보드 구조에 대해서 이해해 보도록 하자. 먼저, 컴퓨터의 발전과 활용분야에서 컴퓨팅의 현 위치를 알아보고, 프로세서와 메모리 및 주변장치들을 하나의 보드에 통합한 임베디드보드 구조를 이해한다. CISC와 RISC의 개념에 대해서 설명하고, 이것의 장단점에 대해서 기술한다. 특히, 임베디드보드에서 RISC를 채택한 MIPS 구조의 특징에 대해 기술하고, 필자가 MIPS 구조를 지향하고 있는 이유에 대해서 설명한다. 끝으로, MIPS 임베디드보드에서 리눅스 개발환경 설정에 대해 소개하고, 다음 연재에서는 이것을 바탕으로 부트로더를 이해하고, 프로그래밍 실습한 소스 코드 내용을 설명한다.


컴퓨터의 발전과 활용분야

컴퓨터는 20세기 초(1920~) 트랜지스터가 발명되면서 시작되었다. 이때를 컴퓨터의 생년으로 본다면, 컴퓨터의 나이는 80살 정도 되었다. 컴퓨터의 마이크로프로세서(CPU)와 운영체제(OS) 연구는 1970년도부터 활성화되면서 대중화되었는데, 이 때를 기준으로 본다면 40살 정도 된 셈이다. 18세기 유럽에서 산업혁명으로 사회생활에 많은 변화가 생겼듯이, 20세기부터는 컴퓨터로 인해서 우리의 생활이 많이 변하고 있다. 그림 1은 컴퓨터를 서버, 데스크톱, 임베디드와 같이 세 가지로 분류했을 때, 1998년도에서 2002년도까지 이것의 판매 수(프로세서 수, 단위, 백만)를 통계로 보여주는 것이다.


그림 1. 프로세서 판매대수, 출처(참고문헌[1])
그림 1을 확인해 보면, 년도가 증가할수록 임베디드 컴퓨터 수가 점점 증가하고 있음을 알 수 있다. 오늘날 임베디드 컴퓨터는 다양한 분야에서 활용되고 있다. 예를 들면, 자동차의 내비게이션에 임베디드를 장착하여 운전자를 돕고, 휴대폰에 장착되어 원격지에 있는 사람과 대화를 나눌 수 있도록 하며, 돌고래의 몸에 임베디드를 장착하여 바다 속 데이터를 수집하고 있다. 또한 인공위성에 장착하여 우주정보를 수집하고, 정글 속에 있는 수십 미터 나무 꼭대기에 장착하여 기상정보를 수집하고 있으며, 화재를 진압하는 소방수의 몸에도 장착하고 있다. 이처럼 임베디드 컴퓨터는 우리의 일상생활 구석구석에서 많은 도움을 주고 있다.

필자는 그동안, 언어학습(영어)을 임베디드 컴퓨터에서 효율적으로 할 수 있도록 틈틈이 연구해 왔으며, 그 결과물을 독자 여러분들과 같이 나누고자 한다. 관련 내용을 앞으로 12회에 걸쳐서 연재할 계획이다.


임베디드보드 이해

임베디드보드는 컴퓨터의 중앙처리장치(CPU)인 마이크로프로세서와 밀접한 관계가 있다. 그러므로 마이크로프로세서의 발전 역사를 보면 임베디드보드를 쉽게 이해할 수 있다.

최초의 마이크로프로세서는 1970년도 초반에 전자계산기로 사용하기 위해 출현했으며, 4비트 단위로 BCD(Binary-Coded Decimal) 연산을 수행하도록 설계했다. 인텔의 4004가 1971년 11월 최초의 마이크로프로세서로 알려졌다. 또한, 인텔은 1972년에 최초의 8비트 마이크로프로세서인 8008을 출시하고, 이후 인텔의 8080, 지로그(Zilog)의 Z80, 모토로라(Motorola)의 6800, 6502 등이 개발되고, 1980년에 Z80과 6502가 8비트 시장에서 가장 대중적으로 알려지면서 서로 경쟁했다. 그림 2는 필자가 학창시절 용산전자상가에서 구입한 Z80 마이크로프로세서와 관련 부품을 직접 납땜으로 조립하여 MPU(Microprocessor Unit)를 제작한 것이다.


그림 2. Z80을 사용하여 조립한 MPU 보드

8비트 마이크로프로세서 시장에서 밀려난 인텔은 1985년에 8080을 개선하여 16비트 마이크로프로세서인 8086을 개발하고, 8088, 80186, 80286을 계속해서 출시하면서, 32비트 마이크로프로세서인 80386까지 개발하게 된다. 이것들은 인텔의 x86계열로 대중들에게 널리 알려지면서 현대의 PC시장을 형성했다.

그러나 인텔의 x86계열은 8비트, 16비트, 32비트 명령집합(Instruction Set)을 모두 지원하다 보니 CISC(Complex Instruction Set Computer)가 되었고, 마이크로프로세서 설계가 점점 복잡해지고 단일 명령어를 처리하기 위한 사이클이 증가하게 되었다. 이러한 단점을 보안하여 설계한 마이크로프로세서가 RISC(Reduced Instruction Set Computer)이며, 이것의 종류로는 Alpha, ARC, ARM, AVR, MIPS, PA-RISC, PIC, Power Architecture(PowerPC), SuperH, SPARC 등이 있다.


그림 3. RISC를 채택한 임베디드보드 블록도, 출처(참고문헌[2])
반면에, CISC의 종류로는 System/360, PDP-11, VAX, 68000, x86 등이 있다. 오늘날, 여러 제조사들이 RISC 설계기술을 활용하여 소형화, 저비용, 저전력, 고효율의 마이크로프로세서들을 생산하고 있으며, 임베디드보드는 이러한 RISC 프로세서와 주변장치들을 하나의 보드로 소형화한 것이다. 그림 3은 RISC를 사용한 임베디드보드의 구조도이다.

임베디드 분야에서 RISC를 채택하여 대중적으로 많이 사용되는 것으로 ARM과 MIPS가 있다.
ARM(Advanced RISC Machine, Acorn RISC Machine)은 1983년 Acorn Computers Ltd.에서 소형의 RSIC CPU 개발을 위한 프로젝트에서 시작되었다. ARM 설계의 핵심은 입/출력(interrupt) 제어 시 대기시간을 최소화하는 것이었다. 1985년 ARM1과 이듬해 ARM2 발표를 통해 실제 시스템의 면모를 갖추게 되고, 오늘날 PDA(Personal Digital Assistant) 및 휴대폰 시장에서 ARM을 많이 사용하고 있다.

MIPS(Microprocessor without Interlocked Pipeline Stages)는 RISC 프로세서를 기반으로 하여 스탠포드대학교의 John L. Hennessy에 의해서 발표되었다. 1984년에 Hennessy는 MIPS 컴퓨터 시스템을 결성하여 R2000이라는 첫 번째 제품을 개발하고, 1988년에는 좀 더 향상된 R3000을 발표한다. R2000과 R3000은 둘 다 32비트로 디자인되었으며, 이후에는 64비트 CPU인 R4000을 내놓는다. 현재, MIPS 컴퓨터 시스템은 가장 큰 고객이었던 SGI(Silicon Graphics)에 의해 인수되어 MIPS 테크놀로지로 사명이 변경되었다.


MIPS 구조의 특징

MIPS는 1970년대 후반에 개발된 RISC(Reduced Instruction Set Computer) 프로세서를 기반으로 하여 명령어는 줄이고 레지스터들을 더 많이 사용하여, load/store에 의한 메모리 접근을 줄여서 CISC(Complex Instruction Set Computer)에 비해서 빠르게 동작한다. MIPS는 파이프라인(Pipeline)을 사용하여 RISC를 개선했으며, 파이프라인은 하나의 명령이 수행되는 동안, load/store를 연이어서 수행하므로 프로세서의 성능을 높여준다.

MIPS 구조에서 파이프라인을 이해하는 것이 중요한데, 이 개념은 우리의 일상생활에서도 쉽게 찾아볼 수 있다. 예를 들면, 3명의 학생들이 생활하는 기숙사가 있는데, 이곳에 세탁기, 탈수기, 다리미, 옷장이 하나만 있다고 하자. 학생들의 이름(성씨)은 각각 ‘김’, ‘이’, ‘정’이라고 한다. 이들이 일요일 아침 9시부터 기숙사에서 빨래를 하기 시작했는데, 시간대별로 빨래 도구들을 사용하는 방식을 그림 4처럼 표현할 수 있다.


그림 4. 파이프라인(Pipeline) 개념

그림 4에서 ‘김’, ‘이’, ‘정’ 학생들이 빨래하는 방식을 A와 B로 구분하여 비교해 보자. A방식은 ‘김’학생이 세탁기-탈수기-다리미-옷장을 순서대로 모두 사용한 후에, ‘이’학생이 사용하고, 그런 다음, ‘정’학생이 사용하는 방식이다. ‘김’학생은 9시에 빨래를 시작해서 11시에 마치고, ‘이’학생은 11시에 시작해서 13시에 마치고, ‘정’학생은 13시에 시작해서 15시에 빨래를 마친다. 3명의 학생들이 기숙사에서 빨래를 시작해서 마치기까지 6시간이 소요되는 셈이다. 그러나 B방식은 ‘김’학생이 세탁기를 사용한 후 바로 ‘이’학생이 사용하고, ‘이’학생이 세탁기 사용을 완료하면 ‘정’학생이 바로 세탁기를 사용한다. 이처럼 빨래 도구들을 3명의 학생들이 연이어 사용하면 빨래를 서로 겹쳐서 진행할 수 있으므로 작업 시간이 많이 단축된다. 즉, B방식은 3명의 학생들이 기숙사에서 빨래를 9시에 시작해 12시에 마치므로, A작업에 비해서 3시간의 시간이 단축되어 50%의 절감 효과가 발생한다. 학생들의 수가 많으면 많을수록 절감 효과는 증가할 것이다.

파이프라인은 위의 예제에서 B방식으로 작업되는 개념이다. 즉, 기숙사를 프로세서(CPU)로 보고, 학생들을 명령(instruction)들로, 빨래 도구들을 프로세서안의 장치들(Decoder, ALU, Load/Store)로 치환해 보면, 파이프라인을 쉽게 이해할 수 있다. MIPS의 기본 개념은 명령 파이프라인을 사용하여 수행효율을 향상시키는 것이다. 파이프라인에 대한 기초 기법은 MIPS 이전에도 잘 알려져 있었지만, 이것의 잠재력을 충분히 개발하지 못하고 있었다.

CPU는 명령어 해석기, 산술 및 논리 연산기(ALU), load/store(메모리 접근제어) 장치 등으로 구성되어 있다. 과거의 최적화되지 않은 설계에서는 프로그램 안의 명령이 실행될 때, 이전의 명령이 모두 완료가 된 후에 그다음 명령이 순차적으로 진행되는 방식이다. 파이프라인 구조에서는 명령들을 서로 겹쳐서 실행할 수 있다. 예를 들면, 연산 명령이 실 수형 산술 장치로 진입되는 것과 동시에, load/store 장치는 다음 명령을 가져올 수 있는 구조이다. 즉, 산술연산 명령과 데이터 이동 명령을 동시에 겹쳐서 수행할 수 있다.


그림 5. EZ-AU1200 임베디드보드 사양, 출처(참고문헌[6])

파이프라인에서 하나의 중요한 장벽은 나눗셈처럼 시간이 좀 더 길게 소요되는 명령들인데, CPU 입장에서는 다음 명령이 파이프라인으로 전달되기까지 기다려야 한다. 이 문제의 해결책 중 하나는 내부 잠금(interlock)을 사용하여 바쁨을 나타내는 스테이지(stage)를 허용하는 것이고, 이때 다른 스테이지들의 업스트림(stages upstream)은 멈춰진다. Hennessy 교수팀은 이러한 내부 잠금을 중요한 수행효율 장벽으로 봤다. 왜냐하면, 내부 잠금들은 CPU 내의 모든 모듈들과 소통해야 하기 때문에 시간이 소요되고, 클록 속도를 제한하는 것으로 나타났기 때문이다. MIPS 설계의 주요 관점은 하나의 사이클(cycle)로 모든 명령들의 하위 단계(캐시 접근도 여기에 포함)를 최적화 하는 것이었고, 이렇게 하여, 내부 잠금(interlock) 요인들을 모두 제거하여 단일 사이클로 명령들이 수행되는 능력을 발휘하게 된다.

MIPS 설계와 경쟁하는 Berkeley RISC 사이의 차이점은 서브루틴 호출을 제어하는 관점이다. RISC는 이러한 임무수행 효율을 향상시키고자 레지스터 윈도우(register windows)라는 기술을 사용했으나, 멀티레벨(multi-level) 호출들의 최대 깊이에 제한을 받았다. 각각의 서브루틴 호출은 자기만의 레지스터 집합이 필요했으며, CPU에 더 많은 부담이 되었고, 설계가 점점 복잡해졌다. Hennessy 교수는 단순히 레지스터의 수를 증가시키거나 하드웨어를 재구성하지 않고도 컴파일러가 여분의 레지스터를 찾을 수 있다고 판단했으며, 이것으로 수행효율이 향상되었다.

무엇보다, MIPS의 깔끔한 명령 설계기법으로 인해 학계에서 컴퓨터구조 강좌로 많이 이용하고 있으며, 필자 또한 MIPS 구조를 선호하고 있다. 필자는 현재, MIPS 구조를 채택한 RMI사의 Au1200을 사용한 ㈜에프에이리눅스 (http://www.falinux.com )의 임베디드보드(EZ-AU1200)를 가지고 실습하고 있다. EZ-AU1200 임베디드보드 구입 및 관련기술은 참고문헌[6]에서 많은 정보를 공개하고 있으니 참조하기 바란다.


그림 6. RMI Au1200 계열의 임베디드보드 메모리 연결도, 출처(참고문헌[7])

그림 6은 RMI사의 웹사이트에서 User’s Guide로 공개하고 있는 Au1200 프로세서와 메모리 연결 블록도이며, CPU, RAM(DDR2), ROM(Flash)간의 연결 구조를 확인해 볼 수 있다. JTAG(Joint Test Action Group)는 보드의 회로를 테스트 및 디버깅하기 위한 것이며, EJTAG는 MIPS 임베디드보드에서 사용하는 인터페이스 규격이다. JTAG 인터페이스는 TDI(데이터 입력), TDO(데이터 출력), TCK(클럭), TMS(모드), TRST(리셋)와 같은 신호연결 핀을 가지고 있다. JTAG 라인을 통해 칩 내부를 조사(Capture 기능) 및 제어(INTEST 기능)할 수 있다. 데이터 라인은 한 개만이 유효하기 때문에 프로토콜은 시리얼 방식을 사용한다. 클록 입력은 TCK 핀으로, 설정은 TMS 핀을 사용하며, 동작 주파수는 10-100MHz (10-100ns/bit)가 일반적으로 사용된다. 그 밖에도 EXTEST 기능을 이용하여 임베디드 시스템의 다른 칩을 제어할 수도 있다. 특히, 임베디드 시스템의 ROM(NOR Flash), NAND Flash 등의 내용을 기록하거나 읽어 낼 수 있다. 즉, 아무런 코드가 없는 임베디드 시스템에 부트로더를 업로드하여 부팅 가능하게 만들 수 있다. MIPS 임베디드보드(EZ-AU1200)의 EJTAG 연결 및 자세한 사용법은 참고문헌[6]에서 확인할 수 있다.


그림 7. EZ-AU1200 임베디드보드 입출력 사양, 출처(참고문헌[6])

그림 7은 ㈜에프에이리눅스 EZ-AU1200 보드의 입출력(I/O) 사양들을 표로 나타낸 것이다. 출력 장치로는 TFT-LCD을 사용하고, 입력 장치로는 TOUCH 인터페이스를 사용하고 있음을 확인할 수 있다. 특히, 리눅스 호스트 PC와 임베디드보드 간에 UART(RS232 직렬통신) 및 이더넷 연결을 통하여 개발환경을 구축할 수 있으므로, 참고문헌[6]에서 상세한 정보를 참조하기 바란다.


그림 8. RMI Au1200 계열의 임베디드보드 입출력(I/O) 연결도, 출처(참고문헌[7])

그림 8은 RMI사의 웹사이트에서 User’s Guide로 공개하고 있는 입출력(I/O) 연결 블록도이며, 프로세서와 주변장치간의 연결 구조를 확인해 볼 수 있다.


MIPS 임베디드보드에 리눅스 개발환경 설정

임베디드보드와 터미널 PC와의 최초 연결은 임베디드보드의 EJTAG 커넥터와 터미널 PC의 Flash ROM Writer 프로그램에 의해 이루어진다(참고로, 필자는 터미널 PC로 윈도우 XP를 사용하고 있다). 즉, 부트로더를 터미널 PC에서 EJTAG 커넥터로 연결된 임베디드보드의 Flash 메모리로 전송한다. 이때 터미널 PC에서 사용하는 프로그램이 아래의 Flash ROM Writer이며, 이것은 코드가 공개되어 있고, 참고문헌[6]에서도 구할 수 있다. Au1200 임베디드보드의 부트로더에 대해서는 다음 연재에서 자세히 설명한다.


그림 9. Flash ROM Writer 프로그램, 출처(참고문헌[6])

다음으로, 터미널 PC와 임베디드보드 간에 UART(RS232) 직렬연결을 통하여 통신 환경을 설정할 수 있다. UART (RS232) 직렬통신은 터미널 PC와 임베디드보드 간에 핸드쉐이킹 방식으로 통신하며, 임베디드보드의 부트로더에 있는 통신모듈과 터미널 PC에 있는 통신 프로그램이 상호 연결되는 방식이다. 그림 10은 이들의 연결방식을 보여 주고 있다.

필자는 그림 10과 같이, 터미널 PC의 RS232 직렬통신 프로그램으로 윈도우XP에 내장되어 있는 하이퍼터미널 프로그램을 활용하고 있다.


그림 10. 임베디드보드의 리눅스 개발환경, 출처(참고문헌[2])

위의 환경까지 설정하면, 임베디드보드와 터미널 PC간에 직렬(RS232) 연결되고, 임베디드보드의 출력 메시지를 터미널 PC에서 확인할 수 있다. 그러나 리눅스 환경에서 다양한 개발을 하려면 임베디드보드에 리눅스 커널을 포팅하고, 개발용 호스트 PC(리눅스 서버)에 리눅스를 설치한 후, 상호간에 이더넷 연결을 하여 NFS(Network File System)을 설정해야 한다. 즉, 리눅스가 설치된 개발용 호스트 PC(리눅스 서버)가 NFS 서버역할을 하고, 임베디드보드가 NFS 클라이언트 역할을 하여 상호의 파일 시스템이 공유가 된다. 이렇게 되면, 개발용 호스트 PC(리눅스 서버)에서 개발한 내용을 임베디드보드에서 바로 실행한 후 결과를 확인할 수 있다. 그리고 개발용 호스트 PC(리눅스 서버)쪽에서 개발한 소스코드를 임베디드보드에서 실행 가능하도록 바이너리 코드를 생산하는 크로스-컴파일러(mipsel-gcc)를 설치한다. 위의 내용들은 참고문헌[6]에 모두 공개되어 있으니 참고하기 바란다.


맺음말

필자는 컴퓨터의 발전 역사를 통하여 임베디드보드 구조를 이해하고자 했다. 임베디드보드는 RISC 설계기술을 활용하여 프로세서와 메모리 및 주변장치 연결을 하나의 보드에서 가능하도록 했다. 특히, MIPS(Microprocessor without Interlocked Pipeline Stages)는 파이프라인을 사용하여 RISC를 개선했으며, 파이프라인은 하나의 명령이 수행되는 동안 load/store를 동시에 겹쳐서 수행하므로 프로세서의 성능을 높여준다. 또한, 내부적으로 잠겨지는(Interlocked) 파이프라인 스테이지(Stage)를 모두 제거하여, 단일 사이클로 명령들이 수행되는 장점을 가졌다.
필자는 MIPS 기술로 개발된 RMI사의 Au1200 프로세서를 탑재한 ㈜에프에이리눅스의 임베디드보드(EZ-AU1200)를 가지고 영어학습기를 구현하였다. EZ-AU1200 보드를 통한 개발환경 설정은 개념적인 부분만 언급했으므로, 이것을 처음으로 접하는 독자분들은 참고문헌[6]에서 개발환경 설정에 관한 자세한 정보를 공개하고 있으니 확인하기 바란다.
다음 연재에는 임베디드보드의 부트로더에 대해서 기술할 예정이니, 독자 여러분들의 꾸준한 관심을 바란다.


참고 문헌
[1] Computer Organization and Design (c)2007
    By David A. Patterson, John L. Hennessy
[2] Embedded Linux Primer (c)2006
    By Christopher Hallinan
[3] Essential Linux Device Drivers (c)2008
    By Sreekrishnan Venkateswaran
[4] LINUX System Programming (c)2007
    By Robert Love
[5] DATA STRUCTURES (c)2005
    By Richard F. Gilberg, Behrouz A. Forouzan
[6] (주)에프에이리눅스 포럼
    http://forum.falinux.com/zloxe/
[7] RMI사의 Au1200 User’s Guide
    http://www.rmicorp.com



리눅스 임베디드보드 구조 이해를 바탕으로 개발환경을 구축하고, 디바이스 드라이버 작성 및 리눅스 시스템 프로그래밍 방법을 익혀서 리눅스 임베디드보드에서 영어학습기를 구현해 보도록 하자. 필자가 관련기술들을 체계적으로 학습하고 실습한 내용으로 임베디드보드에 영어학습기를 구현한 사례를 독자 여러분들과 공유하고자 한다. 내용을 되도록이면 정확하게 전달하고자 노력했으며, 독자 여러분들의 많은 관심과 격려 있기를 바란다. 필자의 작은 노력이 관련기술 분야에서 한줌의 민들레 꽃씨가 되었으면 한다.


/필/자/소/개/

필자

정재준

학창시절 마이크로마우스를 만들었고, 10년 동안 쌓아온 IT관련 개발 경험을 바탕으로 “오라클실무활용SQL튜닝(혜지원)”이라는 책을 집필했다. 서울대병원 전산실에서 데이터베이스 관련 일을 하면서, 학창시절부터 꾸준히 해온 리눅스 연구를 계속하고 있다. 특히, 컴퓨터구조 및 자료구조 효율성 연구를 통한 기술서적 집필에 노력하고 있다. 또한, 온라인상에서 커널연구회(http://www.kernel.kr) 웹사이트를 운영하며 관련기술들을 공유하고 있다.



※ 본 내용은 (주)테크월드(http://www.embeddedworld.co.kr)의 저작권 동의에 의해 공유되고 있습니다.
    Copyright ⓒ Techworld, Inc. 무단전재 및 재배포 금지

조회 수 :
10195
등록일 :
2012.08.23
16:38:31 (*.162.249.76)
List of Articles
번호 제목 글쓴이 조회 수sort 추천 수 날짜 최근 수정일
447 솔루션 개발지원(PMS)완료보고서 file 20133   2011-03-17 2012-06-01 09:30
 
446 Mobile [안드로이드] (9)안드로이드 Camera [2] 17093   2013-01-04 2013-12-24 10:53
 
445 자바를 이용한 ActiveX 대체방안 15307   2011-03-18 2012-06-01 09:30
 
444 솔루션발굴(REXPERT) file 14777   2011-05-02 2012-06-01 09:30
 
443 Cloud Computing [클라우드] 클라우드 구성을 위한 레이아웃 및 오픈소스 14609   2013-04-26 2013-12-30 13:15
 
442 JAVA1.5와 JAVA1.6의 차이점(I) file 14375   2011-03-17 2013-12-30 13:26
 
441 Mobile [안드로이드] (8)Linux Sound Device와 안드로이드 사운드 시스템 14210   2012-12-07 2014-01-14 16:24
 
440 솔루션발굴(NEC FT 서버) file 14201   2011-03-02 2012-06-01 09:30
 
439 솔루션 개발지원(PMS) file 13456   2011-03-04 2011-03-04 15:35
 
438 GPLv3 라이센스 검토 [1] file 13445   2011-04-22 2011-12-10 14:08
 


사이트하단 로고, 하단메뉴, 트위터 바로가기

퀵메뉴모음
퀵메뉴열기
퀵메뉴닫기