2010/09/12

mini howto : registering sysfs node

device structure와 kobject structure를 이용해 device에 sysfs node를 등록할 수 있으며, device structure가 있다면 주고 받는 data의 size가 작을 경우에 사용하기 쉽고, kobject structure를 이용하면 data의 size가 커서 buffering등을 해야할 경우에 사용하면 좋다.

  • 주고받을 data size가 작을 경우
device/base/core.c 에 정의되어 있으며 prototype은 include/linux/device.h에 있다. 하지만, code가 include/linux/kernel.h나  include/linux/module.h를 include하고 있다면 굳이 헤더파일을 추가하지 않아도 된다.
DEVICE_ATTR()을 이용해 관련 structure를 생성해 주고, device_create_file()을 이용해 sysfs를 등록해주며, device_remove_file()을 이용해 제거해 준다.

_name : device의 이름을 넣어주며 추후에 이 값을 기반으로 dev_attr_[name]이 생성된다.
_mode : unix에서 사용되는 mode와 같은 의미이다.
_show와 _store : show와 store의 operation시에 실행되는 함수 pointer를 아래와 같이 등록한다.
둘다 count 를 return하게 되는데, xxxx_store에서는 입력 받는 count argument를 적절히 사용하면 되고, 받은 값 그대로 return해주면 된다. 반면에, xxxx_show는 입력 받은 count argument를 적절히 사용하고 사용한 만큼을 return해주어야 한다. 이것이 지켜지지 않게 되면, 내부적으로 관리되는 data buffer등에 문제가 생기게 된다.

  • 주고받을 data size가 클 경우
kobject를 이용해 file과 같이 buffering이 필요한 덩치큰 data들은 아래와 같이 등록된 sysfs node를 이용한다. MAX_BUF의 size만큼의 단위로 buffering이 여러번 되며 .read, .write, .mmap등에 연결된 function이 그 횟수만큼 불려지게 된다. 따라서 아래와 같은 방식으로 buffering을 고려해야 한다.

No comments:

Post a Comment