嵌入式课程设计.docx
- 文档编号:12322935
- 上传时间:2023-04-18
- 格式:DOCX
- 页数:17
- 大小:41.15KB
嵌入式课程设计.docx
《嵌入式课程设计.docx》由会员分享,可在线阅读,更多相关《嵌入式课程设计.docx(17页珍藏版)》请在冰豆网上搜索。
嵌入式课程设计
嵌入式课程设计
嵌入式linux内核编译与裁剪
姓名:
白潇
学号:
200705030123
老师:
冷小鹏
一.Linux内核分析
1.操作系统
一个完整可用的操作系统主要由4部分组成:
硬件、操作系统内核、操作系统服务和用户应用程序,
用户应用程序是指那些字处理程序、Internet浏览器程序或用户自行编制的各种应用程
序;操作系统服务程序是指那些向用户所提供的服务被看作是操作系统的部分功能的程序。
在Linux操
作系统上,这些程序包括X窗口系统、shell命令解释系统以及那些内核编程接口等系统程序;操作系
统内核程序即是本书所感兴趣的部分,它主要用于对硬件资源的抽象和访问调度。
用户应用程序
操作系统服务
操作系统内核
硬件系统
2.操作系统组成部分
Linux内核的主要用途就是为了与计算机硬件进行交互,实现对硬件部件的编程控制和接口操作,
调度对硬件资源的访问,并为计算机上的用户程序提供一个高级的执行环境和对硬件的虚拟接口。
3.Linux内核模式
操作系统内核的结构模式主要可分为整体式的单内核模式和层次式的微内核模式。
单内核模式的主要优点是内核代码结构紧凑、执行速度快,不足之处主要是层次结构性不强。
在单内核模式的系统中,操作系统所提供服务的流程为:
应用主程序使用指定的参数值执行系统调
用指令(intx80),使CPU从用户态(UserMode)切换到核心态(KernelModel),然后操作系统根据具
体的参数值调用特定的系统调用服务程序,而这些服务程序则根据需要再底层的一些支持函数以完成特
定的功能。
在完成了应用程序所要求的服务后,操作系统又从核心态切换回用户态,返回到应用程序中
继续执行后面的指令。
因此概要地讲,单内核模式的内核也可粗略地分为三个层次:
调用服务的主程序
层、执行系统调用的服务层和支持系统调用的底层函数。
主程序
系统服务
支持函数
4.单内核模式的简单结构模型
Linux内核系统体系结构
Linux内核主要由5个模块构成,它们分别是:
进程调度模块、内存管理模块、文件系统模块、进程间通信模块和网络接口模块。
进程调度模块用来负责控制进程对CPU资源的使用。
所采取的调度策略是各进程能够公平合理地访问CPU,同时保证内核能正时地执行硬件操作。
内存管理模块用于确保所有进程能够安全地共享机器主内存区,同时,内存管理模块还支持虚拟内存管理方式,使得Linux支持进程使用比实际内存空间更多大的内存容量。
并可以利用文件系统把暂时不用的内存数据块会被交换到外部存储设备上去,当需要时再交换回来。
文件系统模块用于支持对外部设备的驱动和存储。
虚拟文件系统模块通过向所有的外部存储设备提供一个通用的文件接口,隐藏了各种硬件设备的不同细节。
从而提供并支持与其它操作系统兼容的多种文件系统格式。
进程间通信模块子系统用于支持多种进程间的信息交换方式。
网络接口模块提供对多种网络通信标准的访问并支持许多网络硬件。
进程调度进程间通信
内存管理
虚拟文件系统
文件系统
网络接口
5.Linux内核系统模块结构及相互依赖关系
所有的模块都与进程调度模块存在依赖关系。
因为它们都需要依靠进程调度程序来挂起(暂停)或重新运行它们的进程。
通常,一个模块会在等待硬件操作期间被挂起,而在操作完成后才可继续运行。
例如,当一个进程试图将一数据块写到软盘上去时,软盘驱动程序就可能在启动软盘旋转期间将该进程置为挂起等待状态,而在软盘进入到正常转速后再使得该进程能继续运行。
另外3个模块也是由于类似的原因而与进程调度模块存在依赖关系。
其它几个依赖关系有些不太明显,但同样也很重要。
进程调度子系统需要使用内存管理器来调整一特定进程所使用的物理内存空间。
进程间通信子系统则需要依靠内存管理器来支持共享内存通信机制。
这种通信机制允许两个进程访问内存的同一个区域以进行进程间信息的交换。
虚拟文件系统也会使用网络接口来支持网络文件系统(NFS),同样也能使用内存管理子系统来提供内存虚拟盘(ramdisk)设备。
而内存管理子系统也会使用文件系统来支持内存数据块的交换操作。
除了这些图中已经给出的依赖关系以外,所有这些模块还会依赖于内核中的通用资源。
这些资源包括内核所有子系统都会调用的内存分配和收回函数、打印警告或出错信息函数以及一些系统调试函数。
6.Linux内核源代码的目录结构
由于Linux内核是一种单内核模式的系统,因此,内核中所有的程序几乎都有紧密的联系,它们之间的依赖和调用关系非常密切。
所以在阅读一个源代码文件时往往需要参阅其它相关的文件。
因此有必要在开始阅读内核源代码之前,先熟悉一下源代码文件的目录结构和安排。
Linux内核完整的源代码目录,包括其中的子目录。
然后逐一介绍各个目录中所包含程序的主要功能,使得整个内核源代码的安排形式能在我们的头脑中建立起一个大概的框架,使用tar命令将linux-0.11.tar.gz解开时,内核源代码文件被放到了linux目录中。
其中的目录结构为:
linux
├─boot系统引导汇编程序
├─fs文件系统
├─include头文件(*.h)
│├─asm与CPU体系结构相关的部分
│├─linuxLinux内核专用部分
│└─sys系统数据结构部分
├─init内核初始化程序
├─kernel内核进程调度、信号处理、系统调用等程序
│├─blk_drv块设备驱动程序
│├─chr_drv字符设备驱动程序
│└─math数学协处理器仿真处理程序
├─lib内核库函数
├─mm内存管理程序
└─tools生成内核Image文件的工具程序
该内核版本的源代码目录中含有14个子目录,总共包括102个代码文件。
二.Linux内核编译
1.内核
负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。
2.内核版本号
由于Linux的源程序是完全公开的,任何人只要遵循GPL,就可以对内核加以修改并发布给他人使用。
Linux的开发采用的是集市模型(bazaar,与cathedral--教堂模型--对应),为了确保这些无序的开发过程能够有序地进行,Linux采用了双树系统。
一个树是稳定树(stabletree),另一个树是非稳定树(unstabletree)或者开发树(developmenttree)。
一些新特性、实验性改进等都将首先在开发树中进行。
如果在开发树中所做的改进也可以应用于稳定树,那么在开发树中经过测试以后,在稳定树中将进行相同的改进。
一旦开发树经过了足够的发展,开发树就会成为新的稳定树。
到目前为止,稳定树的最高版本是2.2.16,最新发布的Redhat7.0所采用的就是2.2.16的内核。
为了正确的合理地设置内核编译配置选项,从而只编译系统需要的功能的代码,一般主要有下面四个考虑:
a自己定制编译的内核运行更快(具有更少的代码)b系统将拥有更多的内存(内核部分将不会被交换到虚拟内存中)c不需要的功能编译进入内核可能会增加被系统攻击者利用的漏洞d将某种功能编译为模块方式会比编译到内核内的方式速度要慢一些
3.内核编译模式
如果编译到内核中,在内核启动时就可以自动支持相应部分的功能,这样的优点是方便、速度快,机器一启动,你就可以使用这部分功能了;缺点是会使内核变得庞大起来 如果编译成模块,就会生成对应的.o文件,在使用的时候可以动态加载,优点是不会使内核过分庞大,缺点是得自己来调用这些模块。
新版本内核的获取和更新:
linux-2.4.0-test8.tar.bz218M
将需要升级的内核拷贝到/usr/src/下,命令为
#cplinux-2.4.0test8.tar.gz/usr/src
#cd/usr/src
#rm-flinux
现在解压下载的源程序文件。
命令:
#tar-xzvflinux-2.4.0test8.tar.gz
防止在升级内核的时候会不慎把原来版本内核的源程序给覆盖掉了。
处理:
#mvlinuxlinux-2.4.0test8
#ln-slinux-2.4.0test8linux
下载了patch文件,patch-2.4.0test8,进行patch操作(下面假设patch-2.4.0test8已经位于/usr/src目录下了,):
#patch-p0 现在,把内核源程序升级到最新版本了,开始内核编译。 4.内核编译 准备工作 运行命令是: #cd/usr/src/linux;makemrproper 该命令确保源代码目录下没有不正确的.o文件以及文件的互相依赖。 确保/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链接后,再创建新的链接指向新内核源代码目录下的同名的目录。 这些头文件目录包含着保证内核在系统上正确编译所需要的重要的头文件。 5.配置 配置内核使用下面命令中: #makeconfig(基于文本的最为传统的配置界面,不推荐使用) #makemenuconfig(基于文本选单的配置界面,字符终端下推荐使用) #makexconfig(基于图形窗口模式的配置界面,Xwindow下推荐使用) #makeoldconfig(如果只想在原来内核配置的基础上修改一些小地方,会省去不少麻烦) Y--将该功能编译进内核 N--不将该功能编译进内核 M--将该功能编译成可以在需要时动态插入到内核中的模块 使用的makexconfig,使用鼠标就可以选择对应的选项。 使用是makemenuconfig,需要使用空格键进行选取。 将与内核其它部分关系较远且不经常使用的部分功能代码编译成为可加载模块,有利于减小内核的长度,减小内核消耗的内存,简化该功能相应的环境改变时对内核的影响;不需要的功能就不要选;与内核关心紧密而且经常使用的部分功能代码直接编译到内核中。 1.Codematurityleveloptions 代码成熟等级。 此处只有一项: promptfordevelopmentand/orincompletecode/drivers,试验现在仍处于实验阶段的功能khttpd、IPv6等,选择为Y了; 2.Loadablemodulesupport Enableloadablemodulesupport: 必选 Setversioninformationonallmodulesymbols: 不选它。 Kernelmoduleloader: 让内核在启动时有自己装入必需模块的能力,选上。 3.Processortypeandfeatures CPU类型。 Processorfamily: 选择CPU类型。 HighMemorySupport: 不选。 Mathemulation: 协处理器仿真。 MTTRsupport: MTTR支持。 不选。 Symmetricmulti-processingsupport: 不选。 4.Generalsetup最普通的一些属性进行设置。 Networkingsupport: 网络支持。 必须, PCIaccessmode: PCI存取模式。 可供选择的有BIOS、Direct和Any,选Any。 Supportforhot-pluggabeldevices: 热插拔设备支持。 不选。 PCMCIA/CardBussupport: PCMCIA/CardBus支持。 有PCMCIA必选。 SystemVIPC BSDProcessAccounting Sysctlsupport: 缺省。 PowerManagementsupport: 电源管理支持。 AdvancedPowerManagementBIOSsupport: 高级电源管理BIOD支持。 5.MemoryTechnologyDevice(MTD) MTD设备支持。 不选。 6.Parallelportsupport 串口支持。 7.PlugandPlayconfiguration 即插即用支持。 8.Blockdevices 块设备支持。 NormalPCfloppydisksupport: 普通PC软盘支持。 必选。 XTharddisksupport: CompaqSMART2support: MulexDAC960/DAC1100PCIRAIDControllersupport: RAID镜像。 9.Networkingoptions网络选项。 10.TelephonySupport 11.ATA/IDE/MFM/RLLsupport 12.SCSIsupport 。 13.IEEE1394(FireWire)support不选。 14.I2Odevicesupport 不选。 15.Networkdevicesupport网络设备支持。 16.AmateurRadiosupport不选 17.IrDA(infrared)support不选 18.ISDNsubsystem不选 19.OldCD-ROMdrivers(notSCSI、notIDE)不选 20.Characterdevices 21.Filesystems文件系统。 22.Consoledrivers 控制台驱动。 23.Sound 声卡驱动。 24.USBsupprot USB支持。 25.Kernelhacking 配置完,存盘退出。 6.编译 #makedep #makeclean #makezImage #makebzImage #makemodules #makemodules_install #depmod-a 更新后得到了新版本的内核。 改动: #cp/usr/src/linux/System.map/boot/System.map-2.4.0test8 #cp/usr/src/linux/arch/i386/bzImage/boot/vmlinuz-2.4.0test8 #cd/boot;rm-fSystem.mapvmlinuz #ln-svmlinuz-2.4.0test8vmlinuz #ln-sSystem.map-2.4.0test8System.map 然后修改/etc/lilo.conf: #vi/etc/lilo.conf 增加如下一段: image=/boot/vmlinuz-2.4.0test8 label=linux240 read-only root=/dev/hda2 其中root=/dev/hda2运行: #/sbin/lilo-v 确认对/etc/lilo.conf的编辑无误,现在重新启动系统: #shutdown-rnow 三.Linux内核裁剪的具体过程 在menuconfig中配置: 详细介绍内核配置选项及删改情况 第一部分: 全部删除 Codematurityleveloptions--->代码成熟等级选项 []Promptfordevelopmentand/orincompletecode/drivers 第二部分: 除以下选项,其它全部删除 Generalsetup—〉 SystemVIPC(IPC: InterProcessCommunication) 第三部分: 除以下选项,其它全部删除 Loadablemodulesupport---> []Enableloadablemodulesupport 第四部分: 全部删除 Blocklayer-----〉块设备 第五部分: 除以下选项,其它全部删除 Processortypeandfeatures--->处理器类型 SubarchitectureType(PC-compatible)--->使Linux可以支持多种PC标准,使用的PC机是遵循所谓IBM兼容结构(pc/at)。 选择一些其它架构。 选择PC-compatible。 Processorfamily(386): 对每种CPU做最佳化,让它跑的好又快,选的是386 第六部分: 除以下选项,其它全部删除 Powermanagementoptions(ACPI,APM)--->电源管理选项 []PowerManagementDebugSupport电源管理的调试信息支持, ACPISupport---〉高级电源接口配置支持, []Button这个选项用于注册基于电源按钮的事件, 第七部分: 除以下选项,其它全部删除 Busoptions(PCI,PCMCIA,EISA,MCA,ISA)--->总线选项 []PCIsupport PCIaccessmode(Any)--->PCI外围设备配置,选Any,系统将优先使用MMConfig,然后使用BIOS,最后使用Direct检测PCI设备。 第八部分: 除以下选项,其它全部删除 Executablefileformats---> KernelsupportforELFbinariesELF是开放平台下最常用的二进制文件,它支持不同的硬件平台。 要选。 第九部分: 除以下选项,其它全部删除 Networking Networkingoptions---> []Unixdomainsockets []TCP/IPnetworking 第十部分: 除以下选项,其它全部删除 DeviceDrivers--->设备驱动 Blockdevices-------〉 []CompaqSMART2support []CompaqSmartArray5xxxsupport []Loopbackdevicesupport []RAMdisksupport SCSIdevicesupport--->里面有关于USB支持的,要选择 []SCSIdevicesupportUSB要用,必须选择 []legacy/proc/scsi/supportUSB要用,必须选择 []SCSIdisksupportUSB要用,必须选择 SCSILow-leveldrivers []SerialATA(SATA)support []IntelPIIX/ICHSATAsupport 这个必须选择,否则无法产生引导文件 []ViaSATAsupport Networkingdevicesupport--->这个下面是选网卡驱动,一定要选 Ethernet(1000mbit)-我的电脑是千兆网卡所以就选这个 []broadcomTigon3support Inputdevicesupport--->这个里面要设置你的鼠标键盘什么的 []Providelegacy/dev/psauxdevice Graphicssupport---> []Supportforframebufferdevices支持Framebuffer的,一定要选择 USBsupport---> []USBdevicefilesystem这个好象是用U盘必须的 []EHCIHCD(USB2.0)support有usb2.0就选上把,编译成模块 []OHCIHCDsupport必须选择,编译成模块 []UHCIHCD(mostIntelandVIA)support必须选择,编译成模块 []USBMassStoragesupport用U盘必须选择 USBHumanInterfaceDevice(fullHID)support里面选择usb鼠标和usb键盘, HIDinputlayersupport选择 /dev/hiddevrawHIDdevicesupport选择 第十一部分: 除以下选项,其它全部删除 filesystems--->文件系统 <*>Secondextendedfssupport [*]Ext2extendedattributes [*]Ext2POSIXAccessControlLists [*]Ext2SecurityLabels [*]Ext3extendedattributes [*]Ext3POSIXAccessControlLists [*]Ext3SecurityLabels DOS/FAT/NTFilesystems---> Nativelanguagesupport语言支持,这里就支持英语和汉语就行了,不多说了 []NLSISO8859-1必须选择,这个是关于U盘挂载的。 CD-ROM/DVDFilesystems--->这个是关于挂载ISO文件的 <*>ISO9660CDROMfilesystemsupport 第十二部分: 全部删除 Instrumentationsupport 第十三部分: 全部删除 Kernelhack
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 课程设计