레이블이 Linux-Kernel인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Linux-Kernel인 게시물을 표시합니다. 모든 게시물 표시

10/26/2017

Linux Kernel 관련 Manual

Linux Kernel 관련자료

  • Linux Device Drivers, Third Edition 
2.6.10 kernel 이라 오래되었지만, 책이 없을 때 참고.

  1. Chapter 1: An Introduction to Device Drivers
  2. Chapter 2: Building and Running Modules
  3. Chapter 3: Char Drivers
  4. Chapter 4: Debugging Techniques
  5. Chapter 5: Concurrency and Race Conditions
  6. Chapter 6: Advanced Char Driver Operations
  7. Chapter 7: Time, Delays, and Deferred Work
  8. Chapter 8: Allocating Memory
  9. Chapter 9: Communicating with Hardware
  10. Chapter 10: Interrupt Handling
  11. Chapter 11: Data Types in the Kernel
  12. Chapter 12: PCI Drivers
  13. Chapter 13: USB Drivers
  14. Chapter 14: The Linux Device Model
  15. Chapter 15: Memory Mapping and DMA
  16. Chapter 16: Block Drivers
  17. Chapter 17: Network Drivers
  18. Chapter 18: TTY Drivers

  https://lwn.net/Kernel/LDD3/


  • Kernel 분석의 한글자료 
  http://jake.dothome.co.kr/
  https://wiki.kldp.org/KoreanDoc/html/EmbeddedKernel-KLDP/



  • Linux Kernel에 관련된 자료들 
  https://lwn.net/Kernel/
  https://lwn.net/Search/


  • Linux 배포관련 리스트 
  https://lwn.net/Distributions/




  • Migrating/Porting Device Drivers 
  1. Considerations for Porting Device Drivers
  2. Reading and Writing Data from or to User Space
  3. About Handling Access to Shared Resources
  4. About the Bus Model
  5. About Character Device Drivers
  6. About Block Device Drivers
  7. About Network Device Drivers
  8. About USB Device Drivers
  9. About the Sysfs File System
  10. Loading Device Drivers as Kernel Modules

  https://docs.oracle.com/cd/E37670_01/E52461/html/ol_migdd.html



  • Linux Kernel API

  https://www.kernel.org/doc/html/v4.9/driver-api/index.html#


  • Video4Linux Doc

  https://www.kernel.org/doc/html/v4.9/media/v4l-drivers/index.html#
  https://www.kernel.org/doc/html/v4.9/media/media_kapi.html


  • Network 802.11 Driver API

  https://www.kernel.org/doc/html/v4.9/80211/index.html


  • Network drivers 관련자료 
  https://lwn.net/Articles/30107/
  https://docs.oracle.com/cd/E37670_01/E52461/html/ch06s07.html
  https://kldp.org/node/91044

  • Linux Kernel Source 
  https://elixir.bootlin.com/linux/latest/source
  https://www.kernel.org/

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

3/06/2015

HOTPLUG

1. Linux의 HOTPLUG


Hot swap
Hot plug
Cold plug



http://free-electrons.com/doc/udev.pdf
http://blackfin.uclinux.org/doku.php?id=linux-kernel:hotplug
/sbin/mdev

http://git.busybox.net/busybox/plain/docs/mdev.txt

I see the same behaviour with the watchdog device and softdog module

mdev used for hotplugging, echo /sbin/mdev > /proc/sys/kernel/hotplug
/sys/devices/virtual/misc/watchdog


insmod softdog:
/dev/watchdog is added because of hotplugging by mdev, as block device:
brw-rw----  1   root   root  10,130

rm /dev/watchdog, mdev -s:
/dev/watchdog is added as character device:
crw-rw----  1   root   root  10,130

Obviously /usr/sbin/watchdog fails to start in the hotplugging case.

http://creaplz.tistory.com/category/Embedded%20System


http://en.wikipedia.org/wiki/Udev


/proc/sys/kernel/hotplug

http://egloos.zum.com/furmuwon/v/11024586
http://lxr.free-electrons.com/source/lib/kobject_uevent.c?v=3.9

https://wiki.kldp.org/wiki.php/LinuxHotplug
http://git.busybox.net/busybox/plain/docs/mdev.txt
http://lists.busybox.net/pipermail/busybox-cvs/2008-February/026640.html
http://blog.secmem.org/88

http://debian-handbook.info/browse/stable/sect.hotplug.html

/sbin/hotplug

http://www.bangmoney.org/presentations/hotplug/
http://wiki.openwrt.org/doc/techref/hotplug
****
http://forum.falinux.com/zbxe/index.php?document_srl=551671&mid=lecture_tip


           CONFIG_HOTPLUG=y
           CONFIG_UEVENT_HELPER_PATH=""
           CONFIG_NET=y
           CONFIG_UNIX=y
           CONFIG_SYSFS=y
           CONFIG_SYSFS_DEPRECATED*=n
           CONFIG_PROC_FS=y
           CONFIG_TMPFS=y
           CONFIG_INOTIFY_USER=y
           CONFIG_SIGNALFD=y
           CONFIG_TMPFS_POSIX_ACL=y (user ACLs for device nodes)
           CONFIG_BLK_DEV_BSG=y (SCSI devices)

http://hoonycream.tistory.com/entry/udev
http://debian-handbook.info/browse/stable/sect.hotplug.html
http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/HOTPLUG-UDEV.txt

ttySAC0 ~ 3은 console device

http://egloos.zum.com/codenakseo/v/4582439



처음 접할때,  확인사항 KERNEL 의 현재 ARCHTYPE,

vi ./include/generated/mach-types.h

MACH_TYPE_

#ifdef CONFIG_ARCH_IXDP425
# ifdef machine_arch_type
#  undef machine_arch_type
#  define machine_arch_type     __machine_arch_type
# else
#  define machine_arch_type     MACH_TYPE_IXDP425
# endif
# define machine_is_ixdp425()   (machine_arch_type == MACH_TYPE_IXDP425)
#else
# define machine_is_ixdp425()   (0)
#endif