Kernel tuning
- linux-2.6/Documentation/kernel-parameters.txt
- /proc/sys/kernel/*
/sysctl/....vm, net - 커널패치=> kernel.org/pub/libux/kernel/people/*
mingo.... mcp - 소스 수정(좀 안다면..)
동기화, 커널 내부구조
kernel.org 에 있는 파일을 수정하면 안된다. 이것을 수정한다고해서 절대로 성능이 좋아지지 않는다.
리누스토발즈는 안정성을 가장 우선으로 따지고 이끌어가고 있다.
ftp.redhat.com -> ..... /RHEL/linux-kernel-2.6.....src와 rpm이 있다.
cat /proc/sys/kernel/modprobe를 해보면, /sbin/modprobe가 이 안에 들어있는 것을 볼 수 있다.
ARM EABI - 활성화 되어있으면 물리적으로 커널에는 float pointing 연산이 되지 않으나, 이것을 가능하게 한다. 멀티미디어에서는 실수연산이 필요하기 때문에 이 기능을 켜면 좋다.
udev는 User Device File System - device driver - 이라는 뜻이다. 이것은 커널과 통신시 netlink를 사용한다.
Networking 세팅때에는 TCP/IP는 꼭 들어가야 한다.
netfilter.org를 참고하자.
iptables를 쓰면 쓸데없는 패킷은 필터링시킬 수 있다.
- make menuconfig로 옵션 설정
- linux-2.6/.config 옵션 내용이 들어가있다. 이 곳에는 옵션 활성화/비활성화 내용만 들어있다.
-
이것을 다 하면 make, make zImage를 한다.
- 이렇게 하면 컴파일러 체크, 버전 체크(Makefile안에 버전 정의, include/linux/version.h내용 참조)를 먼저 실행하고
- .config를 이용하여 linux-2.6/include/linux/autoconf.h
- 컴파일 진행. .config와 autoconf.h, version.h를 읽어서 해당 Makefile과 매치.
이렇게 하면 커널 바깥에 대한 설정을 할 수 있는 것이다.
arch/arm/KConfig안에 보면....
config ARM (옵션 심볼은 항상 대문자로)
.config
CONFIG_MMU=y
CONFIG_GENERIC_HARDIRQ=y
이곳에서 Spinlock과 Semaphore는 커널에서 중요한 동기화 기법이다.(둘의 차이는 wait queue의 사용여부이다.)
<< 커널 컴파일!>>
- zImage 컴파일
make zImage
make modules;make modules_install(이것은 embedded 커널 컴파일할땐 쓰지 마라. 잘못되면 PC의 커널을 덮어쓰는 경우가 있다.) -
컴파일된 커널의 위치
arch/arm/boot/ 디렉토리에 위치한다.arch/arm/boot/compressed/ 이 밑의 파일을 봐야 한다.
arch/arm/boot/Makefile에 추가해 놓으면 tftpboot로 복사를 자동으로 할 수 있으니 편하다.
-> cp -f arch/arm/boot/zImage /tftpboot
- mach-s5pc100 수정해보자.
- 출력이 잘 안되면 /kernel 밑에 printk.c파일을 보자.
- /init 밑에 가서 main.c파일을 확인하자. do_mounts.c파일도.
- /lib 아래에서는 kobject.c가 중요하다. device model에서 중요하게 쓰인다. .ko가 만들어지는데 영향을 준다. 이곳에서 손댈일은 별로 없지만, 참고하고 볼 줄은 알아야 한다.
그리고 이곳에서 kernel_lock.c 파일도 참고하자. 동기화에 관련된 내용이 이 안에 들어있다. - /fs에서 device driver를 위해 필요한 것은 block_dev.c, char_dev.c 파일이다. 이유는 filesystem 밑에 driver가 있기 때문이다.
- char_device_struct 구조체를 기억하자.
- /net
uc-os2에 lwip, uIp를 올려서 사용한다. TCP/IP의 축소판. - /arch/arm/include/asm/param.h에 들어가서 HZ에 대한 define을 수정해야 한다. 100으로 default되어 있다면 1000으로 수정해보자.
- /kernel/timerconst.pl 파일을 열어보면 최대 HZ에 대한 정의가 되어 있다. 이것을 참고해서 올리면 된다.
<<S5PC100 커널의 구조>>
- arch/arm/plat-s5pc1xx 안을 보자.
- 커널이 올라가는 메모리의 위치 : arch/arm/mach-s3c2410/Makefile.boot
Kernel parameter tag를 이용해서 올라간다.
이 파일은 커널 컴파일시 참조되어 linker에서 linker script를 이용해서 커널 이미지를 만들 때 사용. - System.map 파일을 보면 변수나 함수 symbol의 entry(진입점)를 알 수 있다.
Networking option에서 kernel level autoconfiguration을 쓰는 이유는 하나이다. NFS사용을 위해서이다.
Window쪽 Network device driver가 있을 경우 NDIS Wrapper를 사용하면 Linux에서도 사용할 수 있다.(시간이 부족할 경우)
Sound는 alsa-utils, alsa-lib, alsa-sound를 포함시켜야 한다.
cat /proc/filesystems 로 내용을 확인해봐야 한다.
USB Garget Drivers가 있기 때문에 eclipse같은 곳에 붙을 수 있는 것이다.
카메라같은 경우에는 커널에서 지원하는 센서를 쓰면 쉽게 잡을 수 있다.(원래는 좀 어렵다.)
리눅스에서 메모리관리하는 기법이 하나는 paging이고 다른하나는 slab이다.
MODULE_LICENSE("GPL");이 없으면 나중에 kernel이 오염되어 있다고 오해를 할 수 있다.
리눅스는 socket을 열 수 있는 갯수는 파일을 열 수 있는 갯수와 동일하다.(커널에서 결정할 수 있다.)
<<커널의 이미지 구조>>
head.S | [arch.S] | misc.c | (head.S) piggy.gz
↘arch/arm/boot/compressed ↘arch/arm/kernel/head.S
firmware | OS
이 것을 통들어서 zImage에 들어간다.
결국 head.S는 초기화의 기능한다.
또한 misc.c는 압축해제의 기능을 한다.
이 글은 스프링노트에서 작성되었습니다.
'[Developer] > Android' 카테고리의 다른 글
Linux4Android 4th Morning (0) | 2010.11.11 |
---|---|
Linux4Android 3rd Afternoon (0) | 2010.11.10 |
Linux4Android 2nd Afternoon (0) | 2010.11.10 |
Linux4Android 2nd Morning (0) | 2010.11.09 |
Linux4Android 1st Afternoon (0) | 2010.11.09 |
댓글