第6章 Linux内核分析

上传人:gu****n 文档编号:243144043 上传时间:2024-09-16 格式:PPT 页数:59 大小:2.59MB
返回 下载 相关 举报
第6章 Linux内核分析_第1页
第1页 / 共59页
第6章 Linux内核分析_第2页
第2页 / 共59页
第6章 Linux内核分析_第3页
第3页 / 共59页
点击查看更多>>
资源描述
IOTek Information Tchnology,*,Click to edit Master title style,IOTek Information Tchnology,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,Click to edit Master title style,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,IOTek Information Tchnology,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,Click to edit Master title style,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,IOTek Information Tchnology,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,Click to edit Master title style,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,IOTek Information Tchnology,*,Click to edit Master title style,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,*,Chapter,*,static void Main(string, args),Console.WriteLine(请输入一个字符串:); / 输入提示,/ 从控制台读入字符串,string,line,= Console.ReadLine();,/ 循环输出字符串中的字符,foreach (char c in,line,),Console.WriteLine(c);,Console.ReadLine();,static void Main(string, args),Console.WriteLine(请输入一个字符串:); / 输入提示,/ 从控制台读入字符串,string,line,= Console.ReadLine();,/ 循环输出字符串中的字符,foreach (char c in,line,),Console.WriteLine(c);,Console.ReadLine();,依次循环字符串中的每个字符,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,上章回顾,U-Boot,的移植,U-Boot,中添加一个命令的方法,Linux,内核分析,第,6,章,预习检查,简单介绍下,Linux,版本和特点?,Makefile,的作用?,Kconfig,的作用?,简述,Linux,内核的启动流程,?,Page,4,/40,本章目标,了解,Linux,内核源码的组织结构,掌握,Linux,内核的编译及启动,本章结构,Linux,内核配置,Linux,内核分析,内核源码结构及Makefile分析,Linux,内核配置选项,内核的,Kconfig,分析,Linux,版本及特点,Linux,内核启动流程分析,Linux内核启动过程概述,编译、烧写、启动内核,修改内核以支持,S3C2440,开发板,获取内核源,Unix,有多遥远?,Unix,诞生于失败的项目:,Multics,1969,年,,Ken Thomspon,在,PDP-7,上实现,1973,年,,Dennis Ritche,实现了,C,语言版的,Unix,1983,年,,AT&T,推出,System V,19791993,年,,3BSD,到最后一个,4.4BSD,商业的,Unix,版本:,HP UX,Sun solaris,IBM AIX,Unix,的优势,简洁,系统调用仅百余个,在,Unix,,所有的东西被当作文件看待,Unix,的内核和相关的系统工具软件都是,C,开发的,惊人的移植能力,fork(),迅速,简单而又稳定的通信原语,追寻,Linus,的足迹,1991,年,,linus,为,intel 80386,开发的,unix,操作系统,Linux,内核遵循,GPL,,是,Free software,Linux,是,unix-like,的操作系统内核,Linux,系统的基础,内核,C,库,GCC,系统的基本工具,Linux,的发行版,Debian GNU/Linux,Fedora,Gentoo Linux,Mandriva Linux,Redhat Enterprise Linux(RHEL),Slackware Linux,OpenSuSE,SuSE Linux Enterprise Server,Ubuntu,操作系统,VS,内核,一般理解的操作系统,完成最基本功能,和系统管理的那些部分,内核,驱动,启动引导程序,命令行,shell,以及其他的一些界面,现在理解的操作系统,指内核,内核才是操作系统的核心,负责响应中断服务程序,负责管理多个进程从而分享处理器时间的调度程序,负责管理进程地址空间的内存管理程序,网络,和进程间通信,运行于系统态,以及受保护的内存空间,称之为内核空间,处理器的上下文环境,运行于内核空间,处于进程上下文,代表某个进程执行,运行于内核空间,处于中断上下文,与进程无关,运行于用户空间,执行用户进程,CPU,空闲时。内核运行一个空进程,处于进程上下文,运行于内核空间,Linux,内核,VS,传统,UNIX,的内核,都是单体内核,,Linux,支持动态加载模块,Linux,内核支持,preemptive,Linux,提供了面向对象的设备模型,,hotplug,等,虚拟文件系统,内核线程,安装内核源码,两种形式的压缩,GNU zip,#tar xzvf linux-x.y.z.tar.gz,Bzip2,#tar xvjf linux-x.y.z.tar.bz2,Linux,的源代码结构,目录描述,目录,描述,arch,特定体系结构的源码,cryto,Cryto API,Documentation,内核源码文档,Drivers,设备驱动程序,fs,VFS,和各种文件系统,include,内核头文件,init,内核引导和初始化,ipc,进程间通信代码,kernel,调度子系统这样的核心子系统,lib,通用内核函数,mm,内存管理子系统与虚拟内存,net,网络子系统,scripts,编译内核所用的脚本,security,Linux,的安全模块,sound,语音子系统,usr,早期用户代码,(initramfs),Linux,内核源码层次结构,arch/arm/,的目录,目录,说明,boot,平台相关的启动代码,一般包含,head.S,configs,预定义了此体系结构平台下的配置文件,kernel,与体系结构相关的内核代码,lib,与体系结构相关的内核函数库,mm,与体系结构相关的内存管理部分代码,mach-xxx,与某款特定,CPU,的平台代码,include/asm,的头文件目录,1,asm,是一个,symbolic link,因为众多的文件都需要包含,asm-XXX/,目录下的某个头文件,使用,asm,的链接之后,在不同的平台下指向不同的目录,这样,增加了软件的可移植性。,include/linux/,头文件目录,与平台无关的头文件一般放在,linux,这个目录下,如,linux/mtd/,Linux Makefile,分析,Makefile,的作用:,决定编译哪些文件。,怎样编译这些文件?,怎样连接这些文件,最重要的是它们的顺序如何?,Linux,内核,Makefile,文件分类,Makefile,的作用,决定编译哪些文件,怎样编译这些文件,怎样连接这些文件,它们的顺序如何,Makefile,的作用(,1,),决定编译哪些文件,1),顶层,Makefile,决定内核根目录下哪些子目录将被编迸内核。,2) arch/$(ARCH)/Makefile,决定,arch/$(ARCH),目录下哪些文件、哪些目录将被编进内核。,3),各级子目录下的,Makefile,决定所在目录下哪些文件将被编进内核,哪些文件将被编成模块,(,即驱动程序,),,进入哪些子目录继续调用它们的,Makefile,。,Makefile,的变量,在,include/config/auto.conf,文件中,变量的值主要有两类,:“y ”,和“,m”),。各级子目录的,Makefile,使用这些变量来决定哪些文件被编进内核中,哪些文件被编成模块,(,即驱动程序,),, 要进入哪些下一级子目录继续编译,objy,用来定义哪些文件被编进,( built-in),内核,obj-m,用来定义哪些文件被编译成可加载模块,( Loadable module ),lib-y,用来定义哪些文件被编成库文件,obj-y,、,obj-m,还可以用来指定要进入的下一层子目录,Makefile,的作用(,2,),怎样编译这些文件,即编译选项、连接选项是什么,选项分,3,类:,全局的,适用于整个内核代码树;,局部的,仅适用于某个,Makefile,中的所有文件;,个体的,仅适用于某个文件,Makefile,的作用(,3,),怎样连接这些文件,它们的顺序如何,arch/arm/Makefile:,顶层,Makefile:,Makefile,的作用(,3,),顶层,Makefile,中,再往下看:,顶层,Makefile,按照一定的顺序组织文件,根据连接脚本,arc/$(ARCH)/ kernel/ vmlinux.lds,生成内核映象文件,vmlinux,对,Makefile,的总结,(1),配置文件,.config,中定义了一系列的变量,,Makefile,将结合它们釆决定哪些文件被编 进内核、哪些文件被编成模块、涉及哪些子目录。,(2),顶层,Makefile,和,arch/$(ARCH)/Makefile,决定根目录下哪些子目录,,arc/$(ARCH),目录下哪些文件和目录将被编迸内核。,(3),最后,各级子目录下的,Makefile,决定所在目录下哪些文件将被编进内核,哪些文件 将被编成模块,(,即驱动程序,),,进入哪些目录继续调用它们的,Makefile,。,( 4),顶层,Makefile,和,arch/$(ARCH)/Makefile,设置了可以影响所有文件的编译、连接选 项:,CFLAGS,、,MLAGS,、,LDFLAGS,、,ARFLAGS,。,(5),各级子目录下的,Makefile,中可以设置能够影响当前目录下所有文件的编译、连接选 项:,EXTRA_CFLAGS,、,EXTRA_AFLAGS,、,EXTRA_LDFLAGS,、,EXTRA_ARFLAGS,;还可以设置可以影响某个文件的编译选项:,CFLAGS_$,,,AFLAGS_$,。,( 6),顶层,Makefile,按照一定的顺序组织文件,根据连接脚本,arc/$(ARCH)/ kernel/ vmlinux.lds,生成内核映象文件,vmlinux,。,内核的,Kconfig,分析,所有配置工具都是通过读取,arc/$(ARCH)/Kconfig,文件来生成配置界面,这个文件是所有配置文件的总入口,它会包含其他目录的,Kconfig,文件。,make menuconfig,得到配置界面如下图所示:,内核的,Kconfig,分析,内核源码每个子目录中,都有一个,Makefile,文件和,Kconfig,文件,Kconfig,用于配置内核,它就是各种配置界面的源文件。,内核的配置工具读取各 个,Kconfig,文件,生成配置界面供开发人员配置内核,最后生成配置文件,.config,。,内核的配置界面以树状的菜单形式组织,主菜单下有若干个子菜单,子菜单下又有子菜 单或配置选项。每个子菜单或选项可以有依赖关系,这些依赖关系用来确定它们是否显示。 只有被依赖项的父项已经被选中,子项才会显示。,Kconfig,文件基本要素:,config,条目,config,条目用来配置一个选项,它用于生成一个变量,这个变量会连同它的 值一起被写入配置文件,.config,中。,config,出现的三种配置结果:,CONFIG_LEDS_S3C24XX=y #,对应的文件被编进内核,CONFIG_LEDS_S3C24XX=m #,对应的文件被编成模块,CONFIG_LEDS_S3C24XX #,对应的文件没有被使用,config,条目格式,config,关键字,表示一个配置选项的开始。,config,变量类型:,bool,tristate,string,hex,int,注意:,prompt,关键字可以省略,条件判断,“if expr”,“,prompt” “if” ,注意:省略了前缀,“CONFIG_”,config,条目格式,依赖关系:,缺省值定义:,选择选项:,帮助信息:,“depends on”/ “requires” ,“default” “if” ,“select” “if” ,“,help,”,or,“,-help-,”,config,条目实例分析,Kconfig,文件基本要素:,menu,条目,menu,条目用于生成菜单,格式如下:,“menu” ,“endmenu”,menu “Floating point emulation”,config FPE_NWFPE,config FPE_NWFPE_XP,endmenu,Kconfig,文件基本要素:,choice,条目,choice,条目将多个类似的配置选项组合在一起,供用户单选或多选,格式如下:,“choice”,“endchoice”,choice,prompt “ARM system type”,default ARCH_VERSATILE,config ARCH_AAEC2000,config ARCH_INTEGRATOR,endchoice,Kconfig,文件基本要素:,comment,条目,comment,条目用于定义一些帮助信息,它在配置过程中出现在界面的第一行,.,并且这些 帮助信息会出现在配置文件中,(,作为注释,),,格式如下:,“comment” ,menu “Floating point emulation”,comment “At least one emulation must be selected”,Kconfig,文件基本要素:,source,条目,source,条目用于读入另一个,Kconfig,文件,,格式如下:,配置界面操作方法,配置界面中,以*、,或,开头的选项表示相应功能的文件被编译进内核中、被编译 成一个模块,或者没有使用。尖括号表示相应功能的文件可以被编译成模块。,按,Y,键选择将它编译进内核,按,M,键选择 将它编译成模块,按,键将不使用它。也可以按空格键进行循环选择,例如:,YNMY,。,上,/,下方向键,空格键,“source” ,source “net/Kconfig”,编译内核的步骤,Step1:,拷贝,config_n35,为文件,.config,#cp config_n35 .config,Step2:,修改内核目录下的,Makefile,修改,CROSS_COMPILE ?= arm-linux-,Step3:,执行,make menuconfig,并保存,如果有问题,以,root,权限执行,#make menuconfig,Step4:,编译内核,#make zImage,编译完成后,,zImage,放在,/arch/arm/boot/zImage,Linux,内核配置选项,make menuconfig,配置界面主菜单的类别,配置界面主菜单的类别,“system Type”菜单:系统类型,“,Device Drivers”,菜单:设备驱动程序,阶段总结,Makefile,作用,Kconfig,作用,内核配置编译,Linux,内核启动过程概述,Linux的启动过程可以分为两部分;,架构/开发板相关的引导过程,后续的通用启动过程,Linux,内核启动过程概述,第一阶段:引导阶段,引导阶段通常使用汇编语言编写,它首先检查内核是否支持当前架构的处理器,然后检 查是否支持当前开发板。通过检查后,就为调用下一阶段的,start_kernel,函数作准备了。这主要分如下两个步骤。,(,1,)连接内核时使用的虚拟地址,所以要设置页表、使能,MMU,。,(,2,)调用,C,函数,start_kernel,之前的常规工作,包括复制数据段、清除,BSS,段、调用,start_kernel,函数,Linux,内核启动过程概述,编译内核的步骤,Step1:,拷贝,config_n35,为文件,.config,#cp config_n35 .config,Step2:,修改内核目录下的,Makefile,修改,CROSS_COMPILE ?= arm-linux-,ARM ?= arm,Step3:,执行,make menuconfig,并保存,如果有问题,以,root,权限执行,#make menuconfig,Step4:,编译内核,#make zImage,编译完成后,,zImage,放在,/arch/arm/boot/zImage,引导阶段代码分析,arch/arm/kernel/head.S,是内核执行的第一个文件,78 ENTRY(stext),79msrcpsr_c, #PSR_F_BIT | PSR_I_BIT | MODE_SVC ensure svc mode,80 and irqs disabled,81bl_lookup_processor_type r5=procinfo r9=cpuid,82movsr10, r5 invalid processor (r5=0)?,83beq_error_p yes, error p,84bl_lookup_machine_type r5=machinfo,85movsr8, r5 invalid machine (r5=0)?,86beq_error_a yes, error a,CPU,类型,ID,arch/arm/kernel/head.S,中执行的两个重要工作:,校验,CPU ID,校验机器类型,ID,CPU ID,调用,_lookup_processor_type,函数,确定内核是否支持当前,cpu,位于,arch/arm/kernel/head-common.S,机器类型,ID,_lookup_ machine_type函数,machine_ desc结构中的nr成员,校验,CPU ID,校验机器类型,ID,arch/arm/mach-s3c2440/mach-smdk2440.c,192 MACHINE_START(S3C2440, SMDK2440),/* Maintainer: Ben Dooks */,.phys_io= S3C2440_PA_UART,.io_pg_offst= (u32)S3C24XX_VA_UART) 18) & 0xfffc,.boot_params= S3C2440_SDRAM_PA + 0x100,.init_irq= s3c24xx_init_irq,.map_io= smdk2440_map_io,.init_machine= smdk2440_machine_init,.timer= &s3c24xx_timer,202 MACHINE_END,机器类型,ID,宏MACHINE_ START、MACHINE_ END在include/asm-arm/mach/arch.h文件中定义,上一段代码扩展开,#define MACHINE_START(_type,_name),const struct machine_desc _mach_desc_#_type,_attribute_(_section_(.arch.info) = ,.nr= MACH_TYPE_#_type,.name= _name,#define MACHINE_END,;,static const struct machine_desc _mach_desc_S3C2440,_used,_attribute_(_section_(.arch.info.init) = ,.nr= MACH_TYPE_S3C2440,.name= “SMDK2440”,start_kernel,函数部分代码分析,第二阶段第一个,C,函数:,start_kernel,函数,定义在,init/main.c,中,U-Boot,传给内核的参数有两类:,预先存在某个地址的,tag,列表,调用内 核时在,r1,寄存器中指定的机器类型,ID,其中,setup_arch,函数 是重要初始化函数,setup_arch,函数分析,在arch/arm/kernel/setup.c中定义,内核第二阶段启动过程分析,编译内核,解压内核,配置、编译内核,cd /home/student,tar xvzf linux-2.6.29.tgz,cp config_mini2440_n35 .config,make menuconfig,make zImage,烧写、启动内核,烧写内核,启动内核,tftp 0x32000000 uImage,nand erase 0x50000 0x200000,nand write.jffs2 0x32000000 0x50000 0x200000,bootm 0x32000000,本章结构,Linux,内核配置,Linux,内核分析,内核源码结构及Makefile分析,Linux,内核配置选项,内核的,Kconfig,分析,Linux,版本及特点,Linux,内核启动流程分析,Linux内核启动过程概述,编译、烧写、启动内核,修改内核以支持,S3C2440,开发板,获取内核源,如何配置、编译内核,分析内核的启动流程,实验,任务一、,Linux,内核的编译与下载,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 小学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!