这是《Linux Device Drivers, Third Edition》的读书笔记。
2.7 初始化与关停
__init
告诉内核该函数只在初始化时用,用完即丢弃。同理还有__initdata
,代码如下:
static int __init initialization_function(void) {
/* Initialization code here */
}
module_init(initialization_function);
goto
在内核中作为错误处理的惯用用法,示例如下:
int __init my_init_function(void)
{
int err;
/* registration takes a pointer and a name */
err = register_this(ptr1, "skull");
if (err)
goto fail_this;
err = register_that(ptr2, "skull");
if (err)
goto fail_that;
err = register_those(ptr3, "skull");
if (err)
goto fail_those;
return 0; /* success */
fail_those:
unregister_that(ptr2, "skull");
fail_that:
unregister_this(ptr1, "skull");
fail_this:
return err; /* propagate the error */
}
- 内核错误码
内核错误码用负数表示,在
linux/errno.h
中,模块代码需要用适当的已定义的错误码。这样用户层代码可用类似perror
显示其意思。 - 模块参数
3.4 几个重要的结构体
- struct file_operate
- struct file
- struct inode
- struct cdev