*******************实践教学*******************兰州理工大学计算机与通信学院2014年秋季学期Linux与嵌入式系统课程设计题目:LINUX内核移植和编译专业班级:物联网二班姓名:赵飞学号:12280213指导教师:马维俊成绩:Linux与嵌入式系统课程设计1摘要嵌入式系统是面向用户、面向产品、面向应用的,它必须与具体应用相结合才会具有生命力、才更具有优势。因此可以这样理解上述三个面向的含义,即嵌入式系统是与应用紧密结合的,它具有很强的专用性,必须结合实际系统需求进行合理的裁减利用。嵌入式系统是以应用为中心,以计算机技术为基础,软硬件可定制,适用于不同应用场合,对功能,可靠性,成本,体积,功耗有严格要求的专用计算机系统。它一般由嵌入式微处理器,外围硬件设备,嵌入式操作系统,用户应用程序4个部分组成。它在于结合微处理器或微控制器的系统电路与其专用的软件,来达到系统运作效率成本的最优化。用于实现对其他设备的控制,监视或管理等功能。嵌入式系统已经广泛应用于科学研究,工业控制,军事技术,交通通信,医疗卫生,消费娱乐等领域,人们常用的手机,PDA,汽车,智能家电,GPS等均是嵌入式系统的典型代表。而Linux内核移植是嵌入式系统不可缺少的步骤,一个真正的嵌入式系统要完成一些功能,必须有相应的程序支持。关键词:Linux内核、编译、程序Linux与嵌入式系统课程设计2目录前言.....................................................3一.基本原理.............................................41.1.Linux发展历史.....................................41.2.Linux内核目录结构.................................51.3.Linux内核配置及裁剪.............................1111.4.内核中的Kconfig和Makefile.......................25二.详细设计............................................282.1.编写实验代码helloworld.c.........................282.2.修改Kconfig文件,添加菜单支持...................282.3.修改Makefile文件,添加编译支持..................292.4.配置内核对helloworld程序的支持..................292.5.重新编译内核.....................................312.6.烧写程序.........................................32参考文献................................................34致谢....................................................35附......................................................36Linux与嵌入式系统课程设计3前言操作系统是一个用来和硬件打交道并为用户程序提供一个有限服务集的低级支撑软件。一个计算机系统是一个硬件和软件的共生体,它们互相依赖,不可分割。计算机的硬件,含有外围设备、处理器、内存、硬盘和其他的电子设备组成计算机的发动机。但是没有软件来操作和控制它,自身是不能工作的。完成这个控制工作的软件就称为操作系统,在Linux的术语中被称为“内核”,也可以称为“核心”。Linux内核的主要模块(或组件)分以下几个部分:存储管理、CPU和进程管理、文件系统、设备管理和驱动、网络通信,以及系统的初始化(引导)、系统调用等。Linux内核本身并不是操作系统,它是一个完整操作系统的组成部分。RedHat、Novell、Debian和Gentoo等Linux发行商都采用Linux内核,然后加入更多的工具、库和应用程序来构建一个完整的操作系统。内核既是操作系统的心脏,也是它的大脑,因为内核控制着基本的硬件内核是操作系统的核心,具有很多最基本功能,如虚拟内存、多任务、共享库、需求加载、共享的写时拷贝(copy-on-write)可执行程序和TCP/IP网络功能。Linux与嵌入式系统课程设计4一.基本原理1.1.Linux发展历史自1991年11月由芬兰的LinusTtorvalds推出Linux0.1.0版内核至今,Linux内核已经升级到Linux2.6.31(写本文档时,内核)。其发展速度是如此的迅猛,是目前市场上唯一可以挑战Windows的操作系统。如图1.1.1所示图1.1.1Linux内核发展Linux内核在其发展过程中得到分布于全世界的广大OpenSource项目追随者的大力支持。尤其是一些曾经参与Unix开发的人员,他们把应用于Unix上的许多应用程序移植到Linux上来,使得Linux的功能得到巨大的扩展。目前比较稳定的版本是Linux2.6.24。在Linux的版本号中,第一个数为主版本号。第二个为次版本号。第三个为修订号。次版本号为偶数表明是稳定发行版本,奇数则是在开发中的版本。随着其功能不断加强,灵活多样的实现加上其可定制的特性以及开放源码的优势,Linux在各个领域的应用正变得越来越广泛。目前Linux的应用正有舍去中间奔两头的趋势,即在PC机上Linux要真正取代Windows,或许还有很长的路要走,但在服务器市场上它已经牢牢站稳脚跟。而随着嵌入式领域的兴起更是为Linux的长足发展提供了无限广阔的空间。目前专门针对嵌入式设备的Linux改版就有好几种。包括针对无MMU的uClinx和针对有MMU的标准LINUX在各个硬件体系结构的移植版本。基于像S5PV210这样的S5PV210内核Linux与嵌入式系统课程设计5的ARM-LINUX使用了MMU的内存管理,对进程有保护,提高了嵌入式系统中多进程的保护能力。使用户应用程序的可靠性得以提高,降低了用户的开发难度。1.2.Linux内核目录结构UP-CUP210-II型网关部分平台运行的Linux内核版本为linux-2.6.35.7,其源码目录结构如图:arch与体系结构相关的代码全部放在这里,如图所示,我们的实验设备中使用的是其中的arm目录。Documentation这里存放着内核的所有开发文档,如图所示,其中的文件会随版本的演变发生变化,通过阅读这里的文件是获得内核最新的开发资料的最好的地方。Linux与嵌入式系统课程设计6Drivers此目录包括所有的驱动程序,如图所示,下面又建立了多个目录,分别存放各个分类的驱动程序源代码。下面的截图是drivers目录文件列表。drivers目录是内核中最大的源代码存放处,大约占整个内核的一多半。其中我们经常会用到的目录有:Drivers/char字符设备是drivers目录中最为常用,也许是最为重要的目录,因为其中包含了大量与驱动程序无关的代码。通用的tty层在这里实现,console.c定义了linux终端类型,vt.c中定义了虚拟控制台;lp.c中实现了一个通用的并口打印机的驱动,并保持设备无关性;kerboard.c实现高级键盘处理,它导出handle_scancode函数,以便于其他与平台相关的键盘驱动使用。我们的大部分实验也是放在这个目录下。Linux与嵌入式系统课程设计7Driver/block其中存放所有的块设备驱动程序,也保存了一些设备无关的代码。如rd.c实现了RAM磁盘,nbd.c实现了网络块设备,loop.c实现了回环块设备。Drives/ide专门存放针对IDE设备的驱动。Drivers/scsi存放SCSI设备的驱动程序,当前的cd刻录机、扫描仪、U盘等设备都依赖这个SCSI的通用设备。Drivers/net存放网络接口适配器的驱动程序,还包括一些线路规程的实现,但不实现实际的通信协议,这部分在顶层目录的net目录中实现。Drivers/video这里保存了所有的帧缓冲区视频设备的驱动程序,整个目录实现了一个单独的字符设备驱动。/dev/fb设备的入口点在fbmem.c文件中,该文件注册主设备号并维护一个此设备的清单,其中记录了哪一个帧缓冲区设备负责哪个次设备号。Drivers/media这里存放的代码主要是针对无线电和视频输入设备,比如目前流行的usb摄像头。fs此目录下包括了大量的文件系统的源代码,如图所示,其中在嵌入式开发中要使用的包括:devfs、cramfs、ext2、,jffs2、romfs、yaffs、vfat、nfs、proc等。Linux与嵌入式系统课程设计8文件系统是Linux中非常重要的子系统,这里实现了许多重要的系统调用,比如exec.c文件中实现了execve系统调用;用于文件访问的系统调用在open.c、read_write.c等文件中定义,select.c实现了select和poll系统调用,pipe.c和fifo.c实现了管道和命名管道,mkdir、rmdir、rename、link、symlink、mknod等系统调用在namei.c中实现。文件系统的挂装和卸载和用于临时根文件系统的initrd在super.c中实现。Devices.c中实现了字符设备和块设备驱动程序的注册函数;file.c、inode.c实现了管理文件和索引节点内部数据结构的组织。Ioctl.c实现ioctl系统调用。include这里是内核的所有头文件存放的地方,如图5.1.6所示,其中的linux目录是头文件最多的地方,也是驱动程序经常要包含的目录。initlinux的main.c程序,通过这个比较简单的程序,我们可以理解LINUX的启动流程。ipcsystemV的进程间通信的原语实现,包括信号量、共享内存。kernel这个目录下存放的是除网络、文件系统、内存管理之外的所有其他基础设施,从下图的文件列表所示,我们大致可以看出,其中至少包括进程调度sched.c,进程建立fork.c,定时器的管理timer.c,中断处理,信号处理等。Linux与嵌入式系统课程设计9lib包括一些通用支持函数,类似于标准C的库函数。其中包括了最重要的vsprintf函数的实现,它是printk和sprintf函数的核心。还有将字符串转换为长整形数的simple_atol函数。其文件列表如图所示。mm这个目录包含实现内存管理的代码,包括所有与内存管理相关的数据结构,如图所示,其中我们在驱动中需要使用的kmalloc和kfree函数在slab.c中实现,mmap定义在mmap.c中的do_mmap_pgoff函数。将文件映射到内存的实现在filemap.c中,mprotect在mprotect.c,remap在remap.c中实现;vmscan.c中实现了kswapd内核线程,它用于释放未使用和老化的页面到交换空间,这个文件对系统的性能起着关键的影响。Linux与嵌入式系统课程设计10net这个目录包含了套接字抽象和网络协议的实现,如图5.1.10所示,每一种协议都建立了一个目录,我们可以看到有26个目录,但是其中的core、bridge、ethernet、sunrpc、khttpd不是网络协议。我们使用最多的是ipv4、ipv6、802、ipx等。Ipv4、ipv6是ip协议的第4版本和第6版本。Core目录中实现了通用的网络功能:设备处理、防火墙、组播、别名等;ethernet和bridge实现特定的底层功能:以太网相关的辅助函数以及网桥功能。Sunrpc中提供了支持NFS服务器的函数。script这个目录存放