Ubuntu内核源码:
在synaptic里面搜索linux-source,找到和你内核版本相同的source,然后安装。
gcc对数据长度的不匹配相当敏感,它会针对可能的问题发出警告。
insmod module.o 插入模块 需要超级用户权限
syslogd /etc/syslog.conf
dmesg | tail
lsmod
rmmod module.o
内核模块初始化过程中的错误处理
错误处理有时使用goto语句比较 有效。通常情况下我们很少使用goto,但在处理错误时(可能是唯一的情况)它却非常有用 。错误情况下的goto仔细使用可避免大量复杂的高度缩进的结构化逻辑。因此,内核经常使用goto来处理错误。
不管初始化过程在什么时刻失败,下面的例子(使用了虚构的注册和撤销注册函数)都能正常工作:
int __init my_init_function(void)
{
int err;
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;
fail_those: unregister_that(ptr2,"skull");
fail_that: unregister_this(ptr1,"skull");
fail_this: return err;
}
想想看,假如没用goto,需要多少if .. else... 语句才能利用标志来确定这复杂的逻辑,更何况实际情况往往比这更复杂,goto 语句提供了一个优雅的解决方案,使得我们的代码简洁高效。在追求效率的代码中使用goto语句仍然是最好的处理错误的机制。
file 与FILE的区别:
struct file 是一个内核结构,它不会出现在用户程序中
FILE 在C库中定义且不会出现在内核代码中。
在GNU C中允许使用冒号:为特定的结构体成员定义初始值,其他成员值为0,
在Linux 2.6内核中,建议使用C99标准初始化结构体
static struct file_operations s3c2410_fops={
.owner = THIS_MODULE,
.open = s3c2410_DbLed_open.
.write = s3c2410_DbLed_write,
.release = s3c2410_DbLed_release,
}