본문 바로가기
[Developer]/Android

Linux4Android 1st Afternoon

by 해피빈이 2010. 11. 9.

Linux에서는 ANSI를 이용한다.

ISO/C89 /C99(2003)

cfags-kr.pdf

 

리눅스 커널의 라이센스버전은 GPL v2이다.

Cent OS

Redhat OS

 wow linux

whiteboxlinux.org -> anaconda

 

monolithic kernel의 종류

- bzImage -> bzip2

- zImage -> gzip

 

커널모듈은 커널의 일부분이지만 종종 사용할 장치관련 소스를 zImage안에 넣지 않고 필요에 따라 저장매체에서 동적으로 로딩.

ex) device driver, filesystem type, network protocol, network 기능.

 

kernel thread

  1. 커널 내의 주기적인 작업 - 시간 : 1~2초
  2. 사용자 space thread에 대한 커널 내부 자료구조

    1. NPTL - Native posix thread model)
    2. NGPT(min)

http://people.redhat.com/drepper/nptl-design.pdf

 

PID -> 2~800번까지는 zImage안에 있는 내용이다.

 

IPV6을 정부에서 밀고 있다. TTA인증

rfc -> ipv6-ready.org -> www.tahi.org

 

Embedded Linux의 부팅 기법

1) Nor

2) Nand

3) nfs

4) SD

5) ramdisk....

 

보통 커널은 최신 커널을 쓰는 것이 좋은 것이 아니라, 안정이 검증된 커널을 쓰는 것이 좋다. 너무 오래된 커널을 쓰면 커뮤니티의 지원을 받기 어려운 특징이 있다.

부트로더 : 512~256K

커널 : 1.6M ~ 2.2M

(안드로이드 커널) : 34~50M

jffs2는 압축을 한다. 따라서 용량은 작아진다. 하지만 부팅시 압축을 풀어야하기 때문에 시간이 좀 더 걸린다.

yaffs2는 압축을 안한다. 그래서 부팅시 바로 로드하기 때문에 빠르다.

 

module-init-tools(busybox)

device driver -> module(.ko) programming

      module -> (lsmod, insmod, rmmod, depmod, mbdprobe, modinfo)

 

 .ko -> Kernel Object의 약어이다.

 

Task는 Kernel code라고 이해하면 된다. CPU는 run Queue가 주어진다.(active와 expired로 분류)

 

Preemptive Scheduling Policy

  1. FIFO : 완전선점
  2. RR(Time slice기반 선점형)

 

  1.  dev node (device file)
  2. 16 bit

    1. /dev/   ex) /dev/file
    2. file operations      c(device type) rw-rw-rw(permission) l(hard linic) root root 253 0 file
      ** device type : c - character, b - block, s - socket, l - symbolic link, p - named type, d - dir
  3. register_chrdev_region(253,"char1", cfops);
    class

 

 KConfig - Kernel Configuration Language

# make menuconfig(ncurses)

 

 /dev/file을 생성할 때에는

mknod를 사용해서 만들려고 하지 말고, 자동생성기법을 사용하여 만들도록 하자.

 

ftp://ftp.kernel.org/pub/linux/kernel/

http://lxr.linux.no

커널관련 소스보기. 2.6.36의 Documentation으로 가면됨.

 

 커널 튜닝 및 분석 문서(주요 문서 체킹)

RCU(Read Copy Update) -> 이것이 커널 성능을 업데이트시키는 것이다.

driver-model(Unified Device Modelling)

video4linux

sysctl(/proc/sys/kernel, vm, net, fs 디렉토리) == 파일의 수치값을 수정해서 성능을 개선할 수 있다. == /etc/sysctl.conf 파일(현재 안드로이드에는 없다) == 안드로이드에서는 init.rc 파일의 내용을 수정.

kernel-parameters.txt (커널 부팅시에 부트 argument에 parameter를 전달 = u-boot에서 bootargs에 parameter 전달)

 

부팅

1) P/W

2) u-boot

3) kernel (quiet를 쓰면 printk();를 disable시킬 수 있으며 이로 인해 속도향상이 어느정도는 나올 수 있다)

4) init

5) Android

 

 kobject.txt, kref.txt, kset, class, platform_device, platform_driver, device, driver

: 위의 파일들은 꼭 참고하도록 하자.

 

동기화 기법

memory-barriers.txt (메모리 장벽)

= wait queue, work queue, completion, linked list

= tasklet, softirq, atomic, bit operations...

= semaphore, mutex, spinlock, bit operations

 

kernel-panic

= oops - S/W panic, oops-tracing.txt

= Aiee - H/W panic

= 통칭해서 Call trace

 

devices.txt = kernel에서 지원되는 디바이스의 종류, 디바이스의 major, minor 정보들 = linux-2.6/include/linux/major.h (char, block device)

 = /proc/devices

 

/arch/arm/kernel/call.S

sys_ni_syscall

/lib/libc.so -> 이 안에 system call number, return type, argument numbers, type이 들어있다. (open, close, fork, read 등이 들어있다.)

 

** Device driver관련 한빛미디어 책을 권장한다.

 

kldp.org의 맨 오른쪽 wiki로 가면 문서가 나온다. 거기서 리눅스 커널 선택. 그 중에서 임베디드 시스템 개발자를 위한 리눅스 커널(남상규)을 보면 도움이 된다.

 

pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);

 

Header file 위치

  1. /usr/include      : x86용 사용자 헤더
  2. /opt/S5pc1xx/usr/include      : arm용 사용자 헤더
  3. linux-2.6/include         : kernel용 헤더

 

/ipc 에 구현되어 있는 것

  • semaphore
  • shared memory
  • message queue

 

가상메모리 /mm

이것은 virtual address 기반이다. swapping과는 다르다.

 

memory 관리 측면에서

2.4 커널에서는 one-way mapping만 사용했었다.

2.6 커널에서는 reverse mapping도 사용한다.(rmap)

 

이 글은 스프링노트에서 작성되었습니다.

반응형

댓글