Kernel API #
--
김도집 2005-09-22 14:20:31
driver_register/device_unregister 함수에서 사용하는 자료형은 <linux/device.h>에 선언되어 있다.
struct device_driver {
const char *name;
struct bus_type *bus;
struct completion unloaded;
struct kobject kobj;
struct klist klist_devices;
struct klist_node knode_bus;
struct module *owner;
int (*probe) (struct device *dev);
int (*remove) (struct device *dev);
int (*shutdown) (struct device *dev);
int (*suspend) (struct device *dev, pm_message_t state, u32 level);
int (*resume) (struct device *dev, u32 level);
};
필드 | 설명 |
name | 디바이스 드라이버의 이름을 문자열 형으로 지정한다 (필수) |
bus | 보통은 &platform_bus_type으로 지정한다 (필수) |
unloaded | |
kobj | 내부적으로 드라이버 객체를 관리하기 위한 것으로 직접적으로 사용하지 않는다 (임의 지정하지 않는다) |
klist_devices | |
knode_bus | |
owner | |
probe() | 디바이스의 초기화 루틴이다 (필수) |
remove() | 디바이스가 제거될 때 호출되는 루틴이다 (필수) |
shutdown() | |
suspend() | 절전모드로 들어갈 때 호출된다 (필수) |
resume() | 절점모들 빠져나올 때 호출된다 (필수) |
위 테이블에서 foo()와 같이 ()가 붙은 필드는 함수(포인터)를 의미한다.
1.1.2 driver_register #
버스를 갖는 드라이버를 등록할 때 사용하는 함수이다.
함수의 원형은 다음과 같다:
int driver_register(struct device_driver *drv);
관련함수: driver_unregister
static struct device_driver foo_driver = {
.name = "foo”,
.bus = &platform_bus_type,
.probe = foo_probe,
.remove = foo_remove,
.suspend = foo_suspend,
.resume = foo_resume,
};
static int __init foo_init(void) {
int err;
err = driver_register(&foo_driver);
return err;
}
1.1.3 driver_unregister #
driver_register()를 통해 등록된 드라이버를 해제할 때 사용한다.
함수의 원형은 다음과 같다:
void driver_unregister(struct device_driver *drv)
관련함수: driver_register
메모리 영역은 사용자 영역과 커널 영역으로 나뉜다. 일반적으로 사용자 영역의 경우 page out(swap out)된 경우가 있을 수 있다. 이런 메모리 공간을 커널 영역에서 직접 접근하는 경우 page fault 등이 생길 수 있는데, 커널 공간의 일부 처리 중에는 이러한 것이 문제가 될 수 있다.
반대로 커널 영역의 메모리는 사용자 영역의 프로세스에서 직접 접근할 수 없다.
따라서 서로 다른 영역을 메모리를 접근하기 위해서는 이에 필요한 적절한 API를 이용해야 한다.
사용자 영역의 메모리에 있는 데이터를 커널 영역의 메모리 영역으로 복사할 때 사용하는 함수이다. 이 함수는 아키텍처에 의존적인 함수로 <asm/uaccess.h> 헤더 파일에 선언되어 있다.
unsigned long copy_from_user(void *to, const void __user *from, unsigned long n)
매개변수 | 설명 |
to | 커널 영역의 메모리 주소 |
from | 사용자 영역의 메모리 주소 |
n | 바이트 단위의 데이터 크기 |
성공하면 0을 반환하고 실패하면 0이 아닌 값을 반환한다.
관련함수: copy_to_user
함수 내부적으로 access_ok를 통해 사용자의 메모리 영역을 검사하므로 별도의 access_ok를 호출할 필요는 없다.
unsigend long copy_to_user(void __user *to, const void *from, unsigned long n)
사용자 영역의 데이터를 커널 영역으로 복사할 때 사용한다. 이는 아키텍처 의존적인 함수로 <asm/uacess.h>에 선언되어 있다.
int get_user(void *to, void *from)
커널 영역의 데이터를 사용자 영역으로 복사한다. 이는 아키텍처 의존적인 함수로 <asm/uaccess.h>에 선언되어 있다.
int put_user(void *from, void *to)