版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Linux内核及编程第2章Linux内核及内核编程计算机科学技术系李伟民2012年7月Linux内核及编程提纲Linux内核介绍
-Linux内核演变及新版特点
-Linux内核的组成Linux内核编程
-Linux内核编译及加载-Linux下的C编程特点
Linux内核及编程Linux内核的发展与演变Linux生存发展的支柱UNIX操作系统:Linux可以看做UNIX的一个克隆版本Minix操作系统:开放源代码,Linux参照Minix于1991年开发GNU计划:GNU计划和FSF由Stallman于84年创办,开发出了许多高质量的免费软件,为Linux开发创造了合适的环境。Posix标准:可移植的操作系统接口,保证应用程序在源代码一级上在多种操作系统上移植,是Linux前进的灯塔Internet:从0.95版开始,对内核的改进和扩充以网友为主Linux内核及编程Linux内核的发展与演变Linux版本的发展
从1991年10月最初原型0.1版到2003年12月2.6版,Linux朝着支持更多的CPU、硬件体系结构和外部设备,支持更广泛领域的应用,提供更好的性能3个方向发展。编号问题:奇偶数编号含义。
针对嵌入式系统的应用的改进内核,如HardHatLinux和RTLinux,
uClinux,ThinLinux,MontaVista。Linux内核及编程Linux2.6内核特点新的调度器:高负载下执行出色,多处理器也能很好的扩展。内核抢占:提高实时性,增强系统的用户交互性。改进的线程模型:可以处理任意数目的线程,最大达20亿。虚拟内存的变化:融合反向映射技术。文件系统:支持日志文件系统功能,对扩展属性及Posix标准访问控制支持,给指定的文件在文件系统中嵌入元数据。音频:ALSA支持USB和MIDI设备。电源管理:调节CPU,降低功耗。联网和IPSec:加入对IPSec和NFSv4的支持,改进对IPv6的支持。用户界面层:加入了对近乎所有接口设备的支持。Linux内核及编程Linux内核的组成Linux内核源代码目录结构arch:和硬件体系结构相关的代码,每种平台占一个相应目录。drivers:设备驱动程序,每个不同驱动占用一个子目录。fs:支持的各种文件系统,如EXT、FAT、NTFS、JFFS2。block:块设备驱动程序I/O调度。include:与系统相关的头文件放在include/linux下。init:内核初始化代码。kernel:内核最核心部分,和平台相关的一部分放在arch/*/kernelmm:内存管理代码,和平台相关的一部分放在arch/*/mmscripts:用于配置内核的脚本文件。usr:实现了用于打包和压缩的cpio等。Linux内核及编程Linux内核的组成Linux内核组成Linux内核及编程Linux内核的组成进程调度Linux内核及编程Linux内核的组成内存管理
内存管理的主要作用是控制多个进程安全地共享主内存区域。Linux内存管理完成为每个进程进行虚拟内存到物理内存的转换。Linux的每个进程享有4GB的内存空间,0~3GB属于用户空间,3~4GB属于内核空间,内核空间对常规内存、I/O设备内存以及高端内存存在不同的处理方式。虚拟文件系统
隐藏了各种硬件细节,为所有设备统一了接口。Linux内核及编程Linux内核的组成网络接口提供对各种网络标准的存取和各种网络硬件的支持,分为网络协议和网络驱动程序。网络协议实现可能的网络传输协议,网络设备驱动程序负责与硬件设备通信,每一种设备都有相应的驱动程序。进程通信支持进程间的多种通信机制,包含信号量、共享内存、管道等,可协助多个进程、多资源的互斥访问、进程间的同步和消息传递。Linux内核及编程Linux内核的组成Linux内核组成部分之间的依赖关系进程创建依赖内存管理的数据装入。进程间通信依赖内存管理支持共享内存通信机制。虚拟文件系统利用网络接口支持网络文件系统。内存管理利用虚拟文件系统支持交换,交换进程定期由调度程序调度,这说明内存管理也依赖与进程调度。Linux内核及编程Linux内核的组成Linux内核空间与用户空间CPU内部实现了不同操作模式。不同模式有不同功能。Linux系统充分利用了CPU这一特性,但它只使用了两级:内核空间和用户空间。内核可以进行任何操作,用户程序被禁止对硬件的直接访问和对内存的未授权访问,它们的地址空间不同。Linux只能通过系统调用和硬件中断完成从用户空间到内核空间的控制转移。Linux内核及编程Linux内核编译为什么重新编译内核?Linux是一个自由软件,内核版本不断更新,并增加了许多特性。根据自身系统,定制更高效,更稳定内核的需要。更新的版本支持更多的硬件,具备更好的进程管理能力,运行速度更快,更稳定,并一般会修复老版本中的bug。
经常性地选择升级更新的系统内核是Linux使用者的必要操作内容。编译适合自己的内核,将不需要的功能不要编译进内核,以免增加被系统攻击者利用的漏洞。Linux内核及编程Linux内核编译Linux内核的获取和更新linux内核版本发布的官方网站http://。发布形式:一种是full/Source版本,另外一种是patch文件,即补丁。完整内核版本较大,一般是tar.gz或者是.bz2文件,二者分别是使用gzip或者bzip2进行压缩的文件,使用时需要解压缩。patch文件则比较小,一般只有几十K到几百K,但是patch文件是针对于特定的版本的,你需要找到自己对应的版本才能使用。Linux内核及编程Linux内核编译Linux内核编译准备知识编译内核需要root权限。一般把内核拷贝到/usr/src下,删除该目前下存在的linux目录链接。解压缩源代码,如果所下载的是.tar.gz(.tgz)文件,tar-zxvfFORLINX_linux-.tar.gz。文件解压到/usr/src/linux目录,然后稍作修改。
mv
linuxlinux-2.6.5;ln-slinux-2.6.5linux。(可选)Linux内核及编程Linux内核编译步骤通常要运行的第一个命令是:
cd/usr/src/linux
。makemrproper
:该命令确保源代码目录下没有不正确的.ko文件以及文件的互相依赖。如果我们使用刚下载的完整的源程序包进行编译,本步可以省略。而如果你多次使用了这些源程序编译内核,那么最好要先运行一下这个命令。Linux内核及编程Linux内核编译步骤Linux内核配置配置内核可以根据需要与爱好使用下面命令中的一个:
#makeconfig(基于文本的最为传统的配置界面,不推荐使用)#makemenuconfig(基于文本选单的配置界面,字符终端下推荐使用)#makexconfig(基于图形窗口模式的配置界面,Xwindow下推荐使用,要求QT被安装)#makegconfig(要求GTK+被安装)。Linux内核及编程Linux内核编译步骤Linux内核配置界面Linux内核及编程Linux内核编译步骤Linux内核编译#makeclean:完成删除前面步骤留下的文件,以避免出现一些错误。这在多次编译过内核的话是有必要的。makebzImage或makezImage:实现完全编译内核,二者生成的内核都是使用gzip压缩的,只要使用一个就够了,它们的区别在于使用makebzImage可以生成大一点的内核。建议大家使用makezImage命令。Linux内核及编程Linux内核配置主要项目简介Loadablemodulesupport这个选项是你的内核对内核模块的支持选项,包括是否支持和支持的一些配置等,选择此项会使一些不常用到的驱动或特性可以编译为模块以减少内核的体积。SystemType
选择对系统的支持,如什么样的ARM内核,什么样的配置平台等,如果使用不同的处理器其系统或是不同的内核时此处的选项可能不同。Linux内核及编程Linux内核配置主要项目简介GeneralSetup这里是内核本身的一些属性的配置,包括压缩方式,网络支持等很多属性。Parallelportsupport这个选项顾名思义就是选择内核对并口的支持情况,当选中对并口支持后会出现新的选项来配置支持不同类型不同模式的并口。Linux内核及编程Linux内核配置主要项目简介MemoryTechnologyDevices(MTD)对MTD设备的支持选项,这个选项对嵌入式系统比较重要,内核对各种Flash的支持都在这里配置,包括种类,分区等。Blockdevices内核对块设备的支持选项,各种磁盘系统的支持。Networkingsupport对网络设备的支持选项,例如系统配置不同的网卡时就要在这里选中不同的选项。Linux内核及编程Linux内核配置主要项目简介Characterdevices字符型设备的支持,这个选项是嵌入式系统经常使用的选项,嵌入式系统中大量的设备都属于Char型的设备。Multimediadevices多媒体设备的支持。Filesystems内核对不同文件系统的支持选项,在这里选择需要支持的文件系统。Linux内核及编程Linux内核配置主要项目简介USBsupport各种USB设备的支持。Bluetoothsupport蓝牙设备的支持。Kernelhacking内核DeBug
用的一些选项,用于报告各种信息。Linux内核及编程内核配置小结Linux内核的配置系统由以下3个部分组成Makefile:定义Linux内核的编译规则。配置文件(Kconfig):给用户提供配置选择的功能。配置工具:配置命令解释器和配置用户界面。使用makemenuconfig等命令后,会生成一个.config配置文件,记录哪些被编译入内核,哪些被编译为内核模块。Linux内核及编程Kconfig和MakeFile在Linux内核中增加程序需要完成以下3项工作将编写的源代码拷入Linux内核源代码的相应目录。在目录的Kconfig文件中增加关于新源代码对应项目的配置选项在目录的Makefile文件中增加对新源代码的编译条目。Makefile定义Linux内核的编译规则,make工具可以实现自动编译和增量编译,但必须告诉make源程序之间的依赖关系,描述这种关系的就是Makefile文件。Linux内核及编程MakeFile文件分类Linux内核及编程MakeFile的作用决定编译哪些文件顶层Makefile决定内核根目录下哪些子目录将被编进内核(采用递归的方式)。arch/$(ARCH)/Makefile决定arch/$(ARCH)目录下哪些文件、哪些目录将被编进内核。各级子目录下的Makefile决定所在目录下哪些文件将被编进内核,哪些文件将被编成模块(即驱动程序),进入哪些子目录继续调用它们的Makefile
。Linux内核及编程Makefile的作用怎样编译这些文件?即编译选项、连接选项是什么。选项分3类:全局的,适用于整个内核代码树;局部的,仅适用于某个Makefile中的所有文件;个体的,仅适用于某个文件。Linux内核及编程MakeFile的作用怎样连接这些文件,它们的顺序如何?arch/arm/Makefile:顶层Makefile:Linux内核及编程Makefile的作用顶层Makefile按照一定的顺序组织文件,根据连接脚本arc/$(ARCH)/kernel/vmlinux.lds生成内核映象文件vmlinux。obj–y用来定义哪些文件被编进(built-in)内核。obj-m用来定义哪些文件被编译成可加载模块(Loadablemodule)。lib-y用来定义哪些文件被编成库文件。obj-y、obj-m还可以用来指定要进入的下一层子目录。Linux内核及编程Makefile的主要语法目标定义定义哪些内容作为模块编译,哪些要编译并连接进内核。更常见的做法:根据.config文件中的CONFIG变量来决定文件编译方式,如:obj-y+=foo.c:表示要由foo.c或者foo.s文件编译得到foo.o并连接进内核。obj-$(CONFIG_ISDN)+=isdn.oobj-$(CONFIG_ISDN_PPP_BSDCOMP)+=isdn_bsdc.oLinux内核及编程Makefile的主要语法多文件模块的定义采用模块名加-y或-bojs后缀来定义模块的组成文件。目录层次迭代当CONFIG_EXT2_FS的值为y或m时,kbuild将会把ext2目录列入向下迭代的目标中。obj-$(CONFIG_EXT2_FS)+=ext2.oext2-y:=balloc.odir.ofile.oobj-$(CONFIG_EXT2_FS)+=ext2/Linux内核及编程Kconfig分析一个文本形式的文件,其中主要作用是在内核配置时候,作为配置选项,是各种配置界面的源文件。内核的配置工具读取各个Kconfig文件,生成配置界面供开发人员配置内核,最后生成配置文件.config。内核的配置界面以树状的菜单形式组织,主菜单下有若干个子菜单,子菜单下又有子菜单或配置选项。每个子菜单或选项可以有依赖关系,这些依赖关系用来确定它们是否显示。只有被依赖项的父项已经被选中,子项才会显示。内核源码每个子目录中,都有一个Makefile文件和Kconfig文件。Linux内核及编程Kconfig基本要素config条目config条目用来配置一个选项,它用于生成一个变量,这个变量会连同它的值一起被写入配置文件.config中。config出现的三种配置结果:config关键字,表示一个配置选项的开始。CONFIG_LEDS_S3C24XX=y#对应的文件被编进内核CONFIG_LEDS_S3C24XX=m#对应的文件被编成模块#CONFIG_LEDS_S3C24XX#对应的文件没有被使用Linux内核及编程Kconfig基本要素config变量类型:bool布尔类型、
tristate三态(内建、模块、移除)、string字符串、hex十六进制、integer整型。条件判断:依赖关系:缺省值定义:
注意:省略了前缀“CONFIG_”“if〈expr〉”“prompt”<prompt>[“if”<expr>]注意:prompt关键字可以省略“dependson”/“requires”<expr>“default”<expr>[“if”<expr>]Linux内核及编程Kconfig基本要素选择选项:帮助信息:
“select”<symbol>[“if”<expr>]“help”or“---help---”Linux内核及编程Kconfig基本要素menu条目所有处在“menu”和“endmenu”之间的菜单入口都会成为“Floatingpointemulation”子菜单。而且,所有子菜单选项都会继承父菜单的依赖关系。menu“Floatingpointemulation”configFPE_NWFPE……configFPE_NWFPE_XP…………endmenuLinux内核及编程Kconfig基本要素choice条目:将多个类似的配置选项组合在一起,供用户单选或多选,格式如下:“choice”<choiceoptions><choiceblock>“endchoice”choiceprompt“ARMsystemtype”defaultARCH_VERSATILEconfigARCH_AAEC2000…configARCH_INTEGRATOR…endchoiceLinux内核及编程Kconfig基本要素comment条目:用于定义一些帮助信息,它在配置过程中出现在界面的第一行.并且这些帮助信息会出现在配置文件中(作为注释),格式如下:“comment”<prompt><commentoptions>menu“Floatingpointemulation”comment“Atleastoneemulationmustbeselected”Linux内核及编程Kconfig基本要素source条目:用于读入另一个Kconfig文件,
格式如下:“source”<prompt>source“net/Kconfig”Linux内核及编程.config文件分析是在进行内核配置的时候,经过配置后生成的内核编译参考文件。是由配置工具自动生成。记录哪些部分被编译入内核、哪些部分被编译为内核模块。位于源代码的根目录下。.config文件节选:1#
2#Automaticallygeneratedmakeconfig:don’tedit
3#
4CONFIG_X86=y
5CONFIG_MMU=y
6CONFIG_UID16=yLinux内核及编程Kconfig、MakeFile、.config三者之间的联系我们在内核源码下面执行make命令,实际上是根据makefile来进行编译的。
obj-$(CONFIG_ISDN)+=isdn.o中CONFIG_ISDN是一个变量,这个变量的赋值则是通过.config文件来集中赋值的。CONFIG_ISDN=y..config文件是通过Kconfig配置生成的。当更改Kconfig文件或者通过配置工具进行内核配置的时候会自动更新.config中相应的值。这三者是怎样配合工作的呢?Linux内核及编程添加驱动程序到内核1、拷贝test到drivers路径下cp–frtestlinux_kernel_path/drivers2、为新增目录创建Kconfig和MakefileLinux内核及编程添加驱动程序到内核3、修改新增目录的父目录的Kconfig和Makefile在drivers/Kconig中加入:source"drivers/test/Kconfig“在drivers/Makefile中加入:obj-$(CONFIG_TEST)+=test/在arch/arm/Kconfig里加入:source“drivers/test/Kconfig”4、增加了Kconfig和Makefile文件之后的新的test树型目录如下所示:
Linux内核及编程Linux内核的几个概念(补充)驱动层程序包括:硬件抽象层HAL;板间升级包BSP;设备驱动程序。硬件抽象层:(HardwareAbstractionLayer)是位于操作系统内核与硬件电路之间的接口层,操作系统中通过接口控制所有硬件电路如CPU、I/O、Memory等的操作。抽象层一般应包括相关硬件的初始化配置操作、数据的输入/输出操作、硬件设备操作等功能。Linux内核及编程Linux内核的几个概念(补充)抽象层的特点硬件抽象层具有与硬件的密切相关性;硬件抽象层具有与操作系统的无关性;接口定义的功能应包含硬件或系统所需硬件支持的所有功能;接口定义简单明了,太多接口函数会增加软件模拟的复杂性;具有可测性的接口设计有利于系统的软硬件测试和集成。Linux内核及编程Linux内核的几个概念(补充)板间升级包板级支持包BSP(BoardSupportPackage)是介于主板硬件和操作系统中驱动程序层之间的一层,一般认为它属于操作系统的一部分,主要是实现对操作系统的支持,为上层的驱动程序提供访问硬件设备寄存器的函数包,使之能够更好的运行于硬件主板。另有说法:在WindowsCE中,BSP是驱动程序、OEM适应层、硬件抽象层以及启动设备和使外设正常工作所需BIOS文件的集合。另外,每个公司的定义和标准可能不一样。Linux内核及编程Linux内核的引导初始化代码(启动代码)使处理器从复位状态进入到操作系统能够运行的状态。可划分为三个阶段:初始化硬件配置、诊断、引导。系统的启动通常用的两种方式:直接从flash启动;将压缩的内存映像文件从Flash(为节省Flash资源,提高速度)中复制、解压到RAM,再从RAM启动Linux内核及编程Linux内核的引导X86PC上的Linux引导流程系统启动运行init进程Bootloader的第一阶段Bootloader的第二阶段启动内核BIOSMBRLILO、GRUB内核用户空间上电/复位Linux内核及编程Linux内核的引导当上电或复位时,CPU会将PC指针赋值为一个特定的地址并执行该地址处的指令,位于BIOS中,保存在ROM或Flash中。BIOS运行时按照CMOS的设置的启动设备顺序来搜索处于活动状态并且可以引导的设备。主引导加载程序查找并加载次引导加载次引导程序。次引导加载程序加载Linux内核和可选的初始RAM磁盘,将控制权交给Linux内核源代码。运行被加载的内核,并启动用户空间应用程序。Linux内核及编程Linux内核的引导Bootloader著名的LinuxBootloader包括应用于PC的LILO和GRUB,应用于嵌入式系统的U-Boot、RedBoot。怎样完成启动内核并运行用户空间的init进程?当内核映像被加载到RAM之后,Bootloader的控制权被释放,内核映像并不是完全可直接执行的目标代码,而是通过一个压缩过的zImage或bzImage。Linux内核及编程X86PC上的Linux引导流程/arch/i386/boot/head.SStart()Startup_32()Decompress_kernel()Startup_32()Startup_kernel()cpu_idle()/arch/i386/boot/compress/head.S/arch/i386/boot/compress/misc.c/arch/i386/kernel/head.S/init/main.c/init/main.cLinux内核及编程Linux下C编程特点Linux编码风格Linux命名习惯不同于Windows程序命名习惯和匈牙利法。下划线大量使用,不采用首字母大写以区分单词的方式。代码缩进使用“TAB”(8个字符)。对于结构体、if/for/while/switch语句,{不另起一行。如果if、for循环后只有1行,不要加{}。if和else混用的情况下,else语句不另起一行。对于函数,{另起一行。switch和case对齐。注意空格的应用,如for(i=0;i<10;i++){。Linux内核及编程Linux下C编程特点GNUC与ANSICLinux上可用的C编译器是GNUC编译器,对标准C进行一系列扩展。可以定义零长度和变量长度数组,chardata[0],doublex[n]。把包含在括号中的复合语句看做是一个表达式,称为语句表达式。typeof(x)语句可以获得x的类型,借助这个可以重新定义宏。宏也可以接受可变数目的参数,#definepr_debug(fmt,arg…)printk(fmt,##arg)。通过指定索引或结构体成员名,允许初始化值可以顺序出现。预定义了两个标识符保存当前函数的名字。Linux内核及编程Linux下C编程特点GNUC与ANSIC允许声明函数、变量和类型的特殊属性,以便进行手工的代码优化和定制代码检查的方法,在声明后添加__attribute__((ATTRIBUTE)),ATTRIBUTE为属性说明。Noreturn、format、unused、aligned、packed属性的意义。提供了大量内建函数,大部分是标准C库函数,不属于库函数的其他内建函数以__builtin开始。在使用gcc编译C程序的时候,使用gcc–ansi–penantic–ctest.c,则会告诉编译器不使用GNU扩展语法。Linux内核及编程Linux下C编程特点struct
operators
{
void
(*read1)(char
*);
void
(*read2)(char
*);
void
(*read3)(char
*);
int
n;
};
void
read1(char
*data)
{
printf("read1:
%s/n",data);
}
void
read2(char
*data)
{}
void
read3(char
*data)
{}
int
main()
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- PEP人教版小学四年级上册Unit 1 My classroom PartC Story time课件
- 农村个人房屋买卖合同协议书范本
- (立项备案方案)椰雕项目立项申请报告
- 古代建筑行业中的追踪和定位- 王姣27课件讲解
- 山东省菏泽市郓城县第一中学2023-2024学年七年级上学期第一次月考生物试题(解析版)-A4
- 湖南省娄底市新化县2024-2025学年八年级上学期12月月考道德与法治试题-A4
- 兽医寄生虫题库与参考答案
- 养老院老人心理关爱制度
- 养老院老人紧急救援人员职业道德制度
- 房屋建筑项目工程总承包合同(2篇)
- 中国法律史-第一次平时作业-国开-参考资料
- 人工智能原理与技术智慧树知到期末考试答案章节答案2024年同济大学
- 2024年4月自考05677法理学试题及答案含评分参考
- 酱类制造项目经济效益分析报告
- 2024年交管12123学法减分考试题库附完整答案(网校专用)
- 研究生学术表达能力培养智慧树知到期末考试答案章节答案2024年西安建筑科技大学、清华大学、同济大学、山东大学、河北工程大学、《环境工程》英文版和《环境工程》编辑部
- sqe年度总结报告
- 中外石油文化智慧树知到期末考试答案章节答案2024年中国石油大学(华东)
- GJB9001C-2017管理手册、程序文件及表格汇编
- 中外比较文学研究专题智慧树知到期末考试答案2024年
- 铁道工程专业毕业设计
评论
0/150
提交评论