커널연구회 교육원 개설을 준비하며...

rgbi3307의 이미지

안녕하세요? OS&DB 커널연구회(www.kernel.bz)를 운영하고 있는 정재준(rgbi3307(at)nate.com)이라 합니다.
먼저, 그동안 커널연구회에 관심을 가져 주시고 공부모임에 참여해 주신 많은 분들께 감사의 마음을 전합니다.
2008년 12월 커널연구회 웹사이트를 개설한 이후 3여년의 시간이 흘렀습니다.
이제는 커널연구회의 새로운 도약을 준비하기 위해서 제가 몇가지 결정을 하기로 했습니다.

제가 그동안 직장 생활을 하면서 주말 시간대를 활용하여 커널연구회 운영을 틈틈히 했습니다만,
이제는 10년 이상 다니던 직장을 정리하고 커널연구회를 위한 연구개발에 몰두하려 합니다.
커널연구회를 연구개발, 교육, 지식공유 중심으로 운영하려 합니다.

저는 1980년대 중학교시절에 8비트 개인용 컴퓨터를 처음으로 접했습니다.
그당시 8비트 PC는 키보드와 본체가 하나로 붙은 일체형에 작은 모니터가 있고,
모니터에는 검은색 바탕에 녹색 글자가 표시 되었는데, 저는 그것이 너무 신기했습니다.
이렇게 시작된 컴퓨터에 대한 호기심과 배움의 열정은 지금도 식지 않고 있고 현재진행형입니다.
그동안 이길을 걸어오며 중간 중간에 시행착오도 있었고 잘못된 판단으로 인해서 어려움도 많이 겪었습니다.
지난날에 힘들어 했던 시행착오들을 회상할때 마다 저는 한가지 중요한 원칙을 지키지 못했음을 깨닫습니다.
바로 이분야의 기본원리, 즉 컴퓨터 구조와 알고리즘에 대한 원리를 완벽히 이해하지 못한채 응용에만 집착했기 때문입니다.

학창시절 컴퓨터 구조, 자료구조, 알고리즘에 대한 학과 수업을 수강했으나 이것의 중요함을 느끼지 못했습니다.
물론 학과 수업이 너무 이론적인 방향으로 흘러 갔다는 문제도 있었지만
저의 관심사는 프로그램 언어를 하나 배워서 뭔가를 만들어 내고 싶은 욕심만 있었습니다.
그당시 어플리케이션인 아래아 한글 워드프로세서, 몽땅연필, 다양한 게임들을 모방하는 프로그래밍에 집착했었죠.
제가 학창시절에 활동 했었던 컴퓨터 프로그래밍 동아리의 지도교수님이 저에게 하셨던 말씀을 아직도 기억합니다.
`너희들이 지금 하고 있는 프로그래밍은 사상누각에 불과하다. 학과 공부를 열심히 해라!`.
그당시 전 이말을 이해하지 못했고 오히려 반감을 가지고 있었죠.
`교수님은 학과 공부를 열심히 해서 도대체 어떤 프로그램을 만들고 계시나요?` 라구요.

제가 컴퓨터의 기본 원리에 대해서 눈을 뜨기 시작한것은 대학교 3학년때였습니다.
그당시 서울대학교에서 해마다 가을에 마이크로마우스 경기대회라는 것을 했습니다.
(지금도 이경기를 하고 있는줄 모르겠으나, 요즘은 KAIST 주관으로 지능형 SoC 로봇워 대회를 하고 있더군요.)
마이크로마우스는 소형 CPU보드에 모터와 센서를 제어하는 회로기판을 조립하고
C언어로 이것을 제어하는 프로그램을 만들어 미로의 중앙 목표지점에 최단경로와 최단시간 알고리즘을 사용하여
최대한 빨리 찾아가는 마이크로로봇이었습니다.
마이크로마우스의 성능은 CPU의 처리속도(이때는 16MHz/32MHz의 8비트/16비트 Microprocessor를 사용했습니다)와
스테핑모터와 센서 제어기법, 최단시간/최단경로 찾기 알고리즘에 의해 결정 되었습니다.
이당시 CPU 보드와 스테핑모터, 센서제어 회로는 공개된 것들이 많아서 제가 일일히 납땜하여 만들었으나,
문제는 소프트웨어 였습니다. 먼저 부트로더 제작에서 힘들어지기 시작했습니다.
부트로더는 제어선, 주소선, 데이터선이 상호 연결된 CPU와 메모리, 주변장치(모터, 센서)들에 전기가 들어 갔을 때
처음으로 동작 가능하게 해주는 프로그램으로서 보통 어셈블리어로 작성됩니다.
따라서 부트로더와 하드웨어는 상호 밀접하게 연관되어 있습니다.
이당시 부트로더를 제대로 이해하지 못하고 공개된 것들을 참조하면서 짜집기 형태로 프로그래밍을 했었습니다.
다음은 최단시간/최단경로 찾기 알고리즘을 사용한 C언어 프로그래밍 이었습니다.
학과 공부에서 컴퓨터구조, 자료구조, 알고리즘을 배우기는 했으나 제대로 적용하는 방법을 모르겠더군요.
메모리는 어떻게 할당하고 스택과 큐, 리스트, 트리는 어떻게 사용하는지 완벽히 이해하지 못한 상태에서
주먹구구 식으로 프로그래밍을 했었습니다.
그러나 한가지 다행스러운 것은 이러한 경험을 하면서 컴퓨터의 원리와 알고리즘의 중요성을 느꼈고
이것을 좀더 심도 있게 공부해야 된다는 것을 알았다는 것이었습니다.

제가 대학교를 졸업할 무렵 리눅스가 세상에 알려지기 시작하더군요.
저는 리눅스 커널에 대해서 호기심이 발동했습니다. 그래 이것에 대해서 공부하자.
그러나 저의 학업에 대한 열망은 여기까지 였습니다.
취업을 하고 회사생활에서 리눅스 커널을 연구하고 개발하는 것은 없었습니다.
회사는 당장 이윤이 생기는 분야를 하더군요.
리눅스에 아파치 웹서버를 설치하여 웹프로그래밍에 매달렸습니다.
이윤이 생기는 홈페이지, 쇼핑몰, 웹메일 등의 개발을 했습니다.
이 일을 하면서도 저는 리눅스 커널에 대한 공부를 하고 싶어, 하루는 회사 사장에게 얘기했습니다.
`나는 리눅스 커널을 하고 싶습니다.` 그랬더니 사장이 그러더군요.
`그것은 이미 만들어져 있고, 이윤이 생기지 않는다.` 라구요.
리눅스 커널에 대한 공부 열정은 여기서 일단 접히게 됩니다.
다행히 오라클 SQL 튜닝을 접하면서 학교에서 막연히 이론적으로만 들었던 알고리즘들이 DBMS 내부에 구현되어 있고
이것들을 실제적으로 확인하면서 공부했다는 것입니다.
이 일들을 나름대로 정리하여 책으로 출판(혜지원: 오라클 실무활용 SQL 튜닝)하면서
저의 실력이 한층 발전할 수 있는 계기가 된 듯 합니다.
자료구조와 알고리즘에서 중요한 것은 이론적으로만 학습하면 절대로 않된다는 것입니다.
학습한 이론을 C언어와 같은 언어로 직접 구현해 보아야지 자신의 것이 됩니다.
저는 이제 이렇게 말할 수 있습니다.
`자료구조와 알고리즘을 C언어로 직접 구현해 본 사람이 진정한 컴퓨터 엔지니어이다.` 라구요.

저는 몇년전부터 리눅스 커널 공부를 다시 하고 있습니다.
컴퓨터구조, 부트로더, 시스템프로그래밍, 디바이스드라이브을 섭렵했습니다.
그리고 작은 성과물로 월간 임베디드월드 잡지책에 `리눅스 임베디드 보드에서 영어학습기 구현`,
`C언어와 알고리즘`이라는 제목으로 기고글을 연재했습니다.
최근에는 `검색속도를 획기적으로 개선한 자연어기계번역`이라는 프로그래밍을 했으며 이것을 특허출원중에 있습니다.
그리고 이런 내용물들을 제가 운영하는 커널연구회(www.kernel.bz) 웹사이트에 올려서 공유하고 있습니다.

제가 이글의 서두에서 말씀 드렸듯이, 이제 커널연구회 활동을 본격적으로 해서
연구개발, 교육, 지식공유에 관한 일들을 적극적으로 펼쳐볼까 합니다.

교육은 커널연구회의 중요한 활동중에 하나가 될듯합니다.
단순한 교육에만 목적을 두지 않고 내실있는 지식 전달을 통해서 창조적인 프로젝트를 수행할 수 있는
인적 역량을 쌓아서 지속적으로 연구개발할 수 있도록 할 것입니다.

커널연구회 교육원은 다음과 같은 지식을 전달합니다.

*C언어/알고리즘/임베디드/디바이스드라이브/리눅스 커널 집중 교육

*교육기간: 5개월

*교육시간: 오전10시 ~ 오후4시 (하루 5시간 교육)

*응용분야: 임베디드, 휴대용 스마트기기, 전자/전기/기계 제어, 지능형 로봇, 각종 연구기관 프로젝트

좀더 자세한 교육내용은 아래 링크를 참조하셔도 됩니다만,

http://www.kernel.bz/sr/sr05_edu_chart.htm

간단하게 요약하면 아래와 같습니다.

1. C언어(1개월)

1주: C언어 소개, 형태, 연산자, 표현
(1) C언어 입문, 전체 프로그램 구조
(2) 데이터 형태와 크기
(3) 연산자
(4) 표현
(5) 절차와 순서
2주: 제어흐름, 함수와 프로그램구조
(1) 문장과 블럭, 판단(if, switch)
(2) 반복(while, for)
(3) 함수
(4) 영역규칙, 헤더파일
(5) 재귀, 전처리기(매크로), 조건 컴파일
3주: 배열과 포인터
(1) 배열과 포인터 이해
(2) 주소연산, 포인터와 함수
(3) 배열 포인터
(4) 함수 포인터
(5) 복잡한 포인터
4주: 구조체
(1) 구조체의 기초
(2) 구조체와 함수
(3) 구조체 배열
(4) 구조체 포인터
(5) 구조체 응용

2. 자료구조와 알고리즘(1개월)

1주: 알고리즘 기초
(1) 루프와 재귀호출
(2) 정렬 알고리즘1
(3) 정렬 알고리즘2
(4) 정렬 알고리즘3
(5) 알고리즘 비용 평가법
2주: 자료구조 기초
(1) 스택 C언어 실습
(2) 큐 C언어 실습
(3) 리스트 C언어 실습
(4) 해시 C언어 실습
(5) 자료구조 활용 C언어 실습
3주: 자료구조 응용
(1) 트리구조 이해
(2) Binary Search Tree C언어 실습
(3) Red-Black Tree C언어 실습1
(4) Red-Black Tree C언어 실습2
(5) 자료구조 응용 C언어 실습
4주: 고급 알고리즘
(1) BTree C언어 실습1
(2) BTree C언어 실습2
(3) BTree C언어 실습3
(4) 다양한 알고리즘 활용법
(5) 진보된 알고리즘 소개

3. 부트로더/커널포팅/시스템 프로그래밍(1개월)

1주: 부트로더, 리눅스 커널 포팅
(1) 임베디드보드 구조 및 개발환경 설정
(2) 부트로더 이해1
(3) 부트로더 이해2
(4) 리눅스 커널포팅1(x86)
(5) 리눅스 커널포팅2(임베디드)
2주: 시스템 프로그래밍1(File I/O)
(1) 파일 입출력 이해
(2) open/read/write/sync/seek C언어 실습
(3) multiplex/select/poll C언어 실습
(4) scatter/gather/epoll/mmap C언어 실습
(5) 파일 및 디렉토리 관리 C언어 실습
3주: 시스템 프로그래밍2(Process 관리)
(1) Process 이해
(2) fork/exec C언어 실습
(3) zombi/daemon/wait C언어 실습
(4) thread C언어 실습
(5) mutex C언어 실습
4주: 시스템 프로그래밍3(Memory, Signals, Timers)
(1) address/malloc C언어 실습
(2) mapping/진보된 메모리 할당 C언어 실습
(3) Signals C언어 실습
(4) Timers C언어 실습
(5) 시스템프로그래밍 응용

4. 리눅스 커널/디바이스드라이버 프로그래밍 (1개월)

1주: 리눅스 커널 이해, 커널이 제공하는 기능
(1) 커널의 프로세스관리 이해
(2) 커널안의 동시성 이해
(3) 인터럽트 이해
(4) 커널 쓰레드 이해
(5) 커널이 제공하는 기능 활용법
2주: 리눅스 디바이스드라이버 실습1
(1) CMOS Drivers C언어 실습
(2) Parallel Port Drivers C언어 실습
(3) Input Drivers C언어 실습
(4) Direct Memory Access C언어 실습
(5) USB Drivers C언어 실습
3주: 리눅스 디바이스드라이버 실습2
(1) Video Drivers C언어 실습
(2) Audio Drivers C언어 실습
(3) Simple Storage Controller C언어 실습
(4) Ethernet NIC Drivers C언어 실습
(5) 다양한 디바이스드라이버 소개
4주: 리눅스 커널 분석
(1) 프로세스 스케쥴링 분석
(2) 인터럽트 핸들러 분석
(3) 커널 동기화 분석
(4) 타이머와 메모리 관리 분석
(5) 파일 시스템 분석

5. 응용 프로젝트 프로그래밍(1개월)

1주: 조편성, 프로젝트 선정, 자료조사, 입출력 설계
(1) 조편성, 프로젝트 선정
(2) 자료조사1
(3) 자료조사2
(4) 입출력 설계1
(5) 입출력 설계2
2주: 프로그램 코딩1
(1) Data Flow Diagram 작성
(2) 자료구조와 알고리즘 선정
(3) 구조화된 메인 모듈 작성
(4) 구조체와 전역변수 선정
(5) 함수 흐름도 작성
3주: 프로그램 코딩2
(1) 세부적인 함수 코딩1
(2) 세부적인 함수 코딩2
(3) 세부적인 함수 코딩3
(4) 세부적인 함수 코딩4
(5) 세부적인 함수 코딩5
4주: 프로그램 디버깅, 프리젠테이션
(1) 테스트
(2) 디버깅
(3) 문서화
(4) 프리젠테이션 준비
(5) 프리젠테이션

장문의 글을 끝까지 읽어 주셔서 감사합니다.
현재 커널연구회 교육원은 개설 준비중에 있습니다.
개설에 앞서서 KLDP에 계신분들의 소중한 의견들을 들어보고 싶습니다.

교육내용에 대한 궁금증, 교육시간의 적절성등...
무엇보다 각 교육과목별로 수강료는 어느정도 수준이 적절한가? 등의 소중한 의견을 들어보려 합니다.
현재 수강료 부분에 있어서는 대학생들에게는 좀더 저렴하게,
직장인 분들에게는 고용보험을 적용하여 거의 무료에 가깝게 책정하려 합니다만,
다양한 의견 주셨으면 합니다.

봄철 건강관리에 유의 하시고, 즐거운 하루 되시길...

preisner의 이미지

참으로 열심이십니다.. 존경스럽네요.

저, 앞으로 직장인 대상으로 저녁반이나 주말반도 운영 하실거죠?
수강료는 고용보험 환급과정으로 개인부담 10만원을 넘지 않았으면 좋겠네요.

강사가 제일 중요하지 않을까 싶습니다.
책임감 있고 경험 많은 강사를 통한 교육시간과 비용이라면 전혀 아깝지 않을 것 같아요.

rgbi3307의 이미지

강사는 제가 직접할 예정입니다. 책임감있고 성실하게 하겠습니다.
평일에 시간 내기 힘든 직장인들을 위해서 주말(토)에 강좌를 개설해볼 생각입니다.
직장 다니시는 분들은 대부분 월급에서 고용보험을 떼이시고 계시니 만큼
이것을 충분히 활용할 수 있도록 수강료를 조정해 보도록 하겠습니다.
조언 너무 감사합니다. 즐거운 하루 되시길...

From:
*알지비 (메일: rgbi3307(at)nate.com)
*커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))

shint의 이미지

저도 UI와 네트워크 분야를 이렇게 정리해 나갈 수 있다면 정말 좋겠네요.
실력도 키워야 하고 할일이 정말 많은데 말입니다. ㅇ_ㅇ'''

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

rgbi3307의 이미지

이곳에서 shint님의 좋은 글들을 많이 봤어요.
앞으로도 꾸준히 건승하시고 좋은 성과 달성해 가시길...

From:
*알지비 (메일: rgbi3307(at)nate.com)
*커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))

madman93의 이미지

교육이 이루어지면 교육장소가 어디가 되는지요??

---------------------------------------------
git init
git add .
git commit -am "project init"
---------------------------------------------

rgbi3307의 이미지

아래의 2군데중에서 하나를 정해야 할듯합니다.

(1)구로/가산 디지털단지
(2)왕십리역 근처

혹시, 추천해 주실만한 장소가 있으면 알려 주시면.. 은혜 잊지 않겠습니다.
즐거운 하루 되시길...

From:
*알지비 (메일: rgbi3307(at)nate.com)
*커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))

익명 사용자의 이미지

1,2 강의를 c기초강의로 개설하고
3,4,5 강의를 좀더 보강하여 커널프로그래밍 과정으로 개설하시는게 어떨까요?

절대 c언어 기초를 모르시는 분들이라면
한두달동안 기초한다고해서 뒷강의 들어도 모를거 같습니다.

반대로 커널 프로그래밍 하시는 분들이 1,2강의를 돈내고 들을 필요는 없다고 생각합니다.

rgbi3307의 이미지

1강의 C언어에서 포인터와 구조체는 너무나 중요한 부분입니다.
특히, 함수포인터 구조체포인터 등은 시스템프로그래밍, 디바이스드라이버, 커널프로그래밍에서
핵심적인 코드로 등장합니다. 또한 2강의 자료구조와 알고리즘에서 링크드 리스트, 스택, 큐,
Binary Search Tree, Red-Black Tree, BTree등도 커널에서 근간이 되는 코드로 등장합니다.
커널의 핵심인 프로세스가 구조체로 메모리 할당되어 링크드 리스트로 관리되고
프로세스 스케쥴링은 큐와 최근 2.6커널에서는 Red-Black Tree로 관리됩니다.
또한 커널의 메모리관리 및 페이지 스와핑 알고리즘에 큐의 FIFO,
Least Recently Used (LRU) Page Replacement Algorithm 등이 사용되고,
커널의 파일관리에서는 BTree 알고리즘이 사용됩니다.
1강의에 있는 C언어의 함수포인터, 구조체포인터등을 깊이있게 이해하고
2강의에 있는 자료구조와 알고리즘을 심도있게 마스터하신 분은 3,4,5강의가 너무나 쉬울 것입니다.
C언어와 알고리즘을 심도있게 마스터 하신분은 임베디드환경에서 나만의 새로운 커널 제작에 도전해 볼 수도 있습니다. 그만큼 1,2강의 C언어와 알고리즘은 중요한 부분입니다.
확언하건데, 시스템프로그래밍, 디바이스드라이버, 커널프로그래밍이 힘들다고 느끼시고 계시다면
C언어의 함수포인터, 구조체포인터, 자료구조와 알고리즘부터 C언어로 실습하시라고 권합니다.

1,2,3,4,5강의를 모두 듣는것은 시간과 비용이 부담이 될 수 있을것 같아
한달 단위로 자신에게 필요한 강의를 선택하여 부분적으로도 수강할 수 있도록 계획하고 있습니다.
좋은 지적 감사합니다.

From:
*알지비 (메일: rgbi3307(at)nate.com)
*커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))

dpdlf의 이미지

재밌겠네요. 빨리 수강하고 싶습니다 ^^;