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라는 효율적인 관리체계가 생김. kobject
를dentry
의 멤버로 포함시켜 묶어버림. 아래 그림 참조