这里先完成作业,下一篇记录我遇到的问题和解决的方法。
1.什么是字符设备?
LDD3是这么说的:字符设备 能够像字节流一样被访问的对象,由字符设备驱动程序来实现这种特性,通常至少要实现open, close, read, write系统调用。
我是这样理解的,与块设备的区别是一次性操作的数据更小,适合与少量的数据操作。
2. 次设备号,通过什么途径传递给驱动模块代码使用的?
关于主设备号与次设备号:
主设备号标识设备对应的驱动程序 ,次设备号由内核使用,用于正确确定设备文件所所指的设备。我的理解是,主设备对应了哪一种设备,这种设备决定只能用那个驱动程序。而次设备就是对应的哪一个设备,决定内核通过驱动程序使用哪个确定的设备。
怎么实现的呢?
我是这么理解的,cdev_add (struct cdev *dev, dev_t num, 1);把整个设备编号告诉了内核,确定要使用哪个设备。(我暂时是这么理解的,可能有错误,我也是新手 呵呵 )
3. mknod 建立设备节点的使用方法?
当insmod scull.ko后,/proc/devices会有一个scull的字符设备,可以看到这个scull的主设备号,然后mknod /dev/scull c 250 0就可以在/dev目录下建立scull ,这个设备应该就是第二章的inode结构,记录了设备编号和字符设备的内核的内部结构。
4.驱动中是怎么注册字符设备的?
差不多就是insmod作了哪些工作吧,实际上它依赖于定一起在kernel/module.c中的一个系统调用。函数sys_init_module给模块分配内核内存,然后系统调用将模块正文复制到内核区域,并通过内核符号表分析模块中的内核引用,最后调用模块的初始化函数。其余的交给模块驱动程序了。
5. 字符设备的file_operations包括那些成员函数指针?
书上有,最好还是看看内核源码。(介绍一个我经常用的网站,从一牛人那儿学的 呵呵 http://lxr.linux.no)
6.第六点以作业形式交给应公。