基于SSM整合框架的快速开发技术研究_第1页
基于SSM整合框架的快速开发技术研究_第2页
基于SSM整合框架的快速开发技术研究_第3页
基于SSM整合框架的快速开发技术研究_第4页
基于SSM整合框架的快速开发技术研究_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

1、长江大学计算机科学学院硕士研究生作 业 簿年 级 计算机科学S151 专 业 计算机科学与技术 课程名称 计算机新技术专题 姓 名 熊魏 交作业时间 2016年10月8日 基于SSM整合框架的快速开发技术研究熊魏长江大学计算机科学学院S151班学号:2015713901引言框架,即framework。其实就是某种应用的半成品,把不同应用程序中有共性的一些东西抽取出来,做成一个半成品程序,这样的半成品就是所谓的程序框架。软件系统发展到今天已经很复杂了,特别是服务器端软件,涉及到的知识、内容、问题太多,在某些方面使用别人成熟的框架,就相当于让别人帮你完成一些基础工作。你只需要集中精力,完成系统的业

2、务逻辑设计,这样每次开发就不用白手起家,而是可以在这个基础上开始搭建。使用框架的最大好处:减少重复开发工作量、缩短开发时间、降低开发成本,同时,还有其它的好处,如:使程序设计更合理,程序运行更稳定等。基于这些原因,基本上现在在开发中,都会选用某些合适的开发框架,来帮助快速高效的开发应用系统。框架的选择,就是看哪个框架最合适,从而减少开发的工作量,提高开发的效率和质量,并有效减少维护的工作量,最终达到节约综合开发成,本获取更多的收益。下面简单了解一下Spring MVC+Spring+Mybatis三大框架。2.技术架构系统采用以spring为核心并整合了Spring mvc和mybatis的3

3、个轻量级框架技术的组合,即SSM整合框架。利用SSM整合框架可开发出分层、易扩展、易维护的企业级应用系统。, 能够极大地满足系统的需求。SSM框架结构图如图2所示。随着web应用的规模、复杂度不断升级,对软件架构的复用性、可靠性、可扩展性都提出了较高的要求。本课题采用了MVC这一软件架构模式,该模式成功实现了动态的程序设计,简化了后续对程序的修改以及扩展,使部分程序的重复利用成为可能。此外,此模式简化了应用程序的复杂度,使程序结构更直观。基于MVC架构模式,本系统采用SSM框架,即Struct2,spring3.0,mybatis框架组合,采用此框架技术可以提高开发效率、降低程序的复杂度。图1

4、 SSM框架结构图图1 SSM框架结构图3 MVC设计模式MVC设计模式1是一种目前广泛流行的软件设计模式,它把一个应用的各流程按照Model(模型)、View(视图)、Controller(控制器)的方式进行分离。本系统所采用的SSM整合框架就是根据MVC设计模式的基础上发展起来,其中Struts2就是采用MVC模式建立起来的框架技术,而Struts2正是需要与spring、Mybatis进行无缝的集成,才能真正发挥MVC模式的作用。图2 MVC设计模式的工作原理图2 MVC设计模式的工作原理如图1所示MVC设计模式的工作原理View部分即是应用程序的用户界面,用户通过View层发送请求提交

5、到Controller层;Controller层接受请求根据具体需求调用Model层来处理,再根据Model层调用回来的结果进行跳转。可知Controller层在整个流程中起到了桥梁的作用,控制数据的流向;而Model层负责业务逻辑的处理和数据库访问。4 Spring MVC技术研究Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,Spring Web MVC也是要简化我们日常Web开发的。Spring Web

6、 MVC也是服务到工作者模式的实现,但进行可优化。前端控制器是DispatcherServlet;应用控制器其实拆为处理器映射器(Handler Mapping)进行处理器管理和视图解析器(View Resolver)进行视图管理;页面控制器/动作/处理器为Controller接口(仅包含ModelAndView handleRequest(request, response)方法)的实现(也可以是任何的POJO类);支持本地化(Locale)解析、主题(Theme)解析及文件上传等;提供了非常灵活的数据验证、格式化和数据绑定机制;提供了强大的约定大于配置(惯例优先原则)的契约式编程支持。Sp

7、ring Web MVC框架也是一个基于请求驱动的Web框架,并且也使用了前端控制器模式来进行设计,再根据请求映射规则分发给相应的页面控制器(动作/处理器)进行处理。首先让我们整体看一下Spring Web MVC处理请求的流程如图3所示:图3 Spring MVC 处理流程图3 Spring MVC 处理流程具体执行步骤如下:1、首先用户发送请求前端控制器,前端控制器根据请求信息(如URL)来决定选择哪一个页面控制器进行处理并把请求委托给它,即以前的控制器的控制逻辑部分;图3中的1、2步骤;2、页面控制器接收到请求后,进行功能处理,首先需要收集和绑定请求参数到一个对象,这个对象在Spring

8、 Web MVC中叫命令对象,并进行验证,然后将命令对象委托给业务对象进行处理;处理完毕后返回一个ModelAndView(模型数据和逻辑视图名);图3中的3、4、5步骤;3、 前端控制器收回控制权,然后根据返回的逻辑视图名,选择相应的视图进行渲染,并把模型数据传入以便视图渲染;图3中的步骤6、7;4、 前端控制器再次收回控制权,将响应返回给用户,图3中的步骤8;至此整个结束。5 Spring技术研究Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。Sprin

9、g 框架是一个分层架构,由 6 个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式。图4 Spring框架架构图4 Spring框架架构其核心模块为IOC容器和AOP。4.1 IOC(Inversion of Control控制反转,又名依赖注入)IOC即依赖注入,利用java里的反射机制在运行时动态的去创建、调用对象,Spring框架就是在运行的时候,根据Spring的applicationContext.xml配置文件来动态的创建对象并调用对象的方法的,所以使用Spring框架后不需要用new方法创建而是通过框架自动产生一个对象,只

10、需要在xml文件中对bean进行定义。Spring发展到3.0后,不需要在xml文件中逐个定义bean对象,只需在调用的文件中使用Autowired来声明所调用的对象即可,使开发更加简洁方便。4.2 AOP(Aspect-OrientedProgramming,面向方面编程)AOP即面向切面编程,其原理是利用代理的设计模式,未使用Spring时,开发人员需要编写大量的代码来实现AOP,现在有了Spring对AOP的支持,不仅减轻了开发的工作量提高了开发的效率,也增强了程序的可靠性。本系统中Spring的AOP主要用于对事务的管理。Spring框架主要用于降低系统模块之间的耦合度。其主要技术包括

11、控制反转(IOC)和面向切面编程(AOP)两大方面。Spring降低耦合度的功能主要通过IOC来实现,IOC是Spring框架的核心,其原理可以理解为程序的所有组件都是被动的,初始化和调用都有容器(Spring)的负责。另外Spring提供了AOP技术,利用AOP可以对业务逻辑的各个部分进行隔离,如:日志记录、事务处理等,从而使得业务逻辑各部分的耦合度降低,提高程序的可重用性和开发效率。4.3 spring的主要特性。(1)降低组件之间的耦合度,实现软件各层之间的解耦。(2)可以使用容器提供的众多服务,如:事务管理服务、消息服务、JMS服务、持久化服务等等。(3)容器提供单例模式支持,开发人员

12、不再需要自己编写实现代码。(4)容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能。(5)容器提供的众多辅作类,使用这些类能够加快应用的开发,如:JdbcTemplate、HibernateTemplate.(6)对主流的应用框架提供了集成支持。6 Hibernate与Mybatis技术研究MyBatis是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)。MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集

13、的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。每个MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个SqlSessionFactory实例可以通过SqlSessionFactoryBuilder获得。SqlSessionFactoryBuilder可以从一个xml配置文件或者一个预定义的配置类的实例获得。用xml文件构建SqlSessionFactory实例是非常简单的事情。推荐在这个配置中使用类路径资源(classpa

14、th resource),但你可以使用任何Reader实例,包括用文件路径或file:/开头的url创建的实例。MyBatis有一个实用类-Resources,它有很多方法,可以方便地从类路径及其它位置加载资源。6.1功能架构Mybatis的功能架构分为三层,如图5所示:图4 Mybatis 架构图4 Mybatis 架构(1)API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。(2)数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库

15、操作。(3)基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。6.2工作流程(1)加载配置:配置来源于两个地方,一处是配置文件,一处是Java代码的注解,将SQL的配置信息加载成为一个个MappedStatement对象(包括了传入参数映射配置、执行的SQL语句、结果映射配置),存储在内存中。(2)SQL解析:当API接口层接收到调用请求时,会接收到传入SQL的ID和传入对象(可以是Map、JavaBean或者基本数据类型),Mybatis会根据SQL的ID找到对应的Mapped

16、Statement,然后根据传入参数对象对MappedStatement进行解析,解析后可以得到最终要执行的SQL语句和参数。(3)SQL执行:将最终得到的SQL和参数拿到数据库进行执行,得到操作数据库的结果。(4)结果映射:将操作数据库的结果按照映射的配置进行转换,可以转换成HashMap、JavaBean或者基本数据类型,并将最终结果返回。6.3动态SQLMyBatis 最强大的特性之一就是它的动态语句功能。如果您以前有使用JDBC或者类似框架的经历,您就会明白把SQL语句条件连接在一起是多么的痛苦,要确保不能忘记空格或者不要在columns列后面省略一个逗号等。动态语句能够完全解决掉这些

17、痛苦。尽管与动态SQL一起工作不是在开一个party,但是MyBatis确实能通过在任何映射SQL语句中使用强大的动态SQL来改进这些状况。动态SQL元素对于任何使用过JSTL或者类似于XML之类的文本处理器的人来说,都是非常熟悉的。在上一版本中,需要了解和学习非常多的元素,但在MyBatis 3 中有了许多的改进,现在只剩下差不多二分之一的元素。MyBatis使用了基于强大的OGNL表达式来消除了大部分元素。MyBatis是一个可以自定义SQL、存储过程和高级映射的持久层框架。只使用简单的XML和注解来配置和映射基本数据类型、MAP接口和POJO(简单的JAVA对象)到数据库记录。相比另一流

18、行的持久层框架Hibernate,MyBatis是一种“半自动化”的ORM(对象关系映射)实现,可以进行更为细致的SQL优化减少查询字段。因为本系统主要是对数据库的数据进行处理,而且数据量会比较大,结构比较稳定,因此对SQL语句应进行更高度的优化,所以本系统选择MyBatis作为数据库持久层框架。相对Hibernate的全自动化,Mybatis是半自动化的ORM框架,虽然不如全自动化更节省开发人员时间,但是对于对性能要求较高的系统,Mybatis可以对SQL语句自由进行优化,而且现在有MybatisGenerateCode等插件工具可以实现自动生成实体类和基本的select,insert,de

19、lete及update语句。减少了Mybatis与Hibernate在开发复杂度上面差距。表1是使用zakisoft工具对Hibernate和Mybatis的执行效率进行的测试数据,其中执行时间为平均每条数据的执行时间,insert测试数据为10000条,select、delete、update每次测试均为随机选择、删除、更新一条数据,执行次数100次。根据以上调研及测试,综合考虑,本系统采用Mybatis框架。7.管理员及权限模块实现系统建立初期,只有超级管理员一个角色和用户,超级管理员可以创建其他角色,并为角色分配不同的权限,例如:web菜单维护角色、新闻内容管理角色、web布局管理角色以

20、及文件管理等角色。然后创建web智能管理系统的后台管理员用户,每个用户有其对应的权限角色。例如拥有菜单维护的权限的用户,可以创建前台网站菜单并分配该菜单对应的主页。不同角色的管理员拥有不同的权限,在很大程度上保证了前台web系统的安全性。7框架组合经过对各个框架的研究,系统采用SSM框架组合,分别取Spring mvc、spring3.0、Mybatis各框架中优秀模块进行组合,实现MVC架构模式。取Spring mvc中的Action层与JSP页面之间的交互响应、拦截器,过滤器等功能作为view层和controller层;Mybatis作为model层,负责实例、JDBC连接以及数据持久层的

21、功能;Spring作为一个轻量级的框架,采用其核心模块IOC、AOP、Test,其中,IOC依赖翻转用来连接各个层之间对象,简化各个对象之间调用;由于基于反射及代理模式的面向切面编程开销比较大,本系统中只用来进行事务管理,负责事务的回滚机制,Spring的Test机制使得测试变得不再复杂,可以采用非容器依赖的编程方式进行大部分测试工作,此外Spring还担当着MVC各个层之间的无缝连接工作,否则即使各个框架都很优秀也无法发挥出其最大的作用。在SSM整合框架中,每一个框架都发挥着自己最擅长的方面: Spring mvc注重于降低表现层与逻辑层的耦合度,在视图层和控制层发挥作用;Spring作为整

22、个框架的核心部分,起到了桥梁的作用,对业务层的层次深化,在业务层通过其IOC技术的对象依赖注入和AOP技术的事务分离,更深层次的降低了耦合程度;MyBatis框架主要负责Java对象和关系数据库之间的映射,在数据持久层上提供数据的访问。通过应用SSM整合框架,可以将整个系统开发的结构大致分为如图2所示。图6 SSM框架结构图6 SSM框架结构3.1框架组合实现通过web.xml,Structs.xml,applicationContext.xml,mybatis-config.xml这个配置文件搭建web系统的整体框架,使之符合MVC架构模式。web.xml文件中通过context-param

23、配置了Spring的上下文位置,并通过listener配置,通知容器加载Spring及Struct2的配置文件。Structs.xml主要是对页面提交的请求以及Action返回的页面进行对应。applicationContext.xml是Spring的配置文件,其中,可以实现使用annotation自动注册bean,并检查Required,Autowired的属性是否已经被注入。使用AOP定义了事务,除了以get,find,select方法名开头的方法外,其他service层的方法均有回滚机制,保证了事务的原子性、一致性、持久性。此外还配置了mybatis文件位置以及数据库的相关信息,将业务层

24、和数据层分离并联系起来。mybatis-config.xml文件中配置了MAPPER的加载方式,本系统中采用非懒汉式加载,即在系统初始化时加载所有的MAPPER文件,防止出现初始化并发问题。经过编写各配置文件组合3个框架,完成了系统的整体架构的搭建。SSM框架的组合分别是Spring mvc、Spring3.0、MyBatis,三者组合实现MVC架构模式。Spring mvc的主要功能是使用action层与JSP页面进行交互。Mybatis是半自动化的ORM框架,负责数据持久层的功能,可以对SQL语句进行自动优化,并且可以使用插件实现自动生成实体类及基本的语句。Spring核心模块IOC依赖反

25、转各个层之间的对象,简化对象的调用。SSM框架在Web应用系统开发中具有以下优势:(1)系统开发效率提升。框架可以提供高效的组件和视图处理,而且以配置文件的方式定义程序逻辑。需求改变仅需修改控制逻辑的配置文件,无需关心底层框架的实现,从而提高系统开发效率。(2)模块间相互独立。SSM框架具有“低耦合高内聚”的特点。设计人员可以按功能将系统划分为不同的功能模块,模块之间相互独立,每个模块的修改不影响其他模块。(3)角色分离。框架为开发者提供不同的接口,前端页面设计人员只需关注JSP页面的设计,后台逻辑开发者对业务逻辑开发程序。前端和后台的人员相互独立,互不影响。(4)缩短开发周期,降低项目开发成

26、本。框架可以适用于各种类型开发人员协同工作,降低了对开发人员知识和技能的要求,加快了开发速度。8结束语文章结合高校项目管理的特点,提出采用Strut2、Spring、Mybatis三者整合框架SSM的设计思想,设计并实现了高校项目管理系统。根据项目实际开发过程与结果,SSM框架很少的降低了项目开发的耦合度,实现表示层、业务层与数据层的分离,使得系统开发过程更合理化,提高系统开发后的可扩展性和可维护性。该系统已通过测试,在广西大学投入使用,运行稳定、效果良好。9 参考文献1张俊萍;朱小冬;侯娜;张鲁;梁欣;基于SSM的软件体系结构开发过程研究J;计算机测量与控制;2011年08期2谌湘倩;狄文辉

27、;孙冬;基于SSH框架与AJAX技术的JavaWeb应用开发J;计算机工程与设计;2009年10期3任晓鹏;赵文兵;张春平;基于框架的Web系统开发研究J;计算机工程与设计;2010年04期4王艳清;陈红;基于SSM框架的智能web系统研发设计J;计算机工程与设计;2012年12期5王钱;王蓉;张利;基于iBatis的通用数据持久层的研究与设计J;微计算机信息;2007年12期6刘军;戴金山;基于Spring MVC与iBATIS的轻量级Web应用研究J;计算机应用;2006年04期7吴志霞;陈平;基于S2SH的在线项目管理平台的设计与实现J;计算机与现代化;2011年08期8谌湘倩;狄文辉;

28、孙冬;基于SSH框架与AJAX技术的JavaWeb应用开发J;计算机工程与设计;2009年10期9祝世东;基于MVC设计模式的Struts框架在建材检测系统中的研究与应用D;沈阳理工大学;2010年10周永来;基于复用的Java EE快速Web开发架构的研究与应用D;华北电力大学(北京);2008年11邓斯红;基于AJAX和SSH集成框架的国有资产管理系统D;北京化工大学;2010年12张春华;基于MVC模式的Struts框架的研究与应用D;吉林大学;2010年教 师 评 语 及 成 绩评阅成绩_评阅时间_教师签名_附录资料:不需要的可以自行删除 busybox详解制作根文件系统详解制作根文件

29、系统 一、FHS(Filesystem Hierarchy Standard)标准介绍当我们在linux下输入ls / 的时候,见到的目录结构以及这些目录下的内容都大同小异,这是因为所有的linux发行版在对根文件系统布局上都遵循FHS标准的建议规定。该标准规定了根目录下各个子目录的名称及其存放的内容:目录名存放的内容/bin必备的用户命令,例如ls、cp等/sbin必备的系统管理员命令,例如ifconfig、reboot等/dev设备文件,例如mtdblock0、tty1等/etc系统配置文件,包括启动文件,例如inittab等/lib必要的链接库,例如C链接库、内核模块/home普通用户主

30、目录/rootroot用户主目录/usr/bin非必备的用户程序,例如find、du等/usr/sbin非必备的管理员程序,例如chroot、inetd等/usr/lib库文件/var守护程序和工具程序所存放的可变,例如日志文件/proc用来提供内核与进程信息的虚拟文件系统,由内核自动生成目录下的内容/sys用来提供内核与设备信息的虚拟文件系统,由内核自动生成目录下的内容/mnt文件系统挂接点,用于临时安装文件系统/tmp临时性的文件,重启后将自动清除制作根文件系统就是要建立以上的目录,并在其中建立完整目录内容。其过程大体包括:编译安装busybox,生成/bin、/sbin、/usr/bin

31、、/usr/sbin目录 利用交叉编译工具链,构建/lib目录 手工构建/etc目录 手工构建最简化的/dev目录 创建其它空目录 配置系统自动生成/proc目录 利用udev构建完整的/dev目录 制作根文件系统的jffs2映像文件 下面就来详细介绍这个过程。二、编译安装busybox,生成/bin、/sbin、/usr/bin、/usr/sbin目录这些目录下存储的主要是常用命令的二进制文件。如果要自己编写这几百个常用命令的源程序,my god, 这简直是一个噩梦!好在我们有嵌入式Linux系统的瑞士军刀busybox,事情就简单很多。1、从 HYPERLINK / / 下载busybox

32、-1.7.0.tar.bz22、tar xjvf busybox-1.7.0.tar.bz2解包3、修改Makefile文件175 ARCH ?= arm176 CROSS_COMPILE ?= arm-linux- 4、make menuconfig配置busyboxbusybox配置主要分两部分。第一部分是Busybox Settings,主要编译和安装busybox的一些选项。这里主要需要配置:1)、Build Options - Build BusyBox as a static binary (no shared libs),表示编译busybox时,是否静态链接C库。我们选择动态链

33、接C库。2)、Installation Options - Applets links (as soft-links) - (X) as soft-links,表示安装busybox时,将各个命令安装为指向busybox的软链接还是硬链接。我们选择软链接。3)、Installation Options - (/work/nfs_root/fs_mini3) BusyBox installation prefix,表示busybox的安装位置。我们选择/work/nfs_root/fs_mini34)Busybox Library Tuning。保留Command line editing以支持

34、命令行编辑;保留History size以支持记忆历史命令;选中Tab completion和Username completion以支持命令自动补全 第二部分是Applets,他将busybox的支持的几百个命令分门别类。我们只要在各个门类下选择想要的命令即可。这里我们基本保持默认设置。1)选中Networking Utilities - httpd下的Enable -u option,以启用http服务器的功能allows the server to run as a specific user5、编译busyboxmake6、安装busyboxmake install安装完成后,可以看到

35、在/work/nfs_root/fs_mini3目录下生成了binsbinusr/binusr/sbin目录,其下包含了我们常用的命令,这些命令都是指向bin/busybox的软链接,而busybox本身的大小不到800K:dennisdennis-desktop:/work/nfs_root/fs_mini3$ lsbin linuxrc sbin usrdennisdennis-desktop:/work/nfs_root/fs_mini3$ ls -l bintotal 740lrwxrwxrwx 1 dennis dennis 7 2010-04-03 23:57 addgroup -

36、 busyboxlrwxrwxrwx 1 dennis dennis 7 2010-04-03 23:57 adduser - busyboxlrwxrwxrwx 1 dennis dennis 7 2010-04-03 23:57 ash - busybox-rwxr-xr-x 1 dennis dennis 749632 2010-04-03 23:57 busyboxlrwxrwxrwx 1 dennis dennis 7 2010-04-03 23:57 cat busybox 而普通PC机上的ls命令就有差不多80K的大小: dennisdennis-desktop:/work/nf

37、s_root/fs_mini3$ ls -l /bin/ls-rwxr-xr-x 1 root root 78004 2007-09-29 20:51 /bin/ls busybox以它娇小的身躯容纳了数以百计的命令代码,实在是让人佩服不已,其不愧嵌入式系统瑞士军刀之美誉。据说,busybox的作者身患绝症,这更让人钦佩GNU开源软件的作者们。 三、利用交叉编译工具链,构建/lib目录 光有应用程序(命令)是不够的,因为应用程序本身需要使用C库的库函数,因此还必需制作for ARM的C库,并将其放置于/lib目录。my god,要自己写C库的源代码吗?不用!还记得交叉编译工具链的3个组成部分吗

38、?交叉编译器、for ARM的C库和二进制工具。哈哈,for ARM的C库是现成的,我们只需要拷贝过来就可以了。遗憾的是:整个C库目录下的文件总大小有26M。而我们根文件系统所在分区不过区区16M而已,根本放不下。怎么办呢? dennisdennis-desktop:/work/nfs_root/fs_mini3$ du -s -si /work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib26M /work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib 需要C库目录下所有的文件吗?no,absolutely no!

39、让我们来分析一下glibc库目录下内容的组成。该目录下的子目录和文件共分8类: 目标文件,如crtn.o,用于gcc链接可执行文件 libtool库文件(.la),在链接库文件时这些文件会被用到,比如他们列出了当前库文件所依赖的其它库文件,程序运行时无需这些文件 gconv目录,里面是各种链接脚本,在编译应用程序时,他们用于指定程序的运行地址,各段的位置等 静态库文件(.a),例如libm.a,libc.a 动态库文件 (.so、.so.0-9*) 动态链接库加载器ld-2.3.6.so、ld-linux.so.2 其它目录及文件很显然,第1、2、3、4、7类文件和目录是不需要拷贝的。由于动态

40、链接的应用程序本身并不含有它所调用的C库函数的代码,因此执行时需要动态链接库加载器来为它加载相应的C库文件,所以第6类文件是需要拷贝的。除此之外,第5类文件当然要拷贝。但第5类文件的大小也相当大。dennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ du -c -si *.so* 7.2M total 需要全部拷贝吗?非也,非也!其实,需要哪些库完全取决于要运行的应用程序使用了哪些库函数。如果我们只制作最简单的系统,那么我们只需要运行busybox这一个应用程序即可。通过执行 dennisdennis-des

41、ktop:/work/nfs_root/fs_mini3$ arm-linux-readelf -a bin/busybox | grep Shared0 x00000001 (NEEDED) Shared library: libcrypt.so.10 x00000001 (NEEDED) Shared library: libm.so.60 x00000001 (NEEDED) Shared library: libc.so.6 可知:busybox只用到了3个库:通用C库(libc)、数学库(libm)、加密库(libcrypt),因此我们只需要拷贝这3个库的库文件即可。但是每个库都有4

42、个文件,4个文件都要拷贝吗?当然不是。 dennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ ls -l libcrypt.-*-rwxr-xr-x 1 dennis dennis 30700 2008-01-22 05:32 libcrypt-2.3.6.so-rw-r-r- 1 dennis dennis 23118 2008-01-22 05:32 libcrypt.alrwxrwxrwx 1 dennis dennis 13 2008-12-22 15:38 libcrypt.so - libcryp

43、t.so.1lrwxrwxrwx 1 dennis dennis 17 2008-12-22 15:38 libcrypt.so.1 - libcrypt-2.3.6.sodennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ ls -l libm.-*-rwxr-xr-x 1 dennis dennis 779096 2008-01-22 05:31 libm-2.3.6.so-rw-r-r- 1 dennis dennis 1134282 2008-01-22 05:32 libm.alrwxrwxrwx

44、1 dennis dennis 9 2008-12-22 15:38 libm.so - libm.so.6lrwxrwxrwx 1 dennis dennis 13 2008-12-22 15:38 libm.so.6 - libm-2.3.6.sodennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ ls -l libc.-*-rwxr-xr-x 1 dennis dennis 1435660 2008-01-22 05:48 libc-2.3.6.so-rw-r-r- 1 dennis dennis 2

45、768280 2008-01-22 05:31 libc.a-rw-r-r- 1 dennis dennis 195 2008-01-22 05:34 libc.solrwxrwxrwx 1 dennis dennis 13 2008-12-22 15:38 libc.so.6 - libc-2.3.6.so 4个文件中的.a文件是静态库文件,是不需要拷贝的。另外3个文件是: 实际的共享链接库:libLIBRARY_NAME-GLIBC_VERSION.so。当然需要拷贝。 主修订版本的符号链接,指向实际的共享链接库:libLIBRARY_NAME.so.MAJOR_REVISION_VERS

46、ION,程序一旦链接了特定的链接库,将会参用该符号链接。程序启动时,加载器在加载程序前,会检索该文件。所以需要拷贝。 与版本无关的符号链接,指向主修订版本的符号连接(libc.so是唯一的例外,他是一个链接命令行:libLIBRARY_NAME.so,是为编译程序时提供一个通用条目)。这些文件在程序被编译时会被用到,但在程序运行时不会被用到,所以不必拷贝它。关于共享库的2个符号链接的作用的特别说明:当我们使用gcc hello.c -o hello -lm编译程序时,gcc会根据-lm的指示,加头(lib)添尾(.so)得到libm.so,从而沿着与版本无关的符号链接(libm.so - li

47、bm.so.6)找到libm.so.6并记录在案(hello的ELF头中),表示hello需要使用libm.so.6这个库文件所代表的数学库中的库函数。而当hello被执行的时候,动态链接库加载器会从hello的ELF头中找到libm.so.6这个记录,然后沿着主修订版本的符号链接(libm.so.6 - libm-2.3.6.so)找到实际的共享链接库libm-2.3.6.so,从而将其与hello作动态链接。可见,与版本无关的符号链接是供编译器使用的,主修订版本的符号链接是供动态链接库加载器使用的,而实际的共享链接库则是供应用程序使用的。通过以上分析,我们只需要拷贝3个库(每个库各1个主修

48、订版本的符号链接和1个实际的共享链接库)以及动态链接库加载器(1个符号链接和1个实体文件)。步骤如下:dennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ mkdir /work/nfs_root/fs_mini3/lib dennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ cp libcrypt-* /work/nfs_root/fs_mini3/libdennisdennis-desktop:/work/tools/g

49、cc-3.4.5-glibc-2.3.6/arm-linux/lib$ cp -l libcrypt.so.* /work/nfs_root/fs_mini3/libdennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ cp libm-* /work/nfs_root/fs_mini3/libdennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ cp -l libm.so.* /work/nfs_root/fs_mini3/

50、libdennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ cp libc-* /work/nfs_root/fs_mini3/libdennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ cp -l libc.so.* /work/nfs_root/fs_mini3/lib dennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ cp -l

51、ld-* /work/nfs_root/fs_mini3/lib 四、手工构建/etc目录 /etc目录存放的是系统程序的主配置文件,因此需要哪些配置文件取决于要运行哪些系统程序。即使最小的系统也一定会运行1号用户进程init,所以我们至少要手工编写init的主配置文件inittab。busybox的inittab文件的语法、语义与传统的SYSV的inittab有所不同。 inittab文件中每个条目用来定义一个需要init启动的子进程,并确定它的启动方式,格式为:。例如:ttySAC0:askfirst:-/bin/sh 表示子进程要使用的控制台,若省略则使用与init进程一样的控制台 表示

52、运行级别,busybox init程序这个字段没有意义 表示init进程如何控制这个子进程 sysinit:系统启动后最先执行,只执行一次,init进程等待它结束后才继续执行其它动作 wait:系统执行完sysinit条目后执行,只执行一次,init进程等待它结束后才继续执行其它动作 once:系统执行完wait条目后执行,只执行一次,init进程不等待它结束 respawn:启动完once进程后,init进程监测发现子进程退出时,重新启动它 askfirst:启动完respawn进程后,与respawn类似,不过init进程先输出” Please press Enter to activat

53、e this console“,等用户输入回车后才启动子进程 shutdown:当系统关机时 restart:Busybox中配置了CONFIG_FEATURE_USE_INITAB,并且init进程接收到SIGUP信号时执行,先重新读取、解析/etc/inittab文件,再执行restart程序 ctrlaltdel:按下ctrl+alt+del键时执行,不过在串口控制台中无法输入它 表示进程对应的二进制文件。如果前面有-号,表示该程序是“可以与用户进行交互的”我们制作最简单的/etc/inittab文件,其内容如下::sysinit:/etc/init.d/rcS:askfirst:-/b

54、in/sh:ctrlaltdel:/sbin/reboot:shutdown:/bin/umount -a r 制作最简单的脚本程序文件/etc/init.d/rcS,其内容如下: #!/bin/shifconfig eth0 7修改shell脚本文件/etc/init.d/rcS的权限,以使其可被执行:# chmod a+x /etc/init.d/rcS五、手工构建最简化的/dev目录 在linux机器上,执行ls /dev可看到几百个设备文件,我需要手工创建它们吗?maybe,我只需要手工创建几个设备文件!我怎么知道我应该创建哪几个设备文件呢?管它呢,先看看开发板上可爱的linux的反应

55、再说。 启动Linux操作系统,显示: VFS: Mounted root (nfs filesystem).Freeing init memory: 112KWarning: unable to open an initial console. 这说明,内核已经成功挂载根文件系统,但却未能成功启动第1个用户进程init。通过错误消息“unable to open an initial console”搜索内核源代码,找到init/main.c文件。748 static int noinline init_post(void)749 750 free_initmem();751 unlock_

56、kernel();752 mark_rodata_ro();753 system_state = SYSTEM_RUNNING;754 numa_default_policy();755 756 if (sys_open(const char _user *) /dev/console, O_RDWR, 0) 0)757 printk(KERN_WARNING Warning: unable to open an initial console.n);758 759 (void) sys_dup(0);760 (void) sys_dup(0);761 762 if (ramdisk_exec

57、ute_command) 763 run_init_process(ramdisk_execute_command);764 printk(KERN_WARNING Failed to execute %sn,765 ramdisk_execute_command);766 767 768 /*769 * We try each of these until one succeeds.770 *771 * The Bourne shell can be used instead of init if we are772 * trying to recover a really broken m

58、achine.773 */774 if (execute_command) 775 run_init_process(execute_command);776 printk(KERN_WARNING Failed to execute %s. Attempting 777 defaults.n, execute_command);778 779 run_init_process(/sbin/init);780 run_init_process(/etc/init);781 run_init_process(/bin/init);782 run_init_process(/bin/sh);783

59、 784 panic(No init found. Try passing init= option to kernel.);785 显然,内核错误是由175行不能打开/dev/console所致。通过查看已经安装好的linux机器的/dev/console设备文件,可知其是字符设备文件,主设备号为5,次设备号为1: dennisdennis-desktop:/work/nfs_root/fs_mini3/etc$ ls -l /dev/consolecrw- 1 root root 5, 1 2010-04-08 08:40 /dev/console 因此,我们使用下面的命令创建它: HYP

60、ERLINK mailto:dennisdennis-desktop:/work/nfs_root/fs_mini3/dev$ dennisdennis-desktop:/work/nfs_root/fs_mini3/dev$ sudo mknod console c 5 1 还需要创建其它设备文件吗?只有天知道!再看看linux的反应。 VFS: Mounted root (nfs filesystem).Freeing init memory: 112Kinit: cant open /dev/null: No such file or directory 这次我们有经验了,如法炮制,创建

温馨提示

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

最新文档

评论

0/150

提交评论