5/17/2015

Kernel 설정 및 기본구성

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  ( 빌드 내용)


  • Kconfig
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


  • Makefile 
아래와 같이 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/
.....


  • Kbuild
주로 강제로 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