wordpress新用户站点,网站建设教程学习,wordpress 链接框,网站建Linux内核模块开发(笔记)作者#xff1a;扶凯 来源: 扶凯 时间#xff1a;2011-11-21 00:21:11 人气#xff1a;249 评论#xff1a;0标签#xff1a; 内核个人笔记。。在不放过来都快找不到了。有空还得好好整理一下了。调试方法printk() 是用来调试内核最常用的一种技术…Linux内核模块开发(笔记)作者扶凯 来源: 扶凯 时间2011-11-21 00:21:11 人气249 评论0标签 内核个人笔记。。在不放过来都快找不到了。有空还得好好整理一下了。调试方法printk() 是用来调试内核最常用的一种技术他打印的信息会输出在 dmesg 中所以调试前最好使用 dmesg -c 来清掉以前 dmesg 的信息。 使用的例子如下:printk(KERN_DEBUG Here i am:%s:%d\n, FUNCTION, LINE);可以打印的级别可以看看 linux/kernel.h 中的定义。strace 这个命令超级强大可以显示程序所有的系统调用还可以显示调用时使用的参数。 但这个时候不需要麻烦的配置就可以直接使用但不能象gdb 调试 c 程序一样所以内核为我们提供了一个 kdb 可以支持动态修改变量断点设置单步执行kernel oops messages这是内核开发时常会出现的一个错误信息。主要原因是由于 NULL 指针引用和其它不正常的指针操作引起的。这时 oops 会显示故障时的处理器信息 模块 CPU 寄存器内容页描述符表的位置之类的信息。内核模块简单介绍模块是工作在内核空间的模块实际是目标文件(由函数和数据结构组成)不象普通程序有个链接的过程不能独立运行只能在运行时链接到系统做为内核的一部分运行从面扩展内核功能内核模块会占用内核空间的内存所以会影响内存使用它还会修改内核中的一些内容所以容易造成系统挂掉。在内核中需要维护符号表。并且内核之间有依赖性。最简单的内核模块注如果是 redhat 安装的话需要安装 kernel-devel 才能写内核模块如果是自己编译内核记的不要删除源码不然没法开发模块。放个编译上面模块的 Makefile给 Makefile 放到上面 hello.c 的相同的目录中(如果上面写的模块代码叫 hello.c 的话)。然后使用 make 就能编译了。insmod lsmod rmmod调用 insmod 时会给需要的模块加载进内核会给 ko 的文件以目标代码加载。装载时会调用 module_init 指定的函数。退出也调用相应的 module_exit.lsmod 可以显示你写的模块其实是读 /proc/modules 。接下来我写写怎么样自己通过内核来建 proc 文件。模块加载参数如果在模块加载时想指定参数也提供了相应的头文件这样以后直接在内核模块内使用 test 的变量就行了。模块的信息在程序中可以为模块加一些描述发行版权声明和作者。模块的符号导出在 Perl 中模块是可以导出变量和方法到其它的模块中的。在 Linux 内核中也有这样的方法。这二个可以导出指定的全局变量也可以是方法。这个要加载 的头文件不要忘记了。其它的模块要使用这个直接使用 extern void name(void); 就可以使用了。这些导出的函数只能内核和内核模块使用。不能用户调用可以由 /proc/kallsyms 来查看导出的变量和方法实例写个内核模块通过 proc 可以见到一些信息通过 proc 的读和写的功能。来实现设置和读取信息。proc 介绍proc 是一个非常方便的用来动态的向 Linux 内核加入和禁用代码的一个方法。proc/sys 中是用来配置内核的参数可以通过 sysctl -w keyvalue象普通文件可以支持 open,read,write,close例如读写proc 的功能实现proc 在 c 中是一个结构体来实现的是 struct proc_dir_entry 。它可以给读写绑定到特定的函数上。然后通过别人对 proc 中文件的操作来触发和回调相应的绑定的函数。read_proc 和 write_proc 是这个结构体的成员也是一种结构体。函数就注册在这个上面。有兴趣的同学可以看看 include/linux/proc_fs.h 中的 read_proc_t 和 write_proc_t 的定义。实现起来也简单。在这的 create_proc_entery 会返回一个 proc_dir_entry 的结构体的引用。失败就是 NULL 。这样当用户空间进行 read 的系统调用时如使用 cat proc 中的内容时。内核会调用注册到 read_proc 上的这个 my_read_proc 来实现的.