注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

itoedr的it学苑

记录从IT文盲学到专家的历程

 
 
 

日志

 
 

uClinux操作系统裁剪说明  

2014-04-11 23:55:52|  分类: 嵌入式linux |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

  ⑴裁剪前准备

   uclinux的裁剪牵涉到对目标的硬件支持问题。要让uClinux支持一个新硬件体系,要做的第一件事情就是收集和构建代码的工具。然后就可以裁减 和编译内核。一旦内核支持基本的处理器功能,它就可以运作了,但是如果缺乏驱动程序的支持,就起不了多大作用。典型的驱动程序集合中包括了诸如控制台终 端、基本串行设备和一个可能包含了根文件系统的块设备的驱动等。

  在这里主要介绍针对我们刚才介绍的实例系统采用的uClinux裁剪方法。本实例中的宿主机上装redhat9操作系统,因为redhat9具备安装uClinux交叉编译工具时所需要的库。

   首先必须在redhat9下建立uclinux开发环境,建立uclinux开发环境的方法有很多,而且也十分方便。可以从 http://www.uClinux.org处下载最新的uClinux的源代码、最新的gcc3的工具链,不过针对于不同的工具链在不同的操作系统 下,以及目标板的MCU的不一样,可能在编译内核时会产生错误,在这里,我讲解实例所使用的不是最新版本的。同样的,针对不同的硬件开发环境要对 uClinux源代码进行不同的适当修改,修改部分通常是以代码补丁形式实现的,一般网络上会有各种通用模式的补丁提供使用。好了,切入正题,有了齐全的 软件包后,安装过程如下:

  (1) 下载内核和工具包

  内核包 : uClinux-disc-200408.tar.gz

  补丁文件:uClinux-disc-200408.patch

  uclinux的源代码和文件系统的源代码,软件包后的数字代表完成的日期。

  工具链 : arm-elf-gcc-200403.sh

  (2) 安装工具包

  sh arm -elf-gcc-200403.sh

  (3) 解压缩内核

  tar -xzvfuClinux-dist-200408.tar.gz,生成uClinux-disk目录。

  (4)安装补丁:

  将补丁文件复制到uClinux-disk目录下,进入该目录,在Shell命令中使用如下命令:

  patch -pl-f

  ⑵内核的编译和生成

  执行以下命令可以进行uClinux编译:

  make xconfig。具体的编译选项配置过程本文不做详细介绍。但在此给出编译的一些基本思想:

  ucLinux作为一个自由软件,在广大爱好者的支持下,内核版本不断更新。新的内核修订了旧内核的bug,并增加了许多新的特性。如果用户想要使用这些新特性,或想根据自己的系统度身定制一个更高效,更稳定的内核,就需要重新编译内核。

  为了正确的合理地设置内核编译配置选项,从而只编译系统需要的功能的代码,一般主要有下面四个考虑:

  自己定制编译的内核运行更快(具有更少的代码)。

  系统将拥有更多的内存(内核部分将不会被交换到虚拟内存中)。

  不需要的功能编译进入内核可能会增加被系统攻击者利用的漏洞。

  将某种功能编译为模块方式会比编译到内核内的方式速度要慢一些。

   在此需要补充说明的是内核编译的目的是为了创建一个能够放置在flash上支持flash读取的完成要求功能的内核,同时也是flash读取步骤其中一 步。对uCLinux的内核进行配置和创建要对uCLinux内核的版本进行选择:uCLinux内核的版本号有三种:主号、次号、修订号。以 2.4.10为例一般来说,主号如目前的2是很稳定的。主号的变动说明了操作系统发生了很大的变动。次号如目前的.4,用来说明内核的稳定性。当次号为偶 数号((0,2, 4, 6) 时,表明现在的内核的稳定性强,而当次号为奇数号(1,3, 5) 时,表明现在的内核处于测试的阶段,其稳定性值得考虑,如果你使用次号为奇数号的内核进行配置和创建时、就值得三思而行了。而修订号的发表比较的频繁,它 主要是用来对前面的版本进行修补。开发新的版本和修改以前的版本是同时进行的,很有可能修改的修订版本在新的版本出来之后。

  依次执行以下命令完成uClinux的编译过程:

  cd/usr/local/src/uclinux=dist

  make dep

  make clean

  make lib_only

  make user_only

  make romfs

  make image

  最终在image目录下生成2个文件:

  zImage——uClinux内核2.4.x的压缩方式可执行映象文件;

  romfs——文件系统的映象文件。

  这就是我们要用来烧录到硬件板内的最终文件了。具体烧写可以通过使用专用的烧写工具来实现,烧写过程一定要参照烧写工具的说明要求来进行。

   其中zImage已经包含了文件系统映象文件,通常直接烧写到Flash文件上即可执行了。当然在这之前要进行BootLoader的烧录, BootLoader其实就是一个引导程序,主要作用就是初始化系统,进而来引导操作系统。在嵌入式系统中,处理器上电后首先执行的一段代码就是 BootLoader,BootLoader与硬件密切相关,其代码主要用C和汇编语言写成,不同的系统中,BootLoader的功能有所不同,但主要 作用还是差不多的,主要有下面几点:

  初始化微控制器MCU运行的时钟频率;

  初始化Flash和内存的数据宽度,读/写访问周期和刷新周期;

  初始化中断系统;

  初始化系统中各种片内、片外设备和I/O端口设备;

  初始化系统各种运行模式下的寄存器和堆栈;

  加载和引导操作系统;

   BLOb是BootLoaderObject的缩写,它是一个功能强大、源代码公开的自由软件,它已经实现了对多种处理器芯片的Linux 引导支持。对ARM7等核心的BootLoader支持版本可以到专业网站上进行下载,并稍微做适当修改来满足开发应用中的硬件环境要求即可,在此我们不 做过多讲述。

  上面所讲述的内核编译过程 只是比较宽泛的、笼统的操作过程,也就是说只是基本的操作过程,而在真正的路由功能实现过程中,还要对内核进行多种设置编译,比如说对硬件系统中设计到的 部件进行驱动配置安装等,当然,这些并不是特别难的操作技术,再比如我们下面就要讲到的内容,这可就是很有挑战性的核心技术了,这些都是针对内核进行技术 性操作来实现特定的网络功能。

  内核编译核心部分

  1、文件系统分析

   文件系统是uClinux操作系统的重要组成部分,uClinux文件系统是操作运行的基础。许多嵌入式系统在不存在磁盘的情况下也可以运行。文件系统 可以随同内核一起被打包并在启动时作为一个文件系统的映像被加载。对一个简单的应用系统来说,这己足够了。文件系统可以存放在一个传统磁盘中,但也可以存 放在非易失性的存储介质— 闪存中。闪存有一个引导块,它存放了CPU上电后运行的第一个软件,这个软件可以是uclinux的引导程序,也可以是自己编的bootloader。 uClinux的内核可以被引导程序从闪存中拷贝到RAM中全速运行。闪存也可以作为文件的存储介质,必要时写入一些需要保存的数据。

   uClinux支持NFS(Network File System),它允许通过网络加载各种应用程序。由于用在每一个嵌入式系统上的软件可以从一个公用的服务器上加载,这在控制软件的修订或升级中是很重要 的.在系统运行的过程中,导入和导出数据、配置、状态信息的备份也很重要。对用户监控而言,这是一个非常强大的功能。例如,一个嵌入式系统可能装配了一个 RAM DISK,它包含着与系统当前状态的更新维持一致的(状态)文件。那么别的嵌入式系统仅需通过网络把这个RAM DISK作为远程磁盘mount过来便可以访问那些位于远端RAM DISK中的状态文件。这也允许在另一台机器上的WEB服务器借助简单的CGI脚本来访问那些状态信息。运行在其他机器上的应用程序包能够很容易地访问这 些数据。uClinux操作系统根据不同的安装选择可以生成不同的文件系统。系统中提供了十分丰富的文件系统以供不同需要的用户选择。每种类型的文件系统 的基本块大小、优化分配策略、一次传送的数据长度等等都是相互匹配的,使得本类文件系统均有相应的最佳性能。

  2、嵌入式Web服务器

  对uClinux操作系统下嵌入式Web技术的实现主要用于用户可以通过网

  页方式来管理路由器。

  ⑴uClinux下Web Server的实现

   uClinux下,主要有三个WebServer:htpd,thttpd和Boa。Httpd是最简单的一个Web Server,它的功能最弱,不支持认证,不支持CGI。Thttpd和Boa都支持认证、CGI等,功能都比较全。为了实现动态Web技术,这里我们选 择实现一个支持CGI的、非常适合于嵌入式系统的Boa Web Server。Boa是一个单任务的http服务器,源代码开放、性能高。目前,uClinux的代码中已经包含boa的源代码,在uClinux下实现 Boa,需要对Boa做一些配置和修改。这主要通过对boa.conf和mime.types文件进行修改来实现,需要改动的配置有以下几项:

  ①建目录

  由于uClinux默认的根文件系统romfs是只读的,不能用mkdir等命令来新建目录,故应在编译内核前先建好要用到的目录,这通过修改

   /uclinux-samsung/vendors/Samsung/4510b/makefile文件来实现。在ROWFS_DIRS=bin dev etc home lib mnt proc usr var的后边增加home/webhome/web/cgi-bin,这样修改后编译内核,编译好的根文件系统romfs中就包含这些目录了。

  ②指定Web 服务器的根目录路径(SERVER ROOT)

   进入 /uclinux-samsung/user/boa/src/目录,通过修改define.h文件中#define ERVER ROOT "/home”语句来指定SERVER ROOT。另外,还可以通过命令行来指定,例如:boa-c/home/&。而且命令行指定的SERVER ROOT可以覆盖define.h文件所指定的。

  ③修改boa.conf文件

  在. /uclinux-samsung/user/boa/src/boa.conf里修改:

  *将 user obody和Group ogroup改为User0 和Group0 ;

  *将 DocumentRoot/var/www改为DocumentRoot/home/web,这样web服务器的文档根目录为/home/web;

  *将 MimeTypes/eWmime.types改为MimeTypes/home/web/mime.types;

  定义默认首页和CGI程序所在目录,即

  DirectoyIndex index.html

  ScriptAlias/cgi-bin//home/web/cgi-bin/

  这样指定后,.index.htm为远程浏览客户访问WebServer所看到的首页默认值,用C编写的CGI程序编译成二进制文件,放到/cgi-bin/目录下,CGI程序能被正确地执行。

   Boa.conf文件和mime.types文件必须放到Web服务器根目录下,所以把修改后的bao.conf和mime.types拷贝到 “./uclinux-samsung/romfs/home/”目录下。然后在/uclinux- samsung/Vendors/Samsung/4510b/initab里修改,在:inet:unknown:/bin/inetd后加入: boa:unknown:/bin/boac/homeo

   配置过程后,重新编译内核,编译时选中Boa选项。把编译好的内核下载到硬件板,启动uclinux,完成IP配置,启动Boa Web Server,然后就可以通过lE访问你的网页了。如果想启动uclinux时自动启动Boa Web Server,可以修改re文件,进入uclinux-samsung/vendors/Samsung/4510B目录,在运行脚本rc中增加两行:

  ifconfig eth0 192.168.0.101 up

  boa-c/home/&

  修改后重新编译内核,再下载到硬件板运行.运行uclinux后,不需要配置就可以直接通过IE来访问http://192.168.0.101,看到你的网页了。

  ⑵uclinux下实现动态Web页面的CGI技术

   到目前为止,实现动态Web页面有4种技术可供选择:CGI(Common Gateway Interface), ASP(ActiveXServerPage),PHP(PersonalHomePage)和JSP(JavaServerPage).在 uclinux下如果要实现动态网页,只能采用CGI,因此目前uclinux还不支持ASP, PHP等动态Web页面技术。CGI(通用网关接口)提供Web服务器一个执行外部程序的通道,这种服务端技术使得浏览器和服务器之间具有交互性。CGI 程序属于一个外部程序,需要编译成可执行文件,以便在服务端运行。浏览器将用户输入的数据送到Web服务器,Web服务器将数据使用STDIN送给CGI 程序,在执行CGI程序后,可能会访问存储数据的一些文档,最后使用STDOUT输出HTML形式的结构文件,经Web服务器送回浏览器显示给用户。 CGI程序可以用任何程序设计语言编写,如Shell脚本语言、Perl,Fortran, Pascal, C语言等。但目前uclinux不支持Pert, Fortran等语言,而且C语言在平台无关性上表示不错,所以我们选择用C来编写CGI程序。另外,uClinux也不支持数据库,所以需要保存的数据 只能保存到文件中,CGI查询数据时也是查询这些文件,而不是访问数据库。

  ⑶uClinux下动态Web页面的实现

   下面通过一个例子来说明如何实现uClinux下的动态Web页面技术。此例子的目的是使用户能够通过Web页面内嵌表单提交数据,并能把用户提交的数 据通过Web浏览器正确地返回给用户。实现动态Web页面的第一步是用HTML语言编写Web页及内建表单。编写Web页面时,要由ACTION属性来指 定相关的CGI程序,如ACTION=cgi-bin/demo;由MOTHOD属性来指明所用的提交数据的方法,即MOTHOD=POST(GET)。

   实现动态 Web页面的第二步是用C编写CGI程序,CGI程序分为以下几部分:①根据POST方法或GET方法从提交的表单中接收数据;②URL编码的解码;③用 printf() 函数来产生HTML源代码,并将经过解码后的数据正确地返回给浏览器。包括demo.c, cgivars.h和cgivars.c三个文件。将编写好的CGI程序编译成二进制文件放在cgi-bin/目录下,CGI程序能被正确地执行,最终 CGI程序就可以对上述表单数据的进行处理了。

   下面对程序稍加说明。若以GET方法提交数据,表单中的数据被保存在QUERY_STRING环境变量中,通过调用函数 getenv("QUERY_STRING")来读取数据;若以POST方法提交数据,则程序先从CONTENT LENGTH环境量得到数据的字长,然后从标准输入中读取相应长度的字符串即可得到提交的数据。数组postinput[i] 中保存的就是从表单中提取的数据。

   URL编码的解码过程较为复杂,URL编码的规则下:①变量之间用“&”分开;② 变量与其对应值之间用“=”连接;③空格符用“+”代替;④特殊意义的字符用%接相应的十六进制ASCI码代替。解码即为编码的逆过程。在程序中,对于从 表单中提取过来的postinput[i]中的数据,当发现字符为“+”时,将它转换成空格;当发现字符为“&”时,意味着个名字2值对的结束, 在此处将字符中切成几个字符串;当再现字符为“=”时,意味着一个名字/值对的名字部分的结束,在此再将名字/值对分开。最后通过调用 unescape_url(char *url)子函数将十六进制ASCII码值表示的特殊字符转换成相应的ASCII字符。

  评论这张
 
阅读(233)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017