L10-嵌入式Linux开发-内核_第1页
L10-嵌入式Linux开发-内核_第2页
L10-嵌入式Linux开发-内核_第3页
L10-嵌入式Linux开发-内核_第4页
L10-嵌入式Linux开发-内核_第5页
已阅读5页,还剩75页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

嵌入式Linux开发

—内核

2024/3/221主要内容Linux内核简介Linux内核体系结构Linux内核目录结构ARM-Linux内核启动分析ARM-Linux系统调用Linux内核配置2024/3/222Linux内核简介在计算机技术的开展史上,Unix的出现是一个重要的里程碑。免费源代码Unix的两大主流BSD版本的UnixSystemV版本的UnixPOSIX标准2024/3/223Linux内核简介AndrewS.TanenbaumUnix商业版本缺乏实用性“类Unix”--MinixLinusTorvalds公布于互联网FSF支持GNU/LinuxGPL使自由软件及其衍生产品继续保持开放状态,从整体上促进软件的共享和重复使用实用的UnixLinux类Unix--GNU2024/3/224Linux内核简介Linux版本的规定〔〕x介于0到9之间x标志着内核在设计上或实现上的重大改变yy介于0到99之间yy偶数表示相对稳定,已经发行的版本yy奇数表示开发中的版本zz介于0到99之间zz内核增加内容不是很多,改动不大2024/3/225Linux内核简介2024/3/226Linux内核简介Linux开发过程基于天才的思想开发而成基于Unix等各种操作系统的优点公开的开发过程是其最强大的生命力://2024/3/227Linux内核简介主要发行商:2024/3/228Linux内核体系结构2024/3/229Linux内核体系结构概述内核系统结构图2024/3/2210Linux内核体系结构概述2024/3/2211Linux内核源代码目录概述2024/3/2212第一级文件结构〔1〕init内核初始化代码

kernel内核核心部分:进程、定时、程序执行、信号、模块。。。

mm内存管理

arch平台相关代码fs文件系统

net网络代码

2024/3/2213第一级文件结构〔2〕ipc的进程间通信

drivers设备驱动程序

lib通用内核函数

include头文件(.h)

scripts生成内核映像的外部程序Documentation有关内核各个部分的通用解释和注释的文本文件2024/3/2214Arch平台相关代码文件arch平台相关代码i386IBM的PC体系结构

alpha康柏的Alpha体系结构

s390IBM的System/390体系结构sparcSun的SPARC体系结构sparc64Sun的Ultra-SPARC体系结构mipsSGI的MIPS体系结构ppcMotorola-IBM的基于PowerPC的体系结构m68kMotorola的基于MC680x0的体系结构arm基于ARM处理器的体系结构2024/3/2215fs文件系统〔1〕ext2Linux本地的Ext2文件系统

nfs网络文件系统(NFS)

fat基于FAT的文件系统的通用代码

vfat微软的Windows文件系统(VFAT)

ntfs微软的WindowsNT文件系统

umsdosUMSDOS文件系统

proc/proc虚拟文件系统

devpts/dev/pts虚拟文件系统

isofsISO9660文件系统(CD-ROM)

nfsd集成的网络文件系统服务器

msdos微软的MS-DOS文件系统

nls本地语言支持

smbfs微软的Windows服务器消息块(SMB)文件系统

2024/3/2216fs文件系统〔2〕

sysvSystemV、SCO、Xenix、Coherent和Version7文件系统

ufsUnixBSD、SunOs、FreeBSD、NetBSD、OpenBSD和NeXTStep文件系统

codaCoda网络文件系统

adfsAcorn磁盘填充文件系统

qnx4QNX4OS使用不的文件系统

autofs目录自动装载程序的支持

minixMINIX文件系统

hpfsIBM的OS/2文件系统

ncpfsNovell的Netware核心协议(NCP0affsAmiga的快速文件系统(FFS)

hfs苹果的Macintosh文件系统

efsSGIIRIX的EFS文件系统

romfs只读小文件系统

lockd远程文件锁定的支持

2024/3/2217Drivers设备驱动程序〔1〕sound音频卡设备

char字符设备驱动程序

cdrom专用CD-ROM设备(除ATAPI和SCSI之外)

apl000富士的AP1000设备

sgiSGI的设备

acornAcorn的设备

block块设备驱动程序

scsiSCSI设备驱动程序

net网卡设备

video视频卡设备

isd0nISDN设备

macintosh苹果的Macintosh设备

fc4光纤设备

misc杂项设备

paride从并口访问IDE设备的支持

joystick游戏杆

ftape磁带流设备

hfmodem无线电设备

ip2IntelliPort的多端口串行控制器

2024/3/2218Drivers设备驱动程序〔2〕pciPCI总线的支持

nubus苹果的MacintoshNubus的支持

dio惠普的HP300DIO总线的支持

pnp即插即用的支持

usb通用串行总线(USB)的支持

sbusSun的SPARCSBus的支持

zorroAmiga的Zorro总线的支持

tcSun的TurboChannel支持(尚未完成)

2024/3/2219Include头文件〔.h〕asm-alpha康柏的Alpha体系结构

asm-m68kMotorola-IBM的基于PowerPC的体系结构

asm-s390IBM的System/390体系结构

asm-sparc64Sun的Ultra-SPARC体系结构

net网络

linux内核核心部分

asm-generic平台无关低级头文件

asm-i386IBM的PC体系结构

asm-mipsSGI的MIPS体系结构

asm-ppcMotorola-IBM的PowerPC体系结构

asm-sparcSun的SPARC体系结构

asm-arm基于ARM处理器的体系结构

video视频卡支持

lockd远程文件加锁

nfsd集成的网络文件服务器

sunrpcSun的远程过程调用

byteorder字节交换函数

modules模块支持

scsiSCSI支持

config定义内核配置的宏所在的头文件

2024/3/2220ARM-Linux内核启动代码分析

2024/3/2221Arm-linux的启动和初始化内核的初始化是一个非常漫长的过程,整个过程可以分为三个阶段:第一个阶段主要是找到Linux内核的入口地址开启Cache和MMU,解压缩内核;第二个阶段跳入C语言函数,调用大量的初始化函数,完成内核的各种初始化;第三个阶段是创立启动第一个内核线程init(),完成各种外部设备的初始化;挂载根文件系统。2024/3/2222Arm-linux的启动和初始化—第一阶段第一个阶段主要是找到Linux内核的入口地址开启Cache和MMU,解压缩内核;Linux/arch/arm/kernel/head.S/arch/arm/boot/compressed/misc.cdecompress_kernel()2024/3/2223第二个阶段跳入C语言函数,调用大量的初始化函数,完成内核的各种初始化;Linux/init/main.c输出Linux版本信息〔printk(linux_banner)〕设置体系结构相关的环境(setup_arch())页表结构初始化(paging_init(),在setup_arch())中完成)Arm-linux的启动和初始化—第二阶段2024/3/2224Arm-linux的启动和初始化〔1〕解析内核命令行参数(parse_options())设置系统自陷入口(trap_init())初始化系统IRQ(init_IRQ())内核进程调度器机制初始化(sched_init())时间、定时器初始化(包括读取CMOS时钟,评测主频和初始化定时器中断等,time_init())软中断初始化(softirq_init())控制台初始化(为输出信息而先于PCI初始化,console_init())2024/3/2225Arm-linux的启动和初始化〔2〕可安装模块机制初始化(init_modules())释放命令行和参数块等占用的物理内存,收集和计算出一些统计信息(mem_init())内核cache初始化(kmem_cache_init())延时校准(获得时钟jiffies与CPU主频ticks的延迟,calibrate_delay())根据物理内存大小,计算可创立线程〔包含进程〕数量(fork_init())启动init过程,创立第一个内核线程,调用init()函数。至此,start_kernel()结束,根本的内核环境已经建立起来2024/3/2226Arm-linux的启动和初始化—第三阶段Init()的执行总线初始化(比方pci_init())网络初始化(sock_init())创立事件管理内核线程,重命名为keventd(start_context_thread()).启动任何使用_initcall表示的函数,方便内核开发者添加启动函数(do_initcall())设备初始化,包括并口、字符设备、块设备等。文件系统初始化(filesystem_setup())安装root文件系统(mount_root())2024/3/2227ARM-Linux系统调用

2024/3/2228系统调用系统调用是操作系统提供的效劳,用户程序通过各种系统调用,来引用内核提供的各种效劳,系统调用的执行让用户程序陷入内核。系统调用是应用程序从用户空间进入内核空间的唯一途径。在x86处理器上,Linux系统调用是通过自陷指令“INT0x80”实现的。对于ARM处理器,其自陷指令是swi或svc。2024/3/2229Linux内核配置2024/3/2230Linux的模块机制Linux中的可加载模块是Linux内核支持的动态可加载模块,它们是内核的一局部,但是并没有编译到内核中去。模块可以单独编译成目标代码,以.o的目标文件形式存在。它可以根据需要在系统启动后动态加载到系统内核中。当模块不再被需要时,可以动态的卸载出系统内核。Linux中大多数设备驱动程序都以模块形式存在。超级用户可以通过insmod和rmmod命令将模块装入或卸载。2024/3/2231Linux内核编译为什么重新编译内核?Linux是一个自由软件,内核版本不断更新,并增加了许多特性根据自身系统,定制更高效、更稳定内核的需要更新的版本支持更多的硬件,具备更好的进程管理能力,运行速度更快、更稳定,并一般会修复老版本中的bug。经常性地选择升级更新的系统内核是Linux使用者的必要操作内容2024/3/2232Linux内核编译配置原那么正确合理设置内核编译配置选项的根本原那么自己定制编译的内核运行更快〔具有更少的代码〕不需要的功能编译进入内核可能会增加被系统攻击者利用的漏洞将某种功能编译为模块方式会比编译到内核内的方式速度要慢一些2024/3/2233Linux内核编译模式把component编译到内核中(build-in)优点:在内核启动时就可以自动支持相应局部的功能,这样的优点是方便、速度快,机器一启动,你就可以使用这局部功能了缺点:内核变得肥大,不管你是否需要这局部功能,它都会存在,也是Windows惯用的招数把component编译成模块〔module〕,生成对应的.o文件,动态调用。优点:不会使内核过分庞大缺点:需要自己来调用这些模块,速度相对会较慢2024/3/2234新版本内核的获取和更新linux内核版本发布的官方网站发布形式:一种是full/Source版本,另外一种是patch文件,即补丁。完整内核版本较大,一般是tar.gz或者是.bz2文件,二者分别是使用gzip或者bzip2进行压缩的文件,使用时需要解压缩。patch文件那么比较小,一般只有几十K到几百K,但是patch文件是针对于特定的版本的,你需要找到自己对应的版本才能使用。2024/3/2235内核编译根本知识〔1〕编译内核需要root权限一般把内核拷贝到/usr/src/下,#cplinux-2.6.5.tar.gz/usr/src删除该目前下存在的linux目录链接解压缩源代码如果所下载的是.tar.gz〔.tgz〕文件#tar-zxvf如果所下载的是.bz2文件#tar-xvf2024/3/2236内核编译根本知识〔2〕文件解压到/usr/src/linux目录,然后稍作修改#mvlinux#ln-slinux-2.6.5linux如果下载的是patch文件,就可以进行patch操作〔下面假设已经位于/usr/src目录下了,否那么你需要先把该文件拷贝到/usr/src下〕:

2024/3/2237内核编译步骤〔1〕通常要运行的第一个命令是#cd/usr/src/linux#makemrproper该命令确保源代码目录下没有不正确的.o文件以及文件的互相依赖。由于我们使用刚下载的完整的源程序包进行编译,所以本步可以省略。而如果你屡次使用了这些源程序编译内核,那么最好要先运行一下这个命令。2024/3/2238内核编译步骤〔2〕确保/usr/include/目录下的asm、linux和scsi等链接是指向要升级的内核源代码。它们分别链向源代码目录下的真正的、该计算机体系结构〔对于PC机来说,使用的体系结构是i386〕所需要的真正的include子目录。如:asm指向/usr/src/linux/include/asm-i386等。假设没有这些链接,就需要手工创立,按照下面的步骤进行:#cd/usr/include/#rm-rasmlinuxscsi#ln-s/usr/src/linux/include/asm-i386asm#ln-s/usr/src/linux/include/linuxlinux#ln-s/usr/src/linux/include/scsiscsi这是配置非常重要的一局部。删除掉/usr/include下的asm、linux和scsi链接后,再创立新的链接指向新内核源代码目录下的同名的目录。这些头文件目录包含着保证内核在系统上正确编译所需要的重要的头文件2024/3/2239内核编译步骤〔3〕详细配置内核,配置内核可以根据需要与爱好使用下面命令中的一个:#makeconfig〔基于文本的最为传统的配置界面,不推荐使用〕#makemenuconfig〔基于文本选单的配置界面,字符终端下推荐使用〕#makexconfig〔基于图形窗口模式的配置界面,Xwindow下推荐使用〕#makeoldconfig〔如果只想在原来内核配置的根底上修改一些小地方,会省去不少麻烦〕2024/3/2240内核编译步骤〔4〕配置完后,存盘退出,当然你也可以把现在的配置文件保存起来,这样下次再配置的时候就省力气了。接下来是编译,输入以下命令:#makedepmakedep实际上读取配置过程生成的配置文件,来创立对应于配置的依赖关系树,从而决定哪些需要编译而那些不需要2024/3/2241内核编译步骤〔5〕#makeclean完成删除前面步骤留下的文件,以防止出现一些错误#makebzImage或makezImage实现完全编译内核,二者生成的内核都是使用gzip压缩的,只要使用一个就够了,它们的区别在于使用makebzImage可以生成大一点的内核。2024/3/2242内核配置主要工程简介〔1〕Codematurityleveloptions

这个选项的作用域是整个编译配置空间,如果这里选中相应的级别,不符合此条件的选项就不会在后面出现。这个选项是代码的成熟程度的选择,意思是如果你需要一个非常成熟稳定的系统,那么有些新功能就不能使用,一个包含有新功能的系统就可能存在相应的风险。可以根据你自己的需求选择。2024/3/22432024/3/2244内核配置主要工程简介〔2〕Loadablemodulesupport

这个选项是你的内核对内核模块的支持选项,包括是否支持和支持的一些配置等,选择此项会使一些不常用到的驱动或特性可以编译为模块以减少内核的体积。2024/3/22452024/3/2246内核配置主要工程简介〔3〕SystemType选择对系统的支持,如什么样的ARM内核,什么样的配置平台等,如果使用不同的处理器其系统或是不同的内核时此处的选项可能不同。2024/3/22472024/3/2248内核配置主要工程简介〔4〕GeneralSetup这里是内核本身的一些属性的配置,包括压缩方式,网络支持等很多属性。2024/3/22492024/3/2250内核配置主要工程简介〔5〕Parallelportsupport这个选项顾名思义就是选择内核对并口的支持情况,中选中对并口支持后会出现新的选项来配置支持不同类型不同模式的并口。2024/3/22512024/3/2252内核配置主要工程简介〔6〕MemoryTechnologyDevices(MTD)对MTD设备的支持选项,这个选项对嵌入式系统比较重要,内核对各种Flash的支持都在这里配置,包括种类,分区等。2024/3/22532024/3/2254内核配置主要工程简介〔7〕PlugandPlayconfiguration内核对即插即用的支持选项,这个选项在嵌入式系统中极少使用。2024/3/22552024/3/2256内核配置主要工程简介〔8〕Blockdevices

内核对块设备的支持选项,各种磁盘系统的支持2024/3/22572024/3/2258内核配置主要工程简介〔10〕Networkingsupport对网络设备的支持选项,通

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论