Devices and Modules

four kernel components related to device drivers and device management

Kernel Components

  • Device types
  • Modules
  • Kernel objects
  • Sysfs

Device Types

  • block device
    • 주소지정이가능
    • 블록단위로 운용
    • block device node라는 특별한 파일을 통해 접근
    • HDD등이 예시
  • character device
    • 주소지정이 불가능, stream으로만 데이터 접근가능
    • 키보드 마우스 등
    • character device node라는 특별한 파일을 통해 접근
  • network device
    • physical adapter와 ip같은 프로토콜을 통해 네트워크에 접근하는 기능을 제공
    • socket API라는 인터페이스를 갖고있음
  • Miscellaneous device
    • 간단한 custom driver들을 허용
  • pseudo-device
    • 물리적 device는 없지만 기능적으로 device라고 정의하고 사용하는 것들

Module

  • linux kernel은 동적으로 runtime에 코드의 삽입과 제거가 가능
  • 해당 코드들의 entry point, exit point, data, subroutine들을 묶어놓은 것은 module이라고 함
    • 모듈을 통해 커널은 최소한의 기능을 갖춘 이미지만 들고있을 수 있게 됨
/include/linux/module.h
#define module_init(x)    __initcall(x);
  • MODULE_LICENSE()

    • specify copyright license
    • non-GPL modules cannot provide GPL-only symbols
  • Building Modules

    • kbuild를 이용
    • kernel source tree에 올릴 수도 있지만, 트리 외부의 코드를 build할 수도 있음
    • kernel source tree에 올릴 경우 유지와 디버그가 편리
    Makefile에 추가
    /* it's for an Example when add in kernel source tree */
    
    obj-m += fishing/     /* add new module for compile */
    obj-$(CONFIG_FiSHING_POLE) += fishing/    /* specific config option */
    EXTRA_CFLAGS += -DTITANIUM_POLE        /* for additional C compile flag */
    
    ----------------------------------------------------------------------------
    make modules_install    /* install module */
    insmod fishing.ko        /* loading module */
    modprobe fishing [module params] /* loading module - preferred mechanism */
    rmmod fishing            /* remove module */
    
    ----------------------------------------------------------------------------
    Managing Configuration Options
    
    config FISHING_POLE
          tristate "Fish Master 3000 support"    /* 3-optional selector (y,n,m) */
        default n
        help
          /* in this section, write helpful statements for choosing */
        depends on FISH_TANK    
            /* FISHING_POLE can enable only after FISH_TANK is enabled */
    
    ----------------------------------------------------------------------------
    static int allow_live bait = 1;      /* must declare before make module_param */
    module_param(allow_live_bait, bool, 0644);
    /* module_param(param name, param type, permission option) */
    module_param_named(name, var, type, perm);
    /* 변수이름과 모듈패러미터 이름을 다르게 할 때 이용 */
    

The Device Model

  • device와 그 위상의 표현을 단일 메커니즘으로 제공

  • 적절한 power management를 위해 정확한 device tree를 제공하기 위해 출발

  • kernel object

    /include/linux/kobject.h
    struct kobject {
      const char          *name;        /* name of kobject */
      struct list_head     entry;        
      struct kobject     *parent;    /* parent of kobject */
      struct kset         *kset;        /* collecting related devices */
      struct kobj_type     *ktype;    /* operation func for same type */
      struct kernfs_node  *sd;        /* representation of kobj in sysfs */
      struct kref         kref;        /* reference counter */
    #ifdef CONFIG_DEBUG_KOBJECT_RELEASE
      struct delayed_work release;
    #endif
      unsigned int          state_initialized:1;
      unsigned int         state_in_sysfs:1;
      unsigned int         state_add_uevent_sent:1;
      unsigned int         state_remove_uevent_sent:1;
      unsigned int         uevent_suppress:1;
    };
    
    • 일반적으로 kobject는 다른 구조체에 embedded 되어있다.
    • ktype는 비슷한 kobject들이 하는 기본적인 동작들을 type이라는 형태로 묶어 놓은 것이다. ktype에는 해당 type이 가지는 default operation function들이 포함되어있다.
    /include/linux/kobject.h
    struct kobj_type {
      void (*release)(struct kobject *kobj); /* deconstructor when kref = 0 */
      const struct sysfs_ops *sysfs_ops; /* behaviors of sysfs files on rd/wr */
      struct attribute **default_attrs; /* default attrs associated with kobj */
      const struct kobj_ns_type_operations *(*child_ns_type)(struct kobject *kobj); /* callbacks so sysfs can determine namespaces */
      const void *(*namespace)(struct kobject *kobj);
    };
    
    • kset은 연관된 kobject들을 한 곳에 모아둔 것이다.
  • kobject, kset, subsystem의 연관관계는 다음 그림과 같다.

  • kobject의 생성은 다음과 같이 한다.

    case1. kobject_init() 사용
    
    struct kobject *kobj;
    kobj = kmalloc(sizeof(*kobj), GFP_KERNEL);
    if(!kobj)
      return -ENOMEM;
    /* when using kobject_init, you must make kobject zero */
    memset(kobj, 0, sizeof(*kobj));
    kobj->kset = my_kset;
    kobject_init(kobj, my_ktype);
    -----------------------------------------------------------------------------
    case2. kobject_create() 사용
    
    struct kobject *kobj;
    /* kobject_create do allocating, zeroing, init */
    kobj = kobject_create();
    if(!kobj)
      return -ENOMEM;
    

sysfs

  • kobject의 계층적 구조를 보기 위해 만든 in-memory virtual file system
  • power management를 하기 위해 device model을 만들었는데, 이를 표현하는 kobject가 tree구조를 가지게되면서 부수적으로 sysfs라는 효율적인 관리체계가 생김.
  • kobjectdentry의 멤버로 포함시켜 묶어버림. 아래 그림 참조

results matching ""

    No results matching ""