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~2초
-
사용자 space thread에 대한 커널 내부 자료구조
- NPTL - Native posix thread model)
- 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
- FIFO : 완전선점
- RR(Time slice기반 선점형)
- dev node (device file)
-
16 bit
- /dev/ ex) /dev/file
- 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
- register_chrdev_region(253,"char1", cfops);
class
KConfig - Kernel Configuration Language
# make menuconfig(ncurses)
/dev/file을 생성할 때에는
mknod를 사용해서 만들려고 하지 말고, 자동생성기법을 사용하여 만들도록 하자.
ftp://ftp.kernel.org/pub/linux/kernel/
커널관련 소스보기. 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 위치
- /usr/include : x86용 사용자 헤더
- /opt/S5pc1xx/usr/include : arm용 사용자 헤더
- 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)
이 글은 스프링노트에서 작성되었습니다.
'[Developer] > Android' 카테고리의 다른 글
Linux4Android 2nd Afternoon (0) | 2010.11.10 |
---|---|
Linux4Android 2nd Morning (0) | 2010.11.09 |
Linux4Android 1st Morning (0) | 2010.11.08 |
getSystemService()의 강력함. (0) | 2010.04.07 |
모토로이 등 일반 안드로이드 폰에 직접 apk 설치 방법 (0) | 2010.02.17 |
댓글