제로부터시작하는오픈소스

34
Re: 제로부터 시작하는 오픈소스 KOSS Lab. 2Mario Cho ( 조만석) [email protected]

Transcript of 제로부터시작하는오픈소스

Page 1: 제로부터시작하는오픈소스

Re:제로부터 시작하는 오픈소스

KOSS Lab. 2기

Mario Cho (조만석)

[email protected]

Page 2: 제로부터시작하는오픈소스

Development Experience◆ Bio-Medical Data Processing based on

HPC for Human Brain Mapping◆ Bio-medical data processing based on

Neural Network (Machine Learning)◆ Medical Image Reconstruction

(Computer Tomography) ◆Enterprise System◆Open Source Software Developer

Open Source Software Developer◆ Linux Kernel & LLVM ◆ OpenStack & OPNFV (NFV&SDN)◆ Machine Learning (TensorFlow)

Technical Book◆ Unix V6 Kernel

Open Frontier Lab.Mario Cho

[email protected]

Who am I ?

Page 3: 제로부터시작하는오픈소스

Today’s information

* http://www.cray.com/Assets/Images/urika/edge/analytics-infographic.html

Page 4: 제로부터시작하는오픈소스

The Future of Jobs

“The Fourth Industrial Revolution, which includes developments in previously disjointed fields such as artificial intelligence & machine-learning, robotics, nanotechnology, 3-D printing, and genetics & biotechnology, will cause widespread disruption not only to business models but also to labor market over the next five years, with enormous change predicted in the skill sets needed to thrive in the new landscape.”

Page 5: 제로부터시작하는오픈소스

Open Source

Page 6: 제로부터시작하는오픈소스

오픈소스프로젝트 찾기

1. 구글링

2. 오픈소스 커뮤니티에서 프로젝트 찾기

• The�Apache�Software�Foundation(ASF)

• Jboss

• GitHub

• BitBucket

• Google�Code

• CodeProject

• Sourceforge

Page 7: 제로부터시작하는오픈소스

오픈소스찾기: https://www.ohloh.net

Page 8: 제로부터시작하는오픈소스

오픈소스저장소: https://github.com

Page 9: 제로부터시작하는오픈소스

운영체계란?

운영체계- 커널은운영체제의핵심으로컴퓨터시스템을사용하는데꼭필요한기능을제공.

운영체계의주역활-실행프로그램(프로세스Process)관리- 메모리관리 (Memory Management)- 파일시스템 (File System)-파일과주변장치를위한 I/O

Page 10: 제로부터시작하는오픈소스

Linux Kernel Architecture

Page 11: 제로부터시작하는오픈소스

K&R�(Ken�Tompson &�Dennis�Richie)

Page 12: 제로부터시작하는오픈소스

Lions�Commentary�on�UNIX�V6

Page 13: 제로부터시작하는오픈소스

Open�Source�OS�From�Unix�V6�To�Linux

Linux

Unix�V6

Page 14: 제로부터시작하는오픈소스

리눅스 커널

운영체계- Apple�Mac�OS�system�1.x�:�1984.x- MS�Windows�1.x�:�1985.x- Linux�:�1991.�8.26

Page 15: 제로부터시작하는오픈소스

리눅스 커널을공부하기 전에 대상과어떤 것을 분석할지목표를 분명히합니다.아울러 target�device도함께정합니다. (추천 라즈베리파이2)

- kernel�boot�process- boot�loader에서부터시작해서 하드웨어초기화, 메모리 초기화, 인터럽트 설정,- init process�에 이르는일련의 과정을분석.- 내용이 많지만, 하드웨어, 커널에서 사용하는 주요 메크로, 알고리즘을배울 수 있음.

- mm_init()�분석- start_kernel()에보면메모리를 초기화하는 mm_init()이 있습니다.- 리눅스커널은 buddy와 slub을이용해서 메모리를관리합니다.- buddy와 slub이 어떻게 초기화되고 커널에 메모리초기호/할당/제거를 분석

- Device�Driver�분석- GPIO�디바이스를분석하고 라즈베리파이2를 이용해서실험- network�디바이스를분석해서 network�stack을심화

- 그외스케쥴러 분석 등등.

I.�오픈소스(커널)를 공부하기 위한 목표 설정

Page 16: 제로부터시작하는오픈소스

II.�오픈소스(커널)를 공부하기 위해 필요한 것들

- Note�PC�or��Desktop�or�Cloud�connection

- Editor�:�Vim,�Emacs,�???- Tools:�ctags,�gtags,�cscope,�…

- 참고 서적- AP�Manual

- ARM Cortex A Series Programmer Guide- ARM Cortex A15 Technical ReferenceManual- kernel 분석에 필요한AP user manual (가장중요하지만, , , )

- DTB (Device Tree Blob)- Power ePAPR_APPROVED_v1.1

- Kernel책들- UNIX V6 로 배우는 커널의원리와 구조 (운영체제에대한 근본원리)- 코드로알아보는 ARM 리눅스커널 (2.6.x 커널 기준)- 리눅스커널 해설 (2.6.x 커널)

- 어셈블러- GNU�:�GNU�Assembler�Directive- GNU�:�GNU�Assembler�Manual- GNU�:�GNU�Linker�Manual

Page 17: 제로부터시작하는오픈소스

커널은 코드의 양이 크기 때문에 (약 1500만 라인) 많은 지식을 필요로 하고,많은 시간을 걸쳐서 하는 개발자 마라톤과 같은 부분이 있으므로 꾸준히 공부할 동료가필요합니다.

1. 함께 공부할 친구를 찾는다. (개발자커뮤니티)

2. 오픈 소스 스터디에서 존칭을 사용 (상호 존중)

3. 오픈 소스 스터디에 부담 주는 행동 자제. (한사람이 부담을 주는 행동들…)

4. 커널에 맞는 구하기 쉬운 디바이스 선정 (라즈베리 파이 2?�or�3?)

5. 꾸준히 공부 할 수 있는 공간

6. 스터디 내용을 공유할 수있는 인터넷 공간 (커뮤니티 게시판, 공유 문서)

II.�오픈소스(커널)를 공부할 때Ground�Rule

Page 18: 제로부터시작하는오픈소스

III.�이론공부 시작 Let’s�Start!!!

1. 각자 다른 배경의 사람들이커뮤니티에있으므로서로간의 눈높이를 맞추기 위해서이론서를 함께읽습니다.

2. 이론서는 얇은 책으로…

3. 라운드 로빈방식으로 서로 조금씩돌아가면서읽습니다.

Page 19: 제로부터시작하는오픈소스

III.�이론공부: Linux info from the source

Page 20: 제로부터시작하는오픈소스

IV.�소스 코드분석장소: 대학교 강의실, 토즈(?)

방법:- 소스코드 드라이빙- 소스코드를 보면서 토론.- 인터넷공유 문서(구글 doc)�등으로자료 공유

Page 21: 제로부터시작하는오픈소스

IV. Linux Kernel build up

vmlinux Image

piggy.S

piggy.gz

piggy.o

head.o

misc.o

head-cpu.o

head-board.o

vmlinuxzImage

RAW�kernelExecutable

(ELF�object)

Stripped�Kernel�binary

(binary�Object)

Compressed�Kernel�binary

objcopy gzip as ld objcopy

Asm wrapper

piggy.gz+�

bootstrap� code

위치arch/arm/boot/compressed

CompositeKernel�Image(ELF�Object)

Boot� loader 용Kernel�Image

- Make를 통해서 커널 소스코드를 컴파일후 kernel�image가 만들어지는 과정

Page 22: 제로부터시작하는오픈소스

Start_kernel()

Page 23: 제로부터시작하는오픈소스

Boot�Loader�->�start_kernel()

• Start_kernel()은 init 프로세스가 동작할 때까지 커널을 초기화합니다.

• 코드는 init/main.c에 정의합니다.

IV.�소스 코드분석의 예 :start_kernel()

Page 24: 제로부터시작하는오픈소스

IV.�소스 분석: tag를 이용해서 함수를 추적

리눅스 커널개발을 위한 여러가지도구제공- ctags.�gtags.�cscope,�…

예) start_kernel()->mm_init()->mem_init()

Page 25: 제로부터시작하는오픈소스

V.�커뮤니티 활동 : 공유 (기계학습)

Page 26: 제로부터시작하는오픈소스

V. start_kernel() 주요기능start()_kernel()- smp_setup_processor_id();//� physical�CPU�0�(가칭) 으로 boot�진행- cgroup_init_early(); //�cgroup을 사용하기위한구조체 초기화- boot_cpu_init(); //�현재 cpu(core�id)를 읽어서 cpu_XXX_bits를 설정함

- setup_arch();����������������������//��dtb를 읽어서메모리블록과 영역초기화

- page_alloc_init(); //�cpu_chain에 page_alloc_cpu_notify를 연결

- mm_init(); //�메모리 블록에서 buddy초기화 후 stub�초기화

- sched_init(); //�scheduller가 사용하는구조체 초기화, init_task설정

- rcu_init();� ��������������������������//�rcu자료 구조, bh,�sched,�preemt초기화

- early_irq_init();� �����������������//�irq_desc 0~15까지 object를 할당 받고 초기화- init_IRQ();� �������������������������//�GIC,�COMBINNER가 사용할메모리 할당과자료구조설정

- call_function_init();� ����������//�각 cpu core에서 사용할 call_single_queue 초기화

- pidmap_init();� �������������������//�pidmap 초기화

- rest_init() //�init_process (PID�1번) 실행을위한 초기화후실행

Page 27: 제로부터시작하는오픈소스

start()_kernel()->mm_init()->mem_init()->free_all_bootmem()->free_all_bootmem_core(bdata)->__freepages_bootmem(pfn_to_page(start),order)bootmem으로 관리하던메모리를 buddy로 바꾸는과정입니다.

- while (start < end) {- shift = idx & (BITS_PER_LONG - 1);- if (IS_ALIGNED(start, BITS_PER_LONG) && vec == ~0UL) {

__free_pages_bootmem(pfn_to_page(start), order);//�CPU0의vm_event_states.event[PGFREE] 를32로설정함//�page에해당하는 pageblock의 migrate flag를 반환함//�struct page의 index 멤버에 migratetype을저장함//�struct page의 _count 멥버의값을 0 으로 초기화함//�order 5 buddy를 contig_page_data에 추가함//�(&contig_page_data)->node_zones[ZONE_NORMAL].vm_stat[NR_FREE_PAGES]: 32 로설정//�vmstat.c의vm_stat[NR_FREE_PAGES] 전역변수에도 32로설정count += BITS_PER_LONG;

start += BITS_PER_LONG;}�else�{�// node_bootmem_map[0]의값이 0아닐경우

while (vec && cur != start) {if (vec & 1) {__free_pages_bootmem(page, 0); // CPU0의 vm_event_states.event[PGFREE] 를 1로설정함// page에 해당하는 pageblock의 migrate flag를 반환함// struct page의 index 멤버에 migratetype을저장함// struct page의 _count 멥버의값을 0 으로초기화함// order 0 buddy를 contig_page_data에추가함// (&contig_page_data)->node_zones[ZONE_NORMAL].vm_stat[NR_FREE_PAGES]: 1 로설정// vmstat.c의vm_stat[NR_FREE_PAGES] 전역변수에도 1로설정count++;

}}

V.�커뮤니티 활동: 소스 코드분석 공유

Page 28: 제로부터시작하는오픈소스

VI.�커뮤니티 활동: 궁금하면 물어보자.

Page 29: 제로부터시작하는오픈소스

VII.�커뮤니티 활동: 아는 것을 알려주자.

Page 30: 제로부터시작하는오픈소스

VII.�커뮤니티 활동: 아는 것을 알려주자.

Page 31: 제로부터시작하는오픈소스

VIII.�커뮤니티 활동: 잘못된것을 발견하면 수정

Page 32: 제로부터시작하는오픈소스

VIII.�커뮤니티 활동: 수정한 것을 함께 리뷰

Page 33: 제로부터시작하는오픈소스

IX.�커뮤니티 활동: 개선 결과 반영

Page 34: 제로부터시작하는오픈소스

Thanks you!

Q&A