您好,欢迎访问三七文档
Linux内核编程四川大学计算机学院网络安全实验室陈家军讲座内容•Linux内核简介•Linux内核编程基础•Linux内核模块编程•关于linux内核学习Linux内核发行版简史2.6内核的发布已经持续了很长时间,那么什么时候将会推出2.7?目前,Linux内核的源代码数量已经超过1000万行,上千人参与开发,每2~3个月发布一个版本。Linux内核树•2.6.x内核基础稳定版本•2.6.x.y内核稳定内核,包含了对一个给定的2.6.x内核的一些重要问题的修复•-rc内核候选的发布内核,具有不稳定性•2.6.x-git内核Linus维护的内核树的每日快照,它们比-rc内核更具实验性质。•2.6.x-mm内核这些是AndrewMorton发布的实验性质的内核,包含了新特性和实验性补丁GNU/Linux操作系统的基本体系结构最上面是用户(或应用程序)空间。这是用户应用程序执行的地方。用户空间之下是内核空间,Linux内核正是位于这里。Linux内核的主要子系统进程管理、内存管理、文件系统、网络协议栈、设备驱动程序、系统调用接口和依赖体系结构的代码Linux内核配置和编译•内核配置makeconfig(基于文本的命令行配置工具)makemenuconfig(基于ncurse库编制的图形配置工具)makexconfig(基于X11的图形配置工具)makegconfig(基于gtk+的图形配置工具)makedefconfig(为你的体系结构创建一个默认配置)•make编译内核,生成内核映像文件、内核模块•makeinstall安装内核映像•makemodules_install安装内核模块内核开发的特点•没有libc库•没有内存保护机制•小而固定的栈•同步和并发•不要轻易在内核中使用浮点数Linux内核模块编程Linux内核的模块机制允许内核在运行时动态地载入和删除内核代码。这样基本内核镜像可以尽可能的小。也给我们编写内核程序提供方便,我不需要把自己编写的内核程序编译进内核,不用重启机器,需要的时候加载相应的模块,不需要时卸载。Linux内核模块管理工具•insmod安装内核模块•rmmod卸载内核模块•depmod创建模块依赖文件•modprobe提供依赖性分析,错误检查等功能和选项depmodxxx.ko#为某个创建依赖文件modprobexxx.ko#加载某个模块modprobe-rxxx.ko#卸载某个模块•lsmod显示当前加载的所有模块,相当cat/proc/modules•modinfo查看内核模块信息编程环境准备•从网站上获得一个“主线”内核,在自己的系统中配置并构造好内核树。因为2.6内核的模块要和内核源代码树中的目标文件链接。•简单说,你必须先配置过内核,执行过make,然后才能make你自己的模块。要运行编译出的模块,最好安装编译后的内核(makeinstall、makemodules_install)。•也可以安装Linux发行版的内核开发包,需要你的机器上已经安装了kernel-devel这个包,也就提供编译模块所必须的东西:内核的头文件、目标文件和一些Makefile。•发行版厂商提供的内核通常打了许多补丁,从而和主线内核存在一些差异。Linux内核编程实例1内核模块Makefileobj-m表明生成的是外部模块make-C$(KDIR)M=$(shellpwd)modules该命令首先改变目录到-C选项指定的位置(即内核源代码目录),其中保存有内核顶层Makefile。M=选项让该Makefile在构造modules目标前返回到模块源代码目录。Modules目标指向obj-m变量中设定的模块。•make-C$(KDIR)M=$(shellpwd)clean删除所有编译生成文件实例1模块运行结果Linux内核编程实例2hello_load.chello_unload.c相应的MakefileLinux内核编程实例3内核模块参数•可以在系统启动或模块装载时在指定参数值,这些参数属于全局变量。•定义一个模块参数可通过宏module_param()完成module_param(name,type,perm)name:变量的名称type:变量的类型perm:sysfs文件系统下的对应文件权限(0则表示禁止所有的sysfs项)实例3运行截图Linux内核调试方法•Oops和panic企业版的linux厂商一般将他们的内核定制为发生一个oops是就使内核崩溃(panic)。oops(慌张)消息包含系统错误的细节,如CPU寄存器的内容。在Linux中,调试系统崩溃的传统方法是分析在发生崩溃时发送到系统控制台的oops消息。•kgdb内核调试器kgdb是一个补丁(已集成到新版本的内核中。在Kernelhacking里,需要在编译内核时选上)。它可以让我们在远端主机上通过串口利用gdb的所有功能对内核进行调试。您可以接着深入到内核中、设置断点、检查数据等其它操作(类似于在应用程序上使用gdb的方式)。•kdb内核调试器kdb是kgdb的一种替代品,这个补丁对内核源代码进行了很多修改,是调试在本地主机上就可以进行。其实,Linus不支持在内核中内置调试器。他担心这些调试器会导致一些不良的修改。Kernelpanic关于Linux内核学习•LinusTorvalds的回答过类似的问题:你必须使用过Linux。(动手编译内核)•至少要对内核有一个大概了了解。《Linux内核设计与实现》,英文名LinuxKernelDevelopment(LKD),此书是当今最佳的入门图书。•带着问题去试图阅读内核源代码。浏览内核源代码•在Windows下,用SourceInsight,它可以很方便的在代码之间进行关联阅读。•在Linux,可使用vim+cscope+ctags浏览内核源码,还可用SourceNavigator等•lxr(LinuxCrossReference)参考资料•网络资源://lwn.net/•推荐书籍《Linux内核设计与实现》《深入理解Linux内核》《Linux设备驱动程序》
本文标题:linux内核编程
链接地址:https://www.777doc.com/doc-3356297 .html