1. Kernel의 make 사용법
아래와 같이 각각의 Kernel 압축을 풀거나, Kernel source에 가면 된다.
우선 본인의 Makefile은 보자
$ make help
// kernel Make 명령어를 확인 가능하다 ,
// 요즘은 이것으로 확인하고 하는 것 이 맞는 것 같다.
요즘 커널이 version 3.x 넘어 4.x 사용한다고 하지만, 이전의 Make 명령어들도
아직 잘 동작한다.
다만 ARM에서 사용할 경우 make에 아래와 같은 argument들을 넣어주자.
빌드를 하게 된다면, 아래와 같이 두개를 다 설정
$ make zImage ARCH=arm CROSS_COMPILE=arm_xxx_gcc
Kernel 관련 설정 한다면 ARCH만 설정
$ make menuconfig ARCH=arm
1.1 Kernel Config 설정
ARM을 사용하면 Linux에서 Config들은 는 아래의 위치에 존재하지만 설정은 되어 있지 않다.
$ ls /arch/arm/configs
acs5k_defconfig collie_defconfig imote2_defconfig magician_defconfig nuc950_defconfig realview_defconfig tct_hammer_defconfig
acs5k_tiny_defconfig corgi_defconfig imx_v4_v5_defconfig mainstone_defconfig nuc960_defconfig rpc_defconfig tegra_defconfig
am200epdkit_defconfig davinci_all_defconfig imx_v6_v7_defconfig mini2440_defconfig omap1_defconfig s3c2410_defconfig tisdk_am335x-evm_defconfig
assabet_defconfig dove_defconfig integrator_defconfig mmp2_defconfig omap2plus_defconfig s3c6400_defconfig trizeps4_defconfig
at91_dt_defconfig ebsa110_defconfig iop13xx_defconfig moxart_defconfig orion5x_defconfig s5pv210_defconfig u300_defconfig
axm55xx_defconfig efm32_defconfig iop32x_defconfig multi_v5_defconfig palmz72_defconfig sama5_defconfig u8500_defconfig
badge4_defconfig em_x270_defconfig iop33x_defconfig multi_v7_defconfig pcm027_defconfig shannon_defconfig versatile_defconfig
bcm2835_defconfig ep93xx_defconfig ixp4xx_defconfig mv78xx0_defconfig pleb_defconfig shmobile_defconfig vexpress_defconfig
bcm_defconfig eseries_pxa_defconfig jornada720_defconfig mvebu_v5_defconfig prima2_defconfig simpad_defconfig vf610m4_defconfig
.....
이제 선택하여, 본인의 Kernel Config 를 설정하자 (둘 중 하나로)
$ make davinci_all_defconfig ARCH=arm // .config 생성 /arch/arm/configs/ 찾아 설정 , "make ${PLATFORM}_defconfig"
$ make defconfig ARCH=arm PLATFORM=davinci // .config 생성 /arch/arm/defconfig or /arch/arm/configs/ 에서 찾아 설정
상위에서 설정된 Kernel Config들을 변경해보자. ( .config 설정 변경)
$ make menuconfig ARCH=arm
$ make xconfig ARCH=arm // X window Qt
$ make gconfig ARCH=arm // X window GTK
이제 기반이 되는 Kernel config 는 Kernel Main source의
.config 이며,
아래와 같이 동시에 파일이 존재할 것이다.
아래의 실제 .config의 설정들이 존재한다.
./include/linux/autoconf.h
// 이 파일은 상위 .config가 각각 설정이 y로 저장이 되어있다면, #define으로 변경한 것으로 생각하면된다.
// Kernel version에 따라 위치가 변경될 수 있으니 주의 아래 주소 참고
./include/config/auto.conf
./include/generated/autoconf.h
https://wiki.gentoo.org/wiki/Kernel/Configuration
https://stackoverflow.com/questions/41885015/what-exactly-does-linux-kernels-make-defconfig-do
1.2 make를 이용한 Kernel Image/Module 생성
아래의 명령어로 Linux Kernel을 생성이 가능하다.
$ make vmlinux //ELF 파일인 Linux Kernel vmlinux 생성
$ make zImage or bzImage ARCH=arm CROSS_COMPILE=arm_xxx_gcc
$ make moudles ARCH=arm CROSS_COMPILE=arm_xxx_gcc
$ make modules_install ARCH=arm INSTALL_MOD_PATH=/home/...
상위와 같이 하면 Kernel의 이미지가 생성이 될 것이며, 다만 넣어야만 제대로 동작할 것이다.
vmlinux :
ELF format의 Linux Kernel Image로 실행이 가능한 가장 기본이 되는 파일
항상 중요한 것이 System.map 이며, 이를 확인해서 봐야한다.
zImage or
bzImage:
vmlinux를 strip하고 arch/arm/boot/compressed/ 압축을 푸는 head.x 파일을 넣고,
이 파일을 압축한다.
uImage:
uboot에서 booting 하기위해서 사용하는 Image이며, zImage 기반으로 64byte 헤더를 넣고,
mkimage tool을 이용하여 각 Image의 정보를 넣어준다.
https://linux.die.net/man/1/mkimage
1.3 make를 이용한 Kernel Image 제거
아래와 같이 보면 가장 많이 사용하는 것이 make clean 일 것이다.
config 까지 지우고 싶다면, mrproper를 사용하자.
distclean은 더불어 editor에서 생긴 backup swp 파일 및 patch 모두를 다 지운다.
$ make mrproper // Remove all generated files + config + various backup files
$ make distclean // mrproper + remove editor backup and patch files'
$ make clean // Remove most generated files but keep the config and enough build support to build external modules
2. Kernel의 기본 구성
만약 driver를 만들게 된다면, Kernel의 기본구성 부터 알아야 할 것이다.
Kconfig ( menuconfig 할때 화면 설정)
Makefile ( 빌드 내용)
menuconfig 할때 구성되는 화면이며, 기본구성은 앞에 .config에서 CONFIG_ 제거한 내용과 동일하다.
그리고, 각각의 설정에는 의미가 있다.
depends on : 이 모듈을 실행하려면 필요한 다른 설정
defalut : 기본 설정
tristate : 3개의 모두가 설정 가능 모듈/설정/비설정
bool : 모듈을 제거하고, 설정/비설정
$ vi drivers/usb/Kconfig
....
config USB_EHCI_BIG_ENDIAN_MMIO
bool
config USB_EHCI_BIG_ENDIAN_DESC
bool
menuconfig USB_SUPPORT
bool "USB support"
depends on HAS_IOMEM
default y
---help---
This option adds core support for Universal Serial Bus (USB).
bool
....
if USB
source "drivers/usb/core/Kconfig"
source "drivers/usb/mon/Kconfig"
source "drivers/usb/wusbcore/Kconfig"
source "drivers/usb/host/Kconfig"
source "drivers/usb/renesas_usbhs/Kconfig"
source "drivers/usb/class/Kconfig"
source "drivers/usb/storage/Kconfig"
source "drivers/usb/image/Kconfig"
source "drivers/usb/usbip/Kconfig"
endif
아래와 같이 directory 및 파일을 쉽게 빌드 가능하다.
$ vi drivers/usb/Makefile
obj-$(CONFIG_USB) += core/
obj-$(CONFIG_USB_SUPPORT) += phy/
obj-$(CONFIG_USB_DWC3) += dwc3/
obj-$(CONFIG_USB_DWC2) += dwc2/
obj-$(CONFIG_USB_ISP1760) += isp1760/
obj-$(CONFIG_USB_MON) += mon/
.....
주로 강제로 Makefile을 설정하는 곳으로 Kconfig가 없는 곳에 존재한다.
상위 Makefile 처럼 일정한 규칙을 가지고 있으므로, 이에 맞게 수정해야한다.
Header와 Source 부분을 같이 보자.
$ vi ./include/uapi/linux/Kbuild
header-y += android/
header-y += byteorder/
header-y += can/
header-y += caif/
header-y += dvb/
header-y += hdlc/
header-y += hsi/
header-y += iio/
header-y += isdn/
header-y += mmc/
header-y += nfsd/
header-y += raid/
header-y += spi/
header-y += sunrpc/
header-y += tc_act/
header-y += tc_ematch/
header-y += netfilter/
header-y += netfilter_arp/
header-y += netfilter_bridge/
header-y += netfilter_ipv4/
header-y += netfilter_ipv6/
header-y += usb/
.....
$ vi ./drivers/gpu/drm/nouveau/nvkm/subdev/i2c/Kbuild
nvkm-y += nvkm/subdev/i2c/base.o
nvkm-y += nvkm/subdev/i2c/nv04.o
nvkm-y += nvkm/subdev/i2c/nv4e.o
nvkm-y += nvkm/subdev/i2c/nv50.o
nvkm-y += nvkm/subdev/i2c/g94.o
nvkm-y += nvkm/subdev/i2c/gf117.o
nvkm-y += nvkm/subdev/i2c/gf119.o
nvkm-y += nvkm/subdev/i2c/gk104.o
nvkm-y += nvkm/subdev/i2c/gm204.o
nvkm-y += nvkm/subdev/i2c/pad.o
nvkm-y += nvkm/subdev/i2c/padnv04.o
nvkm-y += nvkm/subdev/i2c/padnv4e.o
nvkm-y += nvkm/subdev/i2c/padnv50.o
nvkm-y += nvkm/subdev/i2c/padg94.o
nvkm-y += nvkm/subdev/i2c/padgf119.o
nvkm-y += nvkm/subdev/i2c/padgm204.o
3. UBOOT와 KERNEL Parameter
상위에 Config를 했지만, 막상 설정을 변경해야하거나, Driver는 존재하지만, 추가적으로 더사용해야 할 경우
Kernel Parameter를 이용하여 쉽게 추가하여 설정 및 Driver를 변경할 수 있다.
대표적으로 많이 사용되는 것이 Filesystem 설정변경 (NFS 설정) , I2C , HDMI ,alsa
아래의 사이트에서 확인을 해보고 본인의 Kernel에서 확인을 해보자
https://www.kernel.org/doc/html/v4.14/admin-guide/kernel-parameters.html