1 / 299

과정시간표

과정시간표. 참고서적. 목차. 과정 학습목표. 본 과정의 학습목표는 다음과 같습니다. 프로세스의 내부 동작 이해 시스템 콜 동작 원리를 분석하고 추가하는 과정 이해 메모리 관리의 매커니즘을 이해 가상 파일 시스템 내부 구조 이해 시그널의 동작 방식 이해 및 주의 사항. Linux kernel 개요. Linux 운영체제 구조를 이해한다 . Linux 의 역사 및 특징을 이해한다. Linux 운영체제 구조 개요 Linux 역사 및 특징. 개요. 리눅스 운영 체제 구조. application.

riverson
Download Presentation

과정시간표

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 과정시간표

  2. 참고서적

  3. 목차

  4. 과정 학습목표 본 과정의 학습목표는 다음과 같습니다. • 프로세스의 내부 동작 이해 • 시스템 콜 동작 원리를 분석하고 추가하는 과정 이해 • 메모리 관리의 매커니즘을 이해 • 가상 파일 시스템 내부 구조 이해 • 시그널의 동작 방식 이해 및 주의 사항

  5. Linux kernel 개요 • Linux 운영체제 구조를 이해한다. • Linux의 역사 및 특징을 이해한다. Linux 운영체제 구조 개요 Linux 역사 및 특징

  6. 개요 • 리눅스 운영 체제 구조 application X window system programming csh vi du who kernel kernel programming wc Network Admin. Package telnet Hardware ps grep sort a.out RDBMS gcc ls 문) 리눅스 커널과 양파와의 유사성은 무엇인가?

  7. 개요 • 리눅스 운영 체제 구조 User Programs User Programs application programming Trap User level system programming Libraries Kernel level System Call Interface File System Management Process Management IPC Buffer Cache Context Device Drivers Memory Management Hardware Control (Interrupts handling, etc) HW level Hardware (Source : The design of the UNIX OS)

  8. 개요 리눅스 운영 체제 구조 • Linux 운영체제는 자원관리 시스템 • 물리적 자원 • CPU, Memory, Disk, Network… • 추상적 자원 • process, thread, page, file, inode, message … • Linux 운영체제는 실행 환경 (로더: loader ), execve • 사용자에게 자원을 사용할 수 있도록 서비스 한다. • 커널 자원을 사용할 수 있도록 system call 제공 ※ 추상적 자원은 커널 레벨에서는 다만 구조체의 집합체이다.

  9. Linux 역사 및 특징 리눅스의 역사 • Before UNIX • Multics: 1965, AT&T (Bell Lab), General Electronic, MIT • Epoch • 1969, Ken Thompson, “Space Travel” on PDP-7 - / ASM • Dennis Ritche - C 언어 : The C Programming - 250 page • s5fs, ed, shell (Bourn shell의 조상) • 1973년 “The UNIX Time Sharing System” in CACM • BSD • Billy Joy, Chuch Haley (대학원생) • ex, csh, paging based virtual memory system, TCP/IP, ffs, socket • 1993년 4.4BSD (final version, 이후 BSDI 회사 ) • AT&T System V • Version 1,2,…,7, System III, System V, … SVR4.2/ESMP • region based virtual memory, IPC, remote file sharing, STREAM,

  10. Linux 역사 및 특징 리눅스의 역사 • Commercial UNIX • XENIX (MS, SCO), SCO UNIX (SCO), AIX (IBM, Journaling FS), HP-UX (HP), ULTRIX (DEC, 최초의 MP), OSF/1 (Digital), …. • SunOS (Sun Microsystems, VFS, NFS), Solaris, Unixware (Novell) • Mach • 최초의 micro-kernel • chorus, Exo-kernel, SPIN, L4, …. • standard • SVID(System V Interface Definition), POSIX (IEEE), X/OPEN (Inc.) • UI (SUN, AT&T : Solaris), OSF (OSF/1) • Linux - 리누즈 토발즈 vs MINIX - 타넨바움 • 리차드 스톨만 - FSF - GNU project - gcc , emacs • Gnu is Not Unix • HURD • Performance oriented • Philosophy of COPYLEFT , GPL

  11. Linux 역사 및 특징 리눅스의 특징 • Linux의 장점 • 오픈소스 • 무료( 다만 상업화 하기 어려움 ) • "작은 것이 아름답다" 는 철학을 따름 • file: 다만 데이터의 흐름임 • 간단하고 일관성 있는 인터페이스 • data, device, pipe, socket, memory, process, … 커널내 모든 객체는 하나의 파일로 간주함 • 이식성이 강하다. • 99% C 언어로 구현됨 ( 일부 어셈블리로 구현됨 ) • 진정한 병렬성 • Multitasking (Time Sharing), Multiprogramming, Multiprocessor, Multiuser

  12. Linux 역사 및 특징 리눅스의 특징 • 리눅스의 단점 • 너무 많은 버전이 존재 • RedHat, Ubuntu, CentOS, Suse, Debian ... • 작지않고 빠르게 발전함 • 2~3년에 한번씩 완전히 새로운 버전이 등장 • 진입장벽이 높음 • 초보자가 접근하기 어려움 • GUI 지원이 약함 • 현재는 GUI 지원이 되지만 Windows나 MAC에 비해 약함

  13. 개발 환경 설정 • Kernel 프로그램이 가능 하도록 개발 환경을 구축 할 수 있다. 가상머신 환경설정 네트워크 환경설정 코드분석 환경설정

  14. 가상머신 환경설정 virtual box 설치 • https://www.virtualbox.org 접속 • Download 버튼 클릭 • Windows hosts 링크 클릭 ( 실행 파일 다운로드 됨 ) • 실행파일을 클릭하여 설치

  15. 가상머신 환경설정 VirtualBox Extension Pack 설치 ( usb 3.0 지원을 위해 ) • VM VirtualBox Extension Pack All supported platforms 클릭 • Down 된 파일 더블클릭 ( virtual box 실행 되고 설치 대화상자 실행됨) • 대화상자에서 설치버튼 클릭 • 라이선스 읽은 후 동의합니다. 클릭

  16. 가상머신 환경설정 가상 머신 새로만들기 • ubuntu.vdi 파일 확인 • C:\Users\계정명\VirtualBox VMs : 내부 디렉토리 삭제 • virtual box 실행 • 기존 가상머신 삭제 • 새로만들기 클릭

  17. 가상머신 환경설정 가상 머신 이름 및 버전 설정 • 이름 : Ubuntu 선택 • 종류 : Linux • 버전 : Ubuntu ( 64-bit ) 확인 후 다음 클릭

  18. 가상머신 환경설정 가상 하드 디스크 설정 • Hard disk : 기존에 존재하는 가상 파일 선택 후 열기 • 만들기 선택

  19. 가상머신 환경설정 windows와 통신용 어댑터 설정 • Oracle VM VirtualBox 관리자에서 설정 선택

  20. 가상머신 환경설정 windows와 통신용 어댑터 설정 • 왼쪽 툴바에서 네트워크 선택 • 오른쪽 탭에서 어댑터 2 선택 • 네트워크 어댑터 사용하기 checkbox 클릭 • 다음에 연결됨 : 호스트 전용 어댑터 선택 후 확인 클릭

  21. 네트워크 환경설정 windows와 linux의 네트워크 전체 구조 • 시작 버튼을 눌러 가상 머신을 기동한다. • 부팅이 완료되면 root/linux로 로그인 한다. $ su - windows ubuntu filezilla putty sftp ssh 22 windows IP 확인 c:\> ipconfig host only network : 192.168.56.1 ping 테스트 c:\> ping 192.168.56.128 리눅스 IP 확인 # ifconfig eth1 : 192.168.56.101 서버 포트 확인 # netstat -ant

  22. 네트워크 환경설정 Putty 터미널 설정 • 접속 세션 설정 • Host Name : 192.168.56.128 • Port : 22 • 저장된 세션 : Ubuntu • 저장 클릭

  23. 네트워크 환경설정 Putty 터미널 설정 • 인코딩 문자셋 설정 • 분류에서 변환 클릭 • 문자셋 : UTF-8설정

  24. 네트워크 환경설정 Putty 터미널 설정 • 화면 버퍼 설정 • 분류에서 창 클릭 • 저장 줄수 : 20000 • 설정 후 세션 저장 • 열기 클릭

  25. 네트워크 환경설정 Putty 터미널 설정 • putty를 이용한 리눅스 접속 login as : root Passwd : linux • putty를 이용한 클립보드 복사 / 붙혀넣기 복사하기 : 마우스를 이용한 block 씌우기 붙혀넣기 : 마우스 오른쪽 클릭

  26. 네트워크 환경설정 파일질라 클라이언트 설정 • FileZilla 설치 및 실행 https://filezilla-project.org/ • FileZilla 실행 후 사이트관리자 실행 ctrl + s - 새 사이트 설정 : Ubuntu - 호스트 : 192.168.56.128 - 프로토콜 : SFTP 선택 - 로그온 유형 : 일반 - 사용자 : root - 비밀번호 : linux - 연결 클릭

  27. 코드분석 환경설정 • tags 파일 만들기 • ctags 설치 # apt-get install ctags • 커널 tags 만들기 Arch 에 무관 하게 전체 소스에 대해 태그 생성 # cd /root/tegra # ctags -R * 특정한 Arch에 맞는 태그 생성 # export ARCH=arm64 # make tags 태그 path 설정 # vi ~/.vimrc set tags+=/root/tegra/tags

  28. 코드분석 환경설정 • 안드로이드 용 tags 만들기 아이디어 ( cgrep 분석 ) # cd /root/android # source build/envsetup.sh # lunch aosp_flounder-eng # cgrep AudioFlinger // Native 소스에서만 AudioFlinger의 키워드를 검색 해준다. 과연 cgrep은 명령인가? cgrep을 분석 해보면 된다. # vi build/envsetup.sh /cgrep cgrep 검색 아이디어 : find명령을 이용하여 특정 파일을 검색한 결과물에 대한 grep을 통해 패턴매칭을 하고 있다. tags 파일 생성시도 find의 결과물에 대한 ctags 명령으로 tags 파일을 생성 하면 된다. function cgrep() { find . -name .repo -prune -o -name .git -prune -o -name out -prune -o -type f \( -name '*.c' -o -name '*.cc' -o -name '*.cpp' -o -name '*.h' \) -print0 | xargs -0 grep --color -n "$@" }

  29. 코드분석 환경설정 • 안드로이드 용 tags 만들기 Native 태그 만들기 # find . -type f \( -name '*.c' -o -name '*.cc' -o -name '*.cpp' -o -name '*.h' \) -print0 | xargs -0 ctags -a -o c_tags Java 태그 만들기 # find . -type f \( -name '*.java' -o -name '*.inc' \) -print0 | xargs -0 ctags -a -o java_tags Asm 태그 만들기 # find . -type f \( -name '*.s' -o -name '*.S' \) -print0 | xargs -0 ctags -a -o asm_tags 생성된 태그 파일 우선 순위 정하기 # vi ~/.vimrc set tags+=/root/android/c_tags set tags+=/root/android/asm_tags set tags+=/root/android/java_tags

  30. 코드분석 환경설정 • ctags 사용하기 정의로 이동 : g+] 돌아오기 : ctrl+t 경우 1. 키워드가 많을 경우는 해당 선언부를 찾은 경우 q를 눌러서 선택 창으로 이동후 번호를 입력 하면 됨 경우 2. 키워드가 없고 해당 파일을 수정 할 수 없다면 : tj SurfaceFlinger task_struct inode 38 struct inode { 주의사항 : 반드시 저장후 이동 해야 함 :w

  31. 코드분석 환경설정 • 도움말 보기 # man printf # man 3 printf # man 2 open section 1 : 명령어 systemcall 2 : open, read, write, close library 3 : glibc , printf, scanf printf : !man 3 printf 도움말 보기 단추키 : 3K

  32. Kernel Programming • kernel system call 추가 절차를 이해한다. • kernel 모듈 프로그래밍 작성 과정을 이해한다. Kernel system call 추가 Kernel compile Kernel module programming

  33. 커널 진입점 ( trap ) • trap : an asynchronous software event IVT 0 div_by_zero() invalid_opcode() overflow() segment_fault () page_fault () …. 1 2 3 4 clock() nmi() tty_intr() disk_intr() net_intr() …. 20 21 22 23 24 80 system_call() ….

  34. 커널 진입점 ( System Call ) • system call : an example of trap Kernel sys_call_table (sysent[]) IVT trap 0 div_by_zero() invalid_opcode() overflow() segment_fault () page_fault () …. 0 sys_no_syscall() sys_exit() sys_fork() sys_read () sys_write () …. 1 1 2 2 sys_fork() 3 3 4 4 sys_read() system_call() 80 system_call() …. 47 sys_getpid() …. 255 sys_no_syscall()

  35. 커널 진입점 ( System Call ) • invoke system call Kernel process sys_call_table (sysent[]) main() { …. fork() } IVT 0 div_by_zero() in_opcode() overflow() seg_fault () page_fault () …. 0 sys_no_sys() sys_exit() sys_fork() sys_read () sys_write () …. 1 1 2 2 sys_fork() libc.a 3 3 4 4 sys_read() …. fork() { …. movl $2, eax trap $80 …. } …. read() { … } 80 system_call() …. 47 sys_getpid() …. 255 sys_no_sys()

  36. Kernel System Call • 시스템 콜 원리 fork(); syscall(__NR_clone ); mov 20(%esp),%eax int $0x80 ------------ ----------- (*system_call[eax])() sys_clone(); do_fork(); fork(); mov 2, eax int 80h ------------ ----------- (*system_call[eax])() sys_fork(); do_fork(); /root/android/bionic/libc/arch-x86/bionic syscall.S

  37. Kernel System Call • 시스템 콜 원리 fork(); mov r0, r1 swi #0 ------------ ----------- (*system_call[r0])() sys_fork(); do_fork(); /root/android/bionic/libc/arch-arm/bionic syscall.S

  38. Kernel System Call • 시스템 콜 원리 fork(); mov x0, x1 svc #0 ------------ ----------- (*system_call[x0])() sys_fork(); do_fork(); /root/android/bionic/libc/arch-arm64/bionic syscall.S

  39. Kernel System Call • 시스템 콜 추가 1. 커널 시스템 콜 테이블에 함수 포인터 추가 # cd /root/tegra/include/uapi/asm-generic # vi unistd.h __SYSCALL(255, sys_my_syscall) // 다음 부분을 소스에 추가 2. syscall.h 파일에 시스템 콜 선언부 추가 # cd /root/tegra/include/linux/syscall.h asmlinkage void sys_my_syscall(void) // 다음 부분을 소스에 추가 3. 추가된 사용자 시스템 콜 구현 # cd /root/tegra/kernel # vi my_test.c #include <linux/kernel.h> asmlinkage void sys_my_syscall(void) { printk("sys_my_syscall()\n"); }

  40. Kernel System Call • 시스템 콜 추가 4. 커널 빌드 시스템(Makefile) 에 작성된 소스 추가 # vi Makefile obj-y = fork.o exec_domain.o panic.o printk.o \ cpu.o exit.o itimer.o time.o softirq.o resource.o \ sysctl.o sysctl_binary.o capability.o ptrace.o timer.o user.o \ signal.o sys.o kmod.o workqueue.o pid.o task_work.o \ rcupdate.o extable.o params.o posix-timers.o \ kthread.o wait.o sys_ni.o posix-cpu-timers.o mutex.o \ hrtimer.o rwsem.o nsproxy.o srcu.o semaphore.o \ notifier.o ksysfs.o cred.o \ async.o range.o groups.o lglock.o smpboot.o my_test.o

  41. Kernel Compile • 커널 컴파일 # cd /root/tegra 크로스 컴파일러 패스 및 환경 설정 # cat /root/.bash_profile export ARCH=arm64 export CROSS_COMPILE=aarch64-linux-android- export TARGET_PREBUILT_KERNEL=/root/tegra/arch/arm64/boot/Image.gz-dtb cd /root/android source build/envsetup.sh lunch aosp_flounder-eng cd /root 타겟보드에 맞도록 config 설정 # make flounder_defconfig configuration written to .config 커널이 모듈을 지원하도록 config를 바꿔준다. # make menuconfig [*] Enable loadable module support ---> [*] Forced module loading [*] Module unloading [*] Forced module unloading 저장 후 나옴

  42. Kernel Compile • 커널 패키징 # make 안드로이드의 boot.img 만들기 # cd /root/android # make bootimage Target ram disk: out/target/product/flounder/ramdisk.img Target boot image: out/target/product/flounder/boot.img 부트 로더로 재부팅 : power key + volume down 키를 동시에 누른다. ( 재부팅 될때 까지 ) 재부팅 되면 fastboot 모드를 선택한다. USB 2.0으로 보드 연결 # fastboot devices 장비가 출력이 안될경우 : virtualbox의 usb장치에서 HTC 를 선택 HT4ANJT05998 fastboot 보드에 업로드 # fastboot -w flashall

  43. Kernel System Call • 시스템 콜 App 만들기 # vi Android.mk LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := myapp LOCAL_SRC_FILES := myapp.c include $(BUILD_EXECUTABLE) # cd /root/android/ # mkdir my_test # cd my_test # vi myapp.c #include <unistd.h> #include <sys/syscall.h> int main() { syscall(255); return 0; }

  44. Kernel System Call • 시스템 콜 App 실행 # mm # adb push /root/android/out/target/product/flounder/system/bin/myapp /data 타겟보드에 접속 후 실행 # adb shell # cd # ./myapp # dmesg | grep sys_my_syscall sys_my_syscall()

  45. Kernel module programming • 커널 소스 패치시 단점 • 리눅스는 모놀리틱( monolithic ) kernel • 커널 소스 변경시는 재컴파일이 필요하다. • 커널에 소스를 추가 했을 시는 커널의 이미지 크기가 증가한다. • 커널의 이미지 교체후 시스템 재부팅이 필요하다. • 커널 모듈 프로그램: Linux Kernel에 micro kernel의 장점 도입 • 커널내에는 꼭 필요한 기능만을 구현한다. • 커널의 이미지를 작게 유지 할 수 있다. • 필요한 경우 모듈로 컴파일 하여 커널에 링크 시킨다. • 커널을 재컴파일 하거나 재부팅 할 필요가 없다. • 커널의 드라이버 및 콤포넌트를 빠르게 개발 할 수 있다. 예: 각종 드라이버 처음 개발시 사용

  46. Kernel module programming • 커널 모드에 접근 하는 절차 • 1. system call table 수정 • 2. 선언부 추가 • 3. system_call 구현 • 4. 커널 빌드 시스템에 추가 • 5. 커널 빌드 • 6. 안드로이드 프레임워크에서 boot.img로 빌드 • 7. boot.img flash write • 8. 재부팅 • 9. system call 호출 • 모듈로 개발시 ( linux (micro 커널)의 특성을 이용 ) • 1. 모듈 작성 • 2. 모듈 컴파일 • 3. 타겟보드에 실행

  47. Kernel module programming # cd /root/android/my_test # vi Makefile obj-m = module_1.o default: make -C /root/tegra SUBDIRS=/root/android/my_test/01_day modules # vi module_1.c 타겟 보드에 업로드 # adb push module_1.ko /data 모듈 테스트 # adb shell root@flounder:/ # cd root@flounder:/data # lsmod root@flounder:/data # insmod module_1.ko root@flounder:/data # lsmod module_1 883 0 - Live 0x0000000000000000 (PO) root@flounder:/data # dmesg <4>[ 7097.537204] init_module() root@flounder:/data # rmmod module_1.ko root@flounder:/data # dmesg <4>[ 7234.842008] cleanup_module() #include <linux/module.h> #include <linux/kernel.h> int init_module(void) { printk("init_module()\n"); return 0; } void cleanup_module(void) { printk("cleanup_module()\n"); }

  48. Kernel module programming module_1.c 의 문제점 : 아래와 같이 모듈 라이선스 문제가 발생 한다. module_1: module license 'unspecified' taints kernel. 이는 단순한 라이선스의 경고가 아니라 필수 커널 함수를 호출 할 수 없게 된다. 아래와 같이 외부에 알려진 함수는 모듈에서 사용 가능 하다. EXPORT_SYMBOL(register_chrdev_region); # cat /proc/kallsyms T register_chrdev_region GPL로 외부에 알려진 함수는 GPL 라이선스를 사용하는 모듈에서만 사용할 수 있다. EXPORT_SYMBOL_GPL(__gpio_get_value); # cat /proc/kallsyms t __gpio_get_value T __gpio_get_value "GPL"

  49. Kernel module programming # vi Makefile obj-m = module_2.o default: make -C /root/tegra SUBDIRS=/root/android/my_test/01_day modules # vi module_2.c 타겟 보드에 업로드 # adb push module_2.ko /data 모듈 테스트 # adb shell root@flounder:/ # cd root@flounder:/data # lsmod root@flounder:/data # insmod module_2.ko root@flounder:/data # lsmod module_2 883 0 - Live 0x0000000000000000 (PO) root@flounder:/data # dmesg <4>[ 7097.537204] init_module() root@flounder:/data # rmmod module_2.ko root@flounder:/data # dmesg <4>[ 7234.842008] cleanup_module() #include <linux/module.h> #include <linux/kernel.h> MODULE_LICENSE("GPL"); int init_module(void) { printk("init_module()\n"); return 0; } void cleanup_module(void) { printk("cleanup_module()\n"); }

  50. Kernel module programming • MODULE_LICENSE 분석 #define __MODULE_INFO(tag, name, info) static const char __UNIQUE_ID(name)[] \ __used __attribute__((section(".modinfo"), unused, aligned(1))) \ = __stringify(tag) "=" info #define MODULE_INFO(tag, info) __MODULE_INFO(tag, tag, info) #define MODULE_LICENSE(_license) MODULE_INFO(license, _license) MODULE_LICENSE("GPL"); MODULE_INFO(license, "GPL") __MODULE_INFO(license, license, "GPL") static const char __UNIQUE_ID(license)[] \ __used __attribute__((section(".modinfo"), unused, aligned(1))) \ = __stringify(license) "=" "GPL"

More Related