아래와 같이 각각의 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 ( 빌드 내용)
- Kconfig
그리고, 각각의 설정에는 의미가 있다.
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
- Makefile
$ 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/ .....
- Kbuild
상위 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