Presentation is loading. Please wait.

Presentation is loading. Please wait.

Kernel Programming Environment

Similar presentations


Presentation on theme: "Kernel Programming Environment"— Presentation transcript:

1 Kernel Programming Environment
VMware 설치 Debian 7 설치 커널 코드 다운로드

2 Chapter 1 리눅스 커널 프로그래밍 환경 구축
VMware 설치 Debian 7 설치 커널 소스 코드 설치

3 VMware & Debian 설치 1 VMware Workstation 11 for Windows 설치
Custom 설치 Debian mini image 최신 버전 debian i386-netinst.iso 다운로드 CD/USB iso images  HTTP or FTP  stable ftp://ftp.lecl.net/debian-cd/7.8.0/i386/iso-cd/ New Virtual Machine Custom Workstation 11 I will install … blank hard disk Debian 7.x VM name: Debian7.x 2 cores (자기 컴퓨터 사양 확인하여 같게) 4096 (자기 컴퓨터 사양 확인하여 조금 작게) NAT BUS IDE Create a new virtual disk 30.0G 이상 권장 VM settings Hardware  CD/DVD use image file, debian i386-netinst.iso

4 VMware & Debian 설치 2 Power on Graphical install 선택
한국어 대한민국 호스트이름  debian 도메인 이름  계속 루트 암호  unixlinux 사용자 계정 등록  자기id 자동 디스크 전체 사용 모두 한 파티션에 설치 바뀐 사항 디스크에 쓰기 디스크 설정 확인  예 베이스 시스템 설치 APT 패키지 관리자 설정  사이트 선택 ( ftp://ftp.lecl.net 추천 )  프록시 빈칸 패키지 선택  계속 설치 시간? 마스터 부트 레코드에 Grub 설치  $ vi /boot/grub/grub.cfg I finished installing 선택 후 재부팅 APT(Advanced Package Tool) 데비안 꾸러미 관리 프로그램

5 Chapter 2 커널 컴파일 및 개발 환경 구축

6 커널 컴파일 환경 구축 1 사용자로 로그인 후 root 부팅 설정 (기타  root  암호) 로그인 후 유틸리티 설치
$ su $ vi /etc/pam.d/gdm3 #auth require pam_succeed_if.so user != root quiet_success /*주석처리*/ gdm : GNOME Display Manager pam_succeed_if.so : 인증 계정 테스트 quiet : 시스템 로그에 기록하지 않음 (기타  root  암호) 로그인 후 유틸리티 설치 (# apt-get install gcc) (# apt-get install gdb) (# apt-get install make) # apt-get install vim APT(Advanced Package Tool) 데비안 꾸러미 관리 프로그램

7 커널 컴파일 환경 구축 2 프로그래밍 환경 설정 쉘 환경 설정 vi 환경 설정 C 프로그래밍 환경 설정 확인
(예) 쉘 환경 설정 $ vi /root/.bashrc export LS_OPTIONS=‘--color=auto’ alias ls=‘ls $LS_OPTIONS’ alias rm=‘rm –i” (예) vi 환경 설정 $ vi /root/.vimrc set number set autoindent set tabstop=2 syntax on (예) hello.c $ vi hello.c #include <stdio.h> main() { printf("Hello Linux\n"); } 프로그래밍 환경 설정 쉘 환경 설정 $ vi .bashrc vi 환경 설정 $ vi .vimrc C 프로그래밍 환경 설정 확인 $ vi hello.c $ gcc hello.c –o hello

8 커널 컴파일 환경 구축 3 최신 커널 안정 버전 3.19.1 소스 코드 설치 커널 버전의 의미 Iceweasel
linux  kernel  v3.x  linux 커널 소스 코드 다운로드 후 /usr/src로 이동 (xz) $ unxz linux tar.xz $ tar xvf linux tar.xz (gz) $ tar xvfz linux tar.gz 커널 버전의 의미 el i686 <Major><Minor><Build><Revision><Version><Architecture> <Major> 커널에 커다란 변화가 있을 때 바뀌는 번호 <Minor> 짝수일 때 안정 버전, 홀수일 때 개발버전 <Build> 패치 레벨을 나타내는 숫자 <Revision> 패키지 개정 횟수를 나타내는 숫자 <Version> 패키지 버전 (예) el6 : Enterprise Linux (Red Hat Enterprise Linux/CentOS) <Architecture> 프로세서 (예) i686 : Intel Pentium processor (= x86 microarchitecture)

9 grep을 이용한 커널 분석 1 grep이란? 사용법 텍스트 파일에서 원하는 키워드를 찾아주는 도구
grep keyword filename.c grep keyword * 하위 디렉터리 탐색 grep –r keyword * 라인 위치 표시 grep –n keyword * 대소문자 구분없음 grep –i keyword * grep –rni keyword * Hanbit Media(c)

10 grep을 이용한 커널 분석 2 xargs를 사용한 탐색
find ./ -name *.[ch] –print | xargs grep keyword - Hanbit Media(c)

11 ctags 활용 (src) ctags 설치 vim 설정 tag 탐색 # apt-get install ctags
# cd /usr/src/linux (반드시 커널 소스 있는 곳에서) # ctags –R 또는 # make tags vim 설정 # vi /root/.vimrc set tags+=/usr/src/linux /tags tag 탐색 # vi –t task_struct (정의로 이동) mm_struct 발견 Control-] (mm_struct 정의로 이동) Control-t (tag stack의 이전 위치로 이동) :tag schedule (정의로 이동) :tag /shedule (포함된 태그로 이동) :ts schedule (tag select) :tn (next tag) :tp (previous tag) :tags (history)

12 ctags 활용 (lib) ctags 설치 vim 설정 ctags 검색 속도 개선 (ctags 코드 자동 완성)
# apt-get install ctags # cd /root # ctags -links=no –f stdlib.tag –R /usr/include (lib 헤더 파일 위치) vim 설정 # vi /root/.vimrc set tags+=~/stdlib.tag set tagbsearch ctags 검색 속도 개선 (ctags 코드 자동 완성) set complete

13 cscope 활용 cscope 설치 cscope 실행 vi 연동 vim 설정 # apt-get install cscope
# cd /usr/src/linux (반드시 커널 소스 있는 곳에서) # find ./ -name *.[chS] –print > cscope.files cscope 실행 # cscope Tab으로 이동 0(s) 1(g) 2(d), 3(c) 4(t) 5(e) 7(f) 8(i) Control-D로 종료 vi 연동 :cs help :cs add /usr/src/linux /cscope.out :cs find 0 task_struct vim 설정 # vi /root/.vimrc set cst

14 (참고) Windows와 VMware 사이 파일 공유하려면
VMware Tools 설치 VM  VMware Tools Install 선택 위치  cdrom0  VMwareTools tar.gz 을 /root에 복사 (또는) # mount –t iso9660 –o ro /dev/cdrom /mnt # cp /mnt/VMwareTools tar.gz /root # cd /root # tar xvfz VMwareTools tar.gz # cd vmware-tools-distrib # perl vmware-install.pl (잘 읽어보며 default 선택) (구성 수정) # perl bin/vmware-config-tools.pl # lsmod VM  Settings  Options Tab  Shared Folders  Add Edit  Preferences  Shared VMs  Enable Sharing

15 (참고) Linux 한글이 깨질 때 LANG=ko_KR.UTF-8 ; export LANG
LANG=ko_KR.eucKR ; export LANG # dpkg-reconfigure locales [*] ko_KR.EUC-KR EUC-KR [*] ko_KR.UTF-8 UTF-8 기본 로케일 ko_KR.UTF-8 설정 기본 로케일 ko_KR.eucKR 설정

16 $ (참고) Vi 편집 개념 a A i I esc oO R ~ ~ vi mode(vi 명령 모드) $vi filename
:q! (기록 않음) ZZ(기록) :wq :x a A i I esc x r dd 커서이동 append insert oO open R replace H J K L 

17 (참고) make 컴파일 과정을 자동화 Makefile 매크로 사용 target: dependencies
(예1) all: gcc hello.c –o hello (예2) CC = /usr/bin/gcc CFLAGS = -g all: hello hello2 hello: hello.c dummy.c $(CC) $(CFLAGS) $^ -o hello2: (예2 통합) %.c%: 컴파일 과정을 자동화 Makefile target: dependencies [tab] system command (규칙) (반드시 tab 선행) 매크로 사용 CC : 컴파일러 $^ : dependencies 대체 : target 대체 CFLAGS : 컴파일 옵션

18 (참고) 다중 모듈 프로그램 단일 모듈 프로그램 다중 모듈 프로그램 코드의 재사용(reuse)이 어렵고,
여러 사람이 참여하는 프로그래밍이 어렵다 예를 들어 다른 프로그램에서 copy 함수를 재사용하기 힘들다 다중 모듈 프로그램 여러 개의 .c 파일들로 이루어진 프로그램 일반적으로 복잡하며 대단위 프로그램인 경우에 적합

19 (참고) 다중 모듈 프로그램 예: main & copy
copy.c copy.h // 함수의 프로토타입을 포함하는 헤더 파일 컴파일 $ gcc -c main.c $ gcc -c copy.c $ gcc -o main main.o copy.o 혹은 $ gcc -o main main.c copy.c

20 (참고) 다중 모듈 프로그램 예: main & copy
#include <stdio.h> #include <string.h> #include "copy.h" char line[MAXLINE]; // 입력 줄 char longest[MAXLINE]; // 가장 긴 줄 /*입력 줄 가운데 가장 긴 줄 프린트 */ main() { int len; int max; max = 0; while (fgets(line, MAXLINE, stdin) != NULL) { len = strlen(line); if (len > max) { max = len; copy(line, longest); } if (max > 0) // 입력 줄이 있었다면 printf("…The logest…\n%s\n", longest); return 0; /* copy.c */ #include "copy.h" /* copy: from을 to에 복사; to가 충분히 크다고 가정*/ void copy(char from[], char to[]) { int i; i = 0; while ((to[i] = from[i]) != '\0') ++i; } /* copy.h */ #define MAXLINE 100 void copy(char from[], char to[]);

21 (참고) make 시스템의 필요성 다중 모듈 프로그램을 구성하는 일부 파일이 변경된 경우? 예 make 시스템
변경된 파일만 컴파일하고, 파일들의 의존 관계에 따라서 필요한 파일만 다시 컴파일하여 실행 파일을 만들면 좋다 copy.c 소스 코드를 수정 목적 파일 copy.o 생성 실행파일을 생성 make 시스템 대규모 프로그램의 경우에는 헤더, 소스 파일, 목적 파일, 실행 파일의 모든 관계를 기억하고 체계적으로 관리하는 것이 필요 make 시스템을 이용하여 효과적으로 작업

22 (참고) 메이크파일(Makefile) 메이크파일 $ make [-f 메이크파일]
실행 파일을 만들기 위해 필요한 파일들과 그들 사이의 의존 관계, 만드는 방법 등을 기술 make 시스템은 메이크파일을 이용하여 파일의 상호 의존 관계를 파악하여 실행 파일을 쉽게 다시 만듦 $ make [-f 메이크파일] 옵션이 없으면 Makefile 혹은 makefile을 사용

23 (참고) 메이크파일의 구성 메이크파일의 구성 형식 대상리스트: 의존리스트 명령리스트 (반드시 tab으로 시작) 메이크파일 예
$ vi makefile main: main.o copy.o gcc -o main main.o copy.o main.o: main.c copy.h gcc -c main.c copy.o: copy.c copy.h gcc -c copy.c $ make –f makefile 매크로(Macros) make에서 지원하는 기능: make 파일 내에 모든 $(token)는 replacementText로 대치 token = replacementText 규칙 .c.o: $(CC) $(CFLAGS) $(CPPFLAGS) -c $< CFLAGS = -O -g -p -O (optimize) -g (gdb를 위한 디버깅 정보 포함) -p (모든 매크로 정의 출력) 그 외 정보들: $ man make make 실행 $ make 혹은 $ make main gcc -c main.c gcc -c copy.c gcc -o main main.o copy.o copy.c 파일이 변경된 후 $ touch copy.c $ make

24 (참고) C vs. Assembly $ cat helloa.asm section .data hello: db 'hello, kernel', 10 helloLen: equ $-hello section .text global _start _start: mov eax, 4 mov ebx, 1 mov ecx, hello mov edx, helloLen int 80h mov eax, 1 mov ebx, 0 $ nasm –f asf hello.asm $ ld –s –o helloa ./helloa $ cat helloc.c #include <unistd.h> int main(void) { write(1, "Hello, Kernel\n", 14); return 0; } $ gcc helloc. -o helloc $ ./helloc


Download ppt "Kernel Programming Environment"

Similar presentations


Ads by Google