发布时间 : 星期一 文章linux课程设计指导文档更新完毕开始阅读b08d5cda7f1922791688e89f
my_major=result;
printk(\
printk(\ printk(\ printk(\ printk(\ } return 0; }
static void __exit my_exit(void){
unregister_chrdev(my_major,\ printk(\}
my_init 用于注册设备,获得设备的主设备号
调用register_chrdev(0,“sky_driver(设备名)”,&my_fops); my_exit 用于注销设备
调用unregister_chrdev(my_major, “sky_driver(设备名)”); 然后在程序尾再调用这两个函数 Module_init(my_init); Module_exit(my_exit) MODULE_LICENSE(“GPL”); 2. 编译
(1) 将设备驱动源文件复制到/usr/src/linux/drivers/misc/usr/src/linux指的是源代码路径)
(2) 修改Makefile,只要一句即可:obj-m +=sky_driver.o
下(这里的
23
(3) 编译
在/usr/src/linux/drivers/misc路径下执行 Make -C /usr/src/linux SUBDIRS=$PWD modules 如果编译成功将得到.ko文件
注意:此步编译过程中必须没有错误或者任何的警告,否则必须对错误和警告信息提示的位置进行修改,然后重新编译,直到没有任何错误或者警告(warning)为止。
3. 挂载内核中模块
命令:insmod ./sky_driver.ko
此时 cat /proc/devices或dmesg会看到在字符设备中有254 sky_driver。前面的是系统分配的主设备号,后面是设备注册名。
在my_init函数中注册新的字符设备,所用系统调用是 Register_chrdev(0,”sky_driver”,&my_fops);
函数中第一个参数是告诉系统,新注册的设备的主设备号由系统分配, 第二个参数是新设备注册时的设备名字, 第三个参数是指向file_operations的指针,
执行该命令后调用dmesg|tail 会看到在my_init中写到的提示信息。
insmod 时出现 \的可能原因:
如果你modprobe自己编译的内核模块时出现:Invalid module format,那很有可能是以下原因引起的:
所用内核源码版本号与目前使用的内核不同; 编译目标不同,比如编译的是i686,装好的是i386; 使用编译器版本不同;
目前使用的内核不是自己编译出来的。
参考文献:http://blog.csdn.net/hecant/archive/2007/10/31/1859606.aspx
24
4. 创建新的虚拟设备文件
命令:mknod /dev/sky_driver C 254 0
在此命令中,第一个参数是新建设备文件的地址和名字,第二个参数是指创建的是字符设备文件,第三个参数是主设备号,第四个参数是从设备号。
执行成功会在/dev中看到一个新的设备文件sky_driver. 5. 测试新的设备驱动 编写测试程序 6. 卸载操作 删除模块
命令:rmmod sky_driver 删除新增的字符设备文件 命令:rm /dev/sky_driver
本部分参考文献:
http://blog.csdn.net/sabalol/archive/2008/02/01/2076610.aspx http://www.knowsky.com/340884.html
25
第4章 问题4以及相关知识
4.1. 实现原理
用户和应用程序可以通过/proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息是动态改变的,所以用户或应用程序读取proc文件时,proc文件系统是动态从系统内核读出所需信息并提交的。
我们要显示系统信息,只需进行相应的文件操作。首先打开相应的文件,读取所需要的信息,将其写入一个缓冲区中,然后将缓冲区的内容加到Gtk的相应的控件上面去,最后将控件组合显示即可。
4.2. 实现方法
由于要以图形界面来实现,要用到Linux的图形库Qt或者是Gtk,本例中使用QT.
(1)
CPU信息:
使用cat /proc/cpuinfo你可以查看系统的内存信息
由上图可知所需的信息所在文件中的位置,然后将其写入缓冲区,加载到QT
26