嵌入式Linux开发课件

上传人:沈*** 文档编号:230363475 上传时间:2023-08-24 格式:PPT 页数:86 大小:1.04MB
收藏 版权申诉 举报 下载
嵌入式Linux开发课件_第1页
第1页 / 共86页
嵌入式Linux开发课件_第2页
第2页 / 共86页
嵌入式Linux开发课件_第3页
第3页 / 共86页
资源描述:

《嵌入式Linux开发课件》由会员分享,可在线阅读,更多相关《嵌入式Linux开发课件(86页珍藏版)》请在装配图网上搜索。

1、第第6章章嵌入式嵌入式Linux开发开发 主讲:李岩 现在现在 Linux 广泛用于各类计算应用,广泛用于各类计算应用,不仅包括不仅包括 IBM 的微型的微型 Linux 腕表、手持设腕表、手持设备(备(PDA 和蜂窝电话)、因特网装置、瘦和蜂窝电话)、因特网装置、瘦客户机、防火墙、工业机器人和电话基础客户机、防火墙、工业机器人和电话基础设施设备,甚至还包括了基于集群的超级设施设备,甚至还包括了基于集群的超级计算机。计算机。本章主要介绍了:本章主要介绍了:怎样应用怎样应用Linux来进行嵌入式系统的开发。来进行嵌入式系统的开发。选用选用Linux操作系统的优势。操作系统的优势。Linux的简化

2、版本的简化版本uClinux相关知识。如内相关知识。如内存管理、进程管理、启动过程等。存管理、进程管理、启动过程等。开发工具开发工具Hittool的具体应用。的具体应用。6.1 6.1 嵌入式嵌入式Linux概况概况nLinux操作系统开放源代码,可以裁剪内核,操作系统开放源代码,可以裁剪内核,并已在并已在x86、Alpha、Sparc、MIPS、PPC、Motorola、NEC和和ARM等硬件平台上稳定、等硬件平台上稳定、高效地运行。高效地运行。nLinux操作系统作为一种多任务、稳定可靠、操作系统作为一种多任务、稳定可靠、内核可裁剪的系统,是开发嵌入式软硬件内核可裁剪的系统,是开发嵌入式软

3、硬件产品的优秀软件平台。产品的优秀软件平台。n嵌入式嵌入式Linux是一种开放源码、软实时、多是一种开放源码、软实时、多任务的嵌入式操作系统。任务的嵌入式操作系统。6.1.1 6.1.1 嵌入式嵌入式LinuxLinuxl在嵌入式开发中,随着微处理器的产生,价格低廉、结构在嵌入式开发中,随着微处理器的产生,价格低廉、结构小巧的小巧的CPU和外设接口提供了稳定可靠的硬件架构。和外设接口提供了稳定可靠的硬件架构。l高端嵌入式系统要求许多高级的功能,如图形用户界面和高端嵌入式系统要求许多高级的功能,如图形用户界面和网络支持。许多高端网络支持。许多高端RTOS供应商已经提供了这些功能,供应商已经提供了

4、这些功能,但其价格也很高,一般人难以接受。但其价格也很高,一般人难以接受。lLinux为嵌入式操作系统提供了一个极有吸引力的选择,为嵌入式操作系统提供了一个极有吸引力的选择,它是一个类它是一个类UNIX的、以内核为基础的、有完备内存保护的、以内核为基础的、有完备内存保护机制的、多任务多进程的操作系统。机制的、多任务多进程的操作系统。l由于由于Linux具有开放性,所以许多人认为具有开放性,所以许多人认为Linux非常适合多非常适合多数数Intemet设备。他们认为设备。他们认为Linux可以支持不同的设备,支可以支持不同的设备,支持不同的配置。持不同的配置。6.1.1 6.1.1 嵌入式嵌入式

5、LinuxLinux1.1.可运行于多种硬件平台可运行于多种硬件平台Linux符合符合IEEE POSIX.1标准,使应用程序具有较好的可移植性。标准,使应用程序具有较好的可移植性。Linux内核已经被移植到多种硬件平台上,这对受开销、时间限制的内核已经被移植到多种硬件平台上,这对受开销、时间限制的研究与开发项目是很有吸引力的。研究与开发项目是很有吸引力的。2.2.可裁剪,性能优异,应用软件丰富可裁剪,性能优异,应用软件丰富Linux的动态模块加载使的动态模块加载使Linux的裁剪极为方便,高度模块化的部件使的裁剪极为方便,高度模块化的部件使添加非常容易。添加非常容易。Linux是一个全面的多

6、任务和真正的是一个全面的多任务和真正的32位操作系统。系统运行稳定,位操作系统。系统运行稳定,功能强大,支持多种硬件平台,应用工具多。功能强大,支持多种硬件平台,应用工具多。3.3.使用成本低使用成本低Linux是免费软件,只要遵守是免费软件,只要遵守GPL(GNU General Public License)的规的规定,就可以免费获得拷贝,并进行开发和商业发行。定,就可以免费获得拷贝,并进行开发和商业发行。6.1.1 6.1.1 嵌入式嵌入式LinuxLinux4.4.强大的网络功能强大的网络功能ILinux操作系统最突出的是网络部分,基本上所有的网络操作系统最突出的是网络部分,基本上所有

7、的网络协议和网络接口都可以在协议和网络接口都可以在Linux上找到。上找到。ILinux内核对网络协议栈的设计是从简捷实用的角度出发内核对网络协议栈的设计是从简捷实用的角度出发的,它有一整套的网络协议模块。的,它有一整套的网络协议模块。ILinux的网络功能十分强大,更重要的是,的网络功能十分强大,更重要的是,Linux的网络的网络功能和协议是以内核可选的模块方式提供的,它允许用户功能和协议是以内核可选的模块方式提供的,它允许用户自由地裁剪和优化。自由地裁剪和优化。5.5.GUI开发支持开发支持GLinux本身有性能优秀的本身有性能优秀的X Window系统,在系统,在X Window系系统的

8、支持下,能方便地进行图形用户界面的开发。统的支持下,能方便地进行图形用户界面的开发。6.1.1 6.1.1 嵌入式嵌入式LinuxLinuxGX Window是一个在大多数是一个在大多数UNIX工作站上使用的图形用户工作站上使用的图形用户界面。界面。GX Window系统应用于嵌入式系统时,要考虑嵌入式系统系统应用于嵌入式系统时,要考虑嵌入式系统的特殊条件。的特殊条件。6.6.丰富的开发技术资源丰富的开发技术资源HLinux在这几年中不断成熟,越来越多的人加入了在这几年中不断成熟,越来越多的人加入了Linux的的行列。行列。H这意味着对新硬件的这意味着对新硬件的Linux驱动程序甚至比用于其他

9、驱动程序甚至比用于其他UNIX系统系统(如如Solaris的驱动程序的驱动程序)还来得及时。还来得及时。HLinux庞大的志愿者网络在生产庞大的志愿者网络在生产“补丁补丁”程序方面反应很程序方面反应很快。快。6.1.2 6.1.2 嵌入式嵌入式LinuxLinux的组成的组成最基本的嵌入式最基本的嵌入式Linux系统需要系统需要3个基本元素:个基本元素:O系统引导程序,用于完成机器加电后的系统定位引系统引导程序,用于完成机器加电后的系统定位引OLinux系统内核,为嵌入式应用提供一个软件环境,为应系统内核,为嵌入式应用提供一个软件环境,为应用程序完成基本的底层的资源管理工作;用程序完成基本的底

10、层的资源管理工作;O初始化过程,完成基本的初始化。初始化过程,完成基本的初始化。O为使这个最小嵌入式系统具有一定的实用性,还需加上硬为使这个最小嵌入式系统具有一定的实用性,还需加上硬件的驱动程序及件的驱动程序及个或几个应用进程以提供必要的应用功个或几个应用进程以提供必要的应用功能支持。能支持。O如果应用比较复杂,可能还需要添加一个可以在如果应用比较复杂,可能还需要添加一个可以在ROM或或RAM中使用的文件系统、中使用的文件系统、TCP/IP网络协议栈等。网络协议栈等。O在在PDA领域,还需要加上领域,还需要加上个个GUl支持。支持。6.1.3 6.1.3 嵌入式嵌入式LinuxLinux的版本

11、的版本1.将将Linux移植以满足实时要求的实时操作系统,移植以满足实时要求的实时操作系统,应用于一些关键的控制场合,如应用于一些关键的控制场合,如Fsmlabs公司的公司的RT Linux,Monta Vista的的Hard Hat Linux。2.尽可能保留尽可能保留Linux的强大功能,尽可能地减少其的强大功能,尽可能地减少其体积,以满足许多嵌入式系统对体积的要求,体积,以满足许多嵌入式系统对体积的要求,如如uClinux。3.针对特定嵌入式领域采用整合方案,如针对特定嵌入式领域采用整合方案,如Lineo,TimeSys,合肥华恒等。接下来,简要介绍常用,合肥华恒等。接下来,简要介绍常用

12、的两个嵌入式的两个嵌入式Linux操作系统。操作系统。6.1.3 6.1.3 嵌入式嵌入式LinuxLinux的版本的版本1.1.实时实时Linux(RT Linux)RT Linux是美国新墨西哥州大学计算机系研制开发的。是美国新墨西哥州大学计算机系研制开发的。RT Linux实现的内核位于通常的实现的内核位于通常的Linux内核之下,这个内核是一个实内核之下,这个内核是一个实时内核,它只需要完成底层的任务创建、中断服务程序,并为底层任时内核,它只需要完成底层的任务创建、中断服务程序,并为底层任务、务、ISR和和Linux进程之间进行通信排队。进程之间进行通信排队。RT Linux的调度方法

13、和用户实时任务的工作是通过的调度方法和用户实时任务的工作是通过Linux的可导入模的可导入模块的方式进行的。块的方式进行的。2.2.uClinuxuClinux是一个是一个GNU的项目,代码完全开放。的项目,代码完全开放。uClinux的英文解释是的英文解释是Micro Control Linux,可理解为,可理解为“微控制领域中微控制领域中的的Linux系统系统”。它专门应用于没有它专门应用于没有MMU的的CPU,并专为嵌入式系统做了许多小型化的,并专为嵌入式系统做了许多小型化的工作,已支持的微处理器包括工作,已支持的微处理器包括Motorola MC68000,MCF5206和和MCF52

14、07ColdFire等。等。6.2 6.2 uCLinux开发介绍开发介绍目前目前,uClinux往往基于两个往往基于两个Linux内核版本内核版本,2.0.38 是一个比较成熟的版本是一个比较成熟的版本,2.4.x是最新的是最新的版本版本Hitool 套件同时提供了对他们的支持。套件同时提供了对他们的支持。一般一般uClinux的内核大小在的内核大小在500k左右左右,如果加上一如果加上一些基本的应用些基本的应用,也就在也就在900k左右左右.非常适合于嵌入非常适合于嵌入式系统。式系统。uClinux架构架构如图如图6-1所示(下页)所示(下页),一些重要的,一些重要的模块在下面描述。模块在

15、下面描述。6.2.1 6.2.1 启动过程(启动过程(BootstrapBootstrap)n启动模块启动模块Bootstrap负责用来起动负责用来起动Linux内核,内核,包括包括Chip Selector初始化,系统堆栈的初始初始化,系统堆栈的初始化,把压缩的化,把压缩的Linux映像从映像从Flash中解压到中解压到RAM中,并把控制权交给内核的初始化例中,并把控制权交给内核的初始化例程。程。n这部分工作是与你的硬件高度相关的,所以这部分工作是与你的硬件高度相关的,所以这部分的代码要尽量精简。这部分的代码要尽量精简。6.2.2 6.2.2 内核初始化(内核初始化(KernelKernel

16、 Initialization Initialization)6内核初始化的入口地址是:内核初始化的入口地址是:start_kernel(在在init/main.c中中)。6它初始化内核的其它部分,包括异常它初始化内核的其它部分,包括异常(trap)、中断、中断(IRQ)、内存页、内存页(Page)、调度调度(Scheduling)、驱动程序等等。并、驱动程序等等。并启动启动“init”进程进入多任务环境。进程进入多任务环境。6.2.3 6.2.3 系统调用处理系统调用处理/异常处理异常处理当当“init”程序运行后,内核对整个系统的运行不再进行直接控制,程序运行后,内核对整个系统的运行不再进

17、行直接控制,而是通过系统调用给应用程序提供服务和响应外部及内部的异步事件,而是通过系统调用给应用程序提供服务和响应外部及内部的异步事件,例如:程序错误,硬件中断等。例如:程序错误,硬件中断等。在在ARM中中,系统调用采用系统调用采用swi指令所产生的软件异常来实现指令所产生的软件异常来实现,如例所示如例所示:swi 0 x900004(其中其中0 x900004表示这个系统调表示这个系统调用为用为sys_write)。00002550:2550:ef900004swi0 x009000042554:e3700a01cmnr0,#4096;0 x10002558:2afff6b0bcs20_sy

18、scall_error255c:e1a0f00emovpc,lr6.2.4 6.2.4 驱动程序驱动程序(Device Driver)(Device Driver)驱动程序是整个驱动程序是整个Linux内核的主要组成部分内核的主要组成部分,它们控制着操它们控制着操作系统和外部设备的交互。作系统和外部设备的交互。Linux的驱动程序是可选的,但是典型的系统应该包括一的驱动程序是可选的,但是典型的系统应该包括一个控制台个控制台(Console),),一个通用串口驱动程序一个通用串口驱动程序,一个块设备一个块设备 (用来存放根文件系统用来存放根文件系统)驱动程序。驱动程序。当当Linux内核起动的时

19、候内核起动的时候,需要一个输出调试信息的设备。需要一个输出调试信息的设备。这个设备往往通过串口来实现。这个设备往往通过串口来实现。这个调试终端可以通过这个调试终端可以通过register-console 这个函数来创建。这个函数来创建。而所有的调试信息都通过而所有的调试信息都通过Printk例程通过这个调试终端来例程通过这个调试终端来输出。输出。6.2.5 6.2.5 文件系统(文件系统(File SystemFile System)y支持多种文件系统是支持多种文件系统是Linux一个重要的特性,一个重要的特性,uClinux同样同样把这一特性带进了嵌入式系统中,并针对嵌入式系统作了把这一特性

20、带进了嵌入式系统中,并针对嵌入式系统作了一些取舍。一些取舍。y在在Hitool for uClinux包括了包括了romfs,Ext2 FS,RAM FS,NFS。y其中,其中,romfs 是最简单的只读文件系统,所占用的空间最是最简单的只读文件系统,所占用的空间最少,我们用它来做根文件系统(少,我们用它来做根文件系统(root file system)。)。y根文件系统里存放根文件系统里存放Linux启动时要用到的设备文件,配置启动时要用到的设备文件,配置文件和应用程序。文件和应用程序。y例如:例如:/dev/tty0,/etc/rc,/bin/init,/bin/sh,等等。等等。6.2.

21、6 6.2.6 内存管理内存管理!uClinux不能使用处理器的虚拟内存管理技术但仍然采用存储器的分页管理,系统在启动时把实际存储器进行分页。在加载应用程序时程序分页加载。但是由于没有MMU管理,所以实际上uClinux采用实存储器管理策略(物理内存)。!uClinux系统对于内存的访问是直接的,(它对地址的访问不需要经过MMU,而是直接送到地址线上输出),所有程序中访问的地址都是实际的物理地址。!由于应用程序加载时必须分配连续的地址空间,所以开发人员在开发应用程序时必须考虑内存的分配情况并关注应用程序需要运行空间的大小。!从内存的访问角度来看,开发人员的权利增大了(开发人员在编程时可以访问任

22、意的地址空间),但与此同时系统的安全性也大为下降。6.2.7 6.2.7 进程管理进程管理uClinux和和Linux之间最大的区别在于平面存储器模型。没有虚拟存储之间最大的区别在于平面存储器模型。没有虚拟存储器可以提供非常有效的器可以提供非常有效的fork系统调用。系统调用。由于在使用由于在使用fork时,内核会将父进程拷贝一份给子进程,但是这样的时,内核会将父进程拷贝一份给子进程,但是这样的做法相当浪费时间,因为大多数的情形都是程序在调用做法相当浪费时间,因为大多数的情形都是程序在调用fork后就立即后就立即调用调用exec,这样刚拷贝来的进程区域又立即被新的数据覆盖掉。,这样刚拷贝来的进

23、程区域又立即被新的数据覆盖掉。因此因此Linux系统提供一个系统调用系统提供一个系统调用vfork,vfork假定系统在调用完成假定系统在调用完成vfork后会马上执行后会马上执行exec,因此,因此vfork不拷贝父进程的页面,只是初始不拷贝父进程的页面,只是初始化私有的数据结构与准备足够的分页表。化私有的数据结构与准备足够的分页表。这样实际在这样实际在vfork调用完成后父子进程事实上共享同一块存储器(在子调用完成后父子进程事实上共享同一块存储器(在子进程调用进程调用exec或是或是exit之前),因此子进程可以更改父进程的数据及之前),因此子进程可以更改父进程的数据及堆栈信息,堆栈信息,

24、因此因此vfork系统调用完成后,父进程进入睡眠,直到子进程执行系统调用完成后,父进程进入睡眠,直到子进程执行exec。并且在这段时间内并且在这段时间内,子进程不能更改数据段和堆栈的内容。子进程不能更改数据段和堆栈的内容。6.2.7 6.2.7 进程管理进程管理当子进程执行当子进程执行exec时,由于时,由于exec要使用被执行程序要使用被执行程序的数据,代码覆盖子进程的存储区域,的数据,代码覆盖子进程的存储区域,这样将产生写保护错误(这样将产生写保护错误(do_wp_page)(这个时)(这个时候子进程写的实际上是父进程的存储区域)。这候子进程写的实际上是父进程的存储区域)。这个错误导致内核

25、为子进程重新分配存储空间。个错误导致内核为子进程重新分配存储空间。当子进程正确开始执行后,将唤醒父进程,使得当子进程正确开始执行后,将唤醒父进程,使得父进程继续往后执行。父进程继续往后执行。所以所以,在在uClinux中中,想让父子进程同时运行同一个想让父子进程同时运行同一个程序是不可以的。程序是不可以的。6.2.8 6.2.8 运行时间库及应用程序运行时间库及应用程序运行时间库提供了用户程序和内核程序的接口。运行时间库提供了用户程序和内核程序的接口。1.1.程序的入口代码程序的入口代码用户自己写程序一般从用户自己写程序一般从main开始,其实程序在运行时真正开始,其实程序在运行时真正的进入点

26、是的进入点是C运行库的一部分。这部分代码执行初始静态运行库的一部分。这部分代码执行初始静态数据,例如错误号(数据,例如错误号(errno)以及环境指示符()以及环境指示符(environ),),并且将参数并且将参数argc 和和argv传输到传输到main。参数和环境一般根据宏程序参数和环境一般根据宏程序start_thread(定义在定义在include/proc/processer.h)的调用约定,放在寄存器或者堆的调用约定,放在寄存器或者堆栈上。栈上。execve 系统调用利用系统调用利用start_thread建立一个虚拟环建立一个虚拟环境,程序的入口代码因此必须实现把境,程序的入口代

27、码因此必须实现把start_thread所建立所建立的环境恢复出来,并调用的环境恢复出来,并调用_uClibc_main。在。在_uClibc_main中再调用用户程序的中再调用用户程序的main。.text.global_start.global_uClibc_main.type_start,%function.type_uClibc_main,%function.text_start:/*清帧缓冲区指针清帧缓冲区指针*/movfp,#0/*argc,argv和和envp出栈出栈*/ldrr0,sp,#0ldrr1,sp,#4ldrr2,sp,#8/*运行运行uClibc的的main()函数

28、函数不应返回不应返回*/bl_uClibc_main6.2.8 6.2.8 运行时间库及应用程序运行时间库及应用程序 2.2.堆堆(heap)分配分配_用户程序通过调用用户程序通过调用malloc从堆中分配内存。在有虚拟存储从堆中分配内存。在有虚拟存储器的系统中,堆可以使用器的系统中,堆可以使用sbrk调用来扩大。调用来扩大。_因为虚拟存储器支持分段存储,所以可以在堆的最高端到因为虚拟存储器支持分段存储,所以可以在堆的最高端到堆栈的最底部之间留有很大的虚拟空间来做扩展之用。堆栈的最底部之间留有很大的虚拟空间来做扩展之用。_但在平面存储器系统中,没有这个空间。所以,堆空间改但在平面存储器系统中,

29、没有这个空间。所以,堆空间改用用mmap调用来分配。在调用来分配。在uClibc中,内存分配的算法非常中,内存分配的算法非常简单直接,存储器的管理完全依靠内核的页机制来完成。简单直接,存储器的管理完全依靠内核的页机制来完成。见图见图6-2。6.2.8 6.2.8 运行时间库及应用程序运行时间库及应用程序从从图图6-26-2中,可以看出另一项区别,因为物理上堆栈与静中,可以看出另一项区别,因为物理上堆栈与静态数据相连,所以,堆栈必须有足够的空间,以防止覆盖态数据相连,所以,堆栈必须有足够的空间,以防止覆盖静态数据和代码。静态数据和代码。在标准在标准Linux程序中的虚拟内存允许堆和堆栈之间留有足

30、程序中的虚拟内存允许堆和堆栈之间留有足够大的空间来让他们扩展。够大的空间来让他们扩展。系统可以监控页的使用情况,系统可以监控页的使用情况,防止堆栈溢出。防止堆栈溢出。但在但在uClinux中要预留这样大的物理空间是不可能的。中要预留这样大的物理空间是不可能的。另外,因为在另外,因为在uClinux中没有内存保护机制来防止堆栈溢中没有内存保护机制来防止堆栈溢出,在程序链接时要特别小心设定堆栈的大小。出,在程序链接时要特别小心设定堆栈的大小。6.2.8 6.2.8 运行时间库及应用程序运行时间库及应用程序4.4.执行文件格式(执行文件格式(Flat binary format)$uClinux系统

31、使用系统使用flat可执行文件格式,可以使用可执行文件格式,可以使用elf2flt工具把工具把ELF格式格式的可执行文件转化为的可执行文件转化为flat文件。文件。$当用户执行一个应用时,内核的执行文件加载器(当用户执行一个应用时,内核的执行文件加载器(fs/binfmt_flat.c)将对将对flat文件进行进一步处理,主要是对代码段和数据段进行修正。文件进行进一步处理,主要是对代码段和数据段进行修正。$为什么要修正呢?因为应用程序在连接时并不知道它要在系统的那一为什么要修正呢?因为应用程序在连接时并不知道它要在系统的那一段地址上面运行,这样就要求程序在任何地址上都要能运行,也就是段地址上面

32、运行,这样就要求程序在任何地址上都要能运行,也就是说与地址无关(说与地址无关(PICposition independent code)。)。$这个特性由针对这个特性由针对uClinux的编译器和连接器来提供。在的编译器和连接器来提供。在ARM中有一条中有一条相对跳转指令:相对跳转指令:ebxxxxxxblxxxxx;可以用来实现地址无关的跳转。可以用来实现地址无关的跳转。6.3 uCLinux6.3 uCLinux启动过程启动过程uClinux系统的启动可以分为两个步骤系统的启动可以分为两个步骤:1.1.运行运行bootloader初始化程序初始化程序JSRAM、SDRAM等存储设备属于挥发

33、性的存储器,掉电等存储设备属于挥发性的存储器,掉电以后其中的内容就会全部丢失,所以必须把操作系统的内以后其中的内容就会全部丢失,所以必须把操作系统的内核镜像存放在核镜像存放在Flash等不挥发性存储介质上。等不挥发性存储介质上。J从本质上来讲,从本质上来讲,bootloader不属于操作系统内核。它采用不属于操作系统内核。它采用汇编语言编写,因此针对不同的汇编语言编写,因此针对不同的CPU体系结构,这一部分体系结构,这一部分代码不具有可移植性。代码不具有可移植性。J在移植操作系统时,这部分代码必须加以改写。在移植操作系统时,这部分代码必须加以改写。6.3 uCLinux6.3 uCLinux启

34、动过程启动过程具体来讲,具体来讲,bootloader在系统启动时主要完在系统启动时主要完 成以下成以下几项工作:几项工作:1.将操作系统内核从将操作系统内核从Flash拷贝到拷贝到SDRAM中,如果是压缩中,如果是压缩格式的内核,还要将之解压缩。格式的内核,还要将之解压缩。2.改写系统的改写系统的memory map,原先,原先flash起始地址映射为起始地址映射为0地地址,这时需要将址,这时需要将RAM的起始地址映射为的起始地址映射为0。3.设置堆栈指针并将设置堆栈指针并将bss段清零。将来执行段清零。将来执行C语言程序和调语言程序和调用子函数时要用到。用子函数时要用到。4.改变改变pc值

35、,使得值,使得CPU开始执行真正的操作系统内核。开始执行真正的操作系统内核。6.3 uCLinux6.3 uCLinux启动过程启动过程2.2.运行操作系统内核运行操作系统内核%bootloader程序执行完上述的各项工作后,通过一条跳转程序执行完上述的各项工作后,通过一条跳转指令,转而执行指令,转而执行init目录下目录下C语言源文件语言源文件main.c中的函数中的函数start_kernel()。%因为在此之前因为在此之前bootloader已经创建好一个初始化环境,已经创建好一个初始化环境,C函函数可以开始执行了。数可以开始执行了。%整个操作系统内核的初始化工作从这里才算是真正开始。整

36、个操作系统内核的初始化工作从这里才算是真正开始。这个函数的长度比较短,代码如下:这个函数的长度比较短,代码如下:void _init start_kernel(void)char*command_line;unsigned long mempages;extern char saved_command_line;/*Interrupts are still disabled.Do necessary setups,then*enable them*/lock_kernel();printk(linux_banner);setup_arch(&command_line);printk(Kerne

37、l command line:%sn,saved_command_line);parse_options(command_line);trap_init();init_IRQ();sched_init();softirq_init();time_init();/*HACK ALERT!This is early.Were enabling the console before*weve done PCI setups etc,and console_init()must be aware of*this.But we do want output early,in case something

38、 goes wrong.*/console_init();#ifdef CONFIG_MODULES init_modules();#endif if(prof_shift)unsigned int size;/*only text is profiled*/prof_len=(unsigned long)&_etext-(unsigned long)&_stext;prof_len=prof_shift;size=prof_len*sizeof(unsigned int)+PAGE_SIZE-1;prof_buffer=(unsigned int*)alloc_bootmem(size);k

39、mem_cache_init();sti();calibrate_delay();#ifdef CONFIG_BLK_DEV_INITRD if(initrd_start&!initrd_below_start_ok&initrd_start min_low_pfn PAGE_SHIFT)printk(KERN_CRIT initrd overwritten(0 x%08lx 0 x%08lx)-disabling it.n,initrd_start,min_low_pfn 建立建立uClinux的内核开发环境,你需要一个的内核开发环境,你需要一个JTAG 仿真器(仿真器(PowerProbe

40、 或或JEDI),),与开发板和宿主机相连。与开发板和宿主机相连。再使宿主机的串口与开发板的串口相连,再使宿主机的串口与开发板的串口相连,并在宿主机上启动并在宿主机上启动HyperTerm程序,设置程序,设置波特率为波特率为9600。如图如图6-36-3所示:所示:6.4.2 6.4.2 开发环境的建立开发环境的建立其中其中HyperTerm用来作为用来作为uClinux的标准输的标准输入输出。网口可以作为入输出。网口可以作为MDB的调试界面的调试界面,也也可以通过它来使用网络文件系统可以通过它来使用网络文件系统(NFS)。当所有连接都正确后当所有连接都正确后,启动启动Configuratio

41、n of Hitool(只有在第一次使用时才需要只有在第一次使用时才需要)。根据根据JTAG仿真器类型,选择正确的仿真器类型,选择正确的JTAG 协议。具体配置可参照协议。具体配置可参照Hitool for ARM用户用户手册或者在线帮助。手册或者在线帮助。6.4.3 6.4.3 调试方法调试方法 调试主要有三种方法:调试主要有三种方法:JTAG调试方法;调试方法;MDB调试方法;调试方法;FTP调试方法调试方法1.1.1 1 JTAG调试方法调试方法t首先在首先在uClinux的控制台(的控制台(PC上的上的HyperTerm)上执行这个程序。)上执行这个程序。t当这个用户程序被内核加载时,

42、会有一个对话框跳出问你是否想要当这个用户程序被内核加载时,会有一个对话框跳出问你是否想要调试此程序。选择调试此程序。选择No按钮表示继续此程序,不进行调试。按钮表示继续此程序,不进行调试。t如果你不希望下次运行此程序时对话框再次跳出,只需选择如果你不希望下次运行此程序时对话框再次跳出,只需选择“Dont show this message again when this program launches”选选项。项。t如果点击如果点击Yes按钮按钮,一个一个Add Symbol Table对话框将跳出,请你选对话框将跳出,请你选择下载合适的符号文件(择下载合适的符号文件(*.elf)。)。6.

43、4.3 6.4.3 调试方法调试方法 在对话框最下面的三个编辑框显示的是这个程序被加载后在在对话框最下面的三个编辑框显示的是这个程序被加载后在RAM中中各个段的位置,请不要改动它们,各个段的位置,请不要改动它们,如图如图6-46-4所示所示。图64 uClinux应用程序调试对话框6.4.3 6.4.3 调试方法调试方法t在符号文件下载以后,这个程序将被执行到在符号文件下载以后,这个程序将被执行到main函数后停止。函数后停止。t这是你可以像普通嵌入式程序一样调试它。这是你可以像普通嵌入式程序一样调试它。t而且你仍然可以在内核上设置断点,当程序用到而且你仍然可以在内核上设置断点,当程序用到系统

44、调用或设备驱动程序时,你可以设断点直接系统调用或设备驱动程序时,你可以设断点直接执行到断点。执行到断点。6.4.3 6.4.3 调试方法调试方法2.2.FTP调试方法调试方法关于关于JFFS/JFFS2文件系统的建立,请读者参考相关技术资料。在文件系统的建立,请读者参考相关技术资料。在此仅描述如何将用户程序通过局域网,从此仅描述如何将用户程序通过局域网,从FTP服务器服务器(运行运行Linux宿主宿主机机)上,传输到运行上,传输到运行uClinux的目标系统的目标系统(FTP客户机客户机)并执行的过程:并执行的过程:(1)将目标系统与)将目标系统与Linux宿主机连接在同一网段中,在宿主机的任

45、意目宿主机连接在同一网段中,在宿主机的任意目录下编写应用程序,并用交叉编译工具生成录下编写应用程序,并用交叉编译工具生成flat格式的文件。格式的文件。(2)启动目标系统的)启动目标系统的uClinux,通过超级终端,输入下面的命令:,通过超级终端,输入下面的命令:ifconfigeth0192.168.100.50ifconfig命令用于配置目标系统的命令用于配置目标系统的IP地址其中,地址其中,eth0代表目标系统的网代表目标系统的网络设备,络设备,IP地址地址192.168.100.50为目标系统的为目标系统的IP地址,此时宿主机的地址,此时宿主机的IP地址为:地址为:192.1681.

46、100.21。执行命令:执行命令:ifconfigall可以看到目标系统的可以看到目标系统的IP地址已被正确配置地址已被正确配置6.4.3 6.4.3 调试方法调试方法(3)测试一下与宿主机的连接测试一下与宿主机的连接,键入命令:键入命令:ping192.168.100.21应能得到宿主机的应答信息。应能得到宿主机的应答信息。(4)当目标系统与宿主机已正确建立连接后,进入目标系统的可写目当目标系统与宿主机已正确建立连接后,进入目标系统的可写目录录/var或或/tmp,并登录到宿主机:,并登录到宿主机:cdvarftp192.168.100.21(5)输入宿主机上的合法用户名及密码,便与宿主机建

47、立了输入宿主机上的合法用户名及密码,便与宿主机建立了FTP连接。连接。为传输二进制文件,键入命令:为传输二进制文件,键入命令:ftpbinary200TypesettoI6.4.3 6.4.3 调试方法调试方法注意:注意:在用在用FTP进行文件传输的时候,一进行文件传输的时候,一定要选好文件传输的模式,定要选好文件传输的模式,FTP默认模式为默认模式为二进制模式,但是为了保险起见,还是手二进制模式,但是为了保险起见,还是手动把传输模式显式改写为二进制模式。通动把传输模式显式改写为二进制模式。通常的常的txt、html和绝大多数和绝大多数PS文件都是文本文件都是文本格式的,而其他的可执行文件、压

48、缩文件格式的,而其他的可执行文件、压缩文件都是二进制格式。两种格式之间要用都是二进制格式。两种格式之间要用ascii和和binary命令切换,两者都可以适当缩写。命令切换,两者都可以适当缩写。6.4.3 6.4.3 调试方法调试方法(6)传输已编译好的可执行文件(如传输已编译好的可执行文件(如lednxy)到目标系统并退出)到目标系统并退出FTP服务,键入命令:服务,键入命令:ftpgetlednxyftpquit(7)此时,可执行文件此时,可执行文件lednxy已传输至目录已传输至目录/var或或/tmp下,但文件的下,但文件的可执行属性未被设置,添加文件的可执行属性,键入命令:可执行属性未

49、被设置,添加文件的可执行属性,键入命令:chmod755lednxychmod是一个文件权限修改的命令,在文件创建的时候会自动设置存是一个文件权限修改的命令,在文件创建的时候会自动设置存取权限,若是这些默认权限无法适合企业环境的需求,就可以利用取权限,若是这些默认权限无法适合企业环境的需求,就可以利用chmod命令来修改存取权限。命令来修改存取权限。通常在权限修改的时候可以用两种方式表示权限类,通常在权限修改的时候可以用两种方式表示权限类,数字表示法数字表示法和和文文字表示法字表示法。6.4.3 6.4.3 调试方法调试方法这里我们采用的是数字表示法。就是说将读取这里我们采用的是数字表示法。就

50、是说将读取(r)、写入、写入(w)和执行和执行(x)分别以分别以4、2、1来代表,没有授予权限的部分就表示值为来代表,没有授予权限的部分就表示值为0,然后,然后再把所授予的权限相加而成。表再把所授予的权限相加而成。表6-1为读者列出了几个例子。为读者列出了几个例子。表6-1 存取权限范例6.4.3 6.4.3 调试方法调试方法 表中每三位字符为一组,这样权限可以被分为表中每三位字符为一组,这样权限可以被分为三组:三组:第一组表示此文件拥有者的存取权限第一组表示此文件拥有者的存取权限第二组表示该文件拥有者所属组成员的存取权限第二组表示该文件拥有者所属组成员的存取权限最后一组表示该文件拥有者所属组

51、之外的用户存取权限。最后一组表示该文件拥有者所属组之外的用户存取权限。(8)执行程序)执行程序lednxy,键入命令:,键入命令:./lednxy6.4.3 6.4.3 调试方法调试方法3.3.MDB调试方法调试方法 MDB是一个是一个Linux的任务调试监控程序,它本身也是一个的任务调试监控程序,它本身也是一个Linux的的应用程序,这个程序可以作为其他需要调试的程序的父进程,来控制应用程序,这个程序可以作为其他需要调试的程序的父进程,来控制它们的运行。它们的运行。(1)单应用程序)单应用程序MDB调试方法如下:调试方法如下:要使用要使用MDB协议协议,先要在先要在Startup Confi

52、guration里进行设定如下:里进行设定如下:选择选择protocol为为MDB选择选择Port为为Ethernet,如果你板子上的网口不可以用来做调试,请选择如果你板子上的网口不可以用来做调试,请选择COM1或或COM2,并写上相应的,并写上相应的IP地址或波特率(地址或波特率(9600-57600之间)。之间)。在在TgtSvr框中,填入运行框中,填入运行TargetServer的的PC的的IP地址,缺省为本地。地址,缺省为本地。图图6-5 MDB 6-5 MDB 配置对话框配置对话框6.4.3 6.4.3 调试方法调试方法然后让然后让uClinux在开发板上运行起来,以在开发板上运行起

53、来,以root身份进入,密码身份进入,密码uClinux。在控制台上打入。在控制台上打入MDB:9999(用网络连接,(用网络连接,9999是是port)或)或MDB/dev/ttySx(用串口连接,(用串口连接,x为为1或或2)如果控制台与调试使用同一个串)如果控制台与调试使用同一个串口,请把控制台中断。口,请把控制台中断。运行运行TargetServer。启动启动Hitool,选择选择Project|InitDebugger命令。命令。现在现在,可以下载需要调试的文件了。可以下载需要调试的文件了。6-6uClinux控制台控制台6.4.3 6.4.3 调试方法调试方法(2)如果要同时调试多

54、个程序如果要同时调试多个程序,请打开多个请打开多个Hitool,一个一个Hitool只能调试一个程序。你可以用下列命令来开始一个调试过只能调试一个程序。你可以用下列命令来开始一个调试过程。程。Loadimage下载一个下载一个uClinux可执行文件可执行文件(flat binary file,*.exe)到目标板。到目标板。fork运行一个程序运行一个程序,并把相应的符号文件并把相应的符号文件(*.exe.elf)加到符号表中,使程加到符号表中,使程序停在序停在main函数上。函数上。loadimagethenfork顺序执行顺序执行load 和和fork。kill中止当前被调试的进程。中止

55、当前被调试的进程。attach截获一个已经在运行的任务截获一个已经在运行的任务,并进行调试。并进行调试。6.4 6.4 开发工具介绍开发工具介绍6.5.1 6.5.1 配置内核配置内核 启动启动Hitool for uClinux后,会有一个叫做后,会有一个叫做“Linux Kernel”的工具栏出现在屏幕上的工具栏出现在屏幕上(如图6-7所示)。图6-7 Linux 工具条6.5.1 6.5.1 配置内核配置内核请按请按“Setting”按钮设置按钮设置Linux相关的源文件路径,内核版本,以及相关的源文件路径,内核版本,以及运行时间库的版本。例如,如果你的运行时间库的版本。例如,如果你的L

56、inux源结构为:源结构为:C:uclinuxuClinux-distuserC:uclinuxuClinux-distlinux-2.4.xC:uclinuxuClinux-distlib如图如图6-8所示所示则设置源文件路径为:则设置源文件路径为:C:uclinuxuClinux-dist设置设置Kernel version为:为:linux-2.4.x设置设置Library为:为:uClibc(useuC-libcforSamsung4510/44B0)图6-8 uClinux环境设置6.5.1 6.5.1 配置内核配置内核 当这些参数设定以后当这些参数设定以后,按按Config Ker

57、nel按钮按钮,就进入就进入了系统配置主窗口(了系统配置主窗口(如图如图6-9所示所示)。)。如果选择如果选择yfor“CustomizeKerenelSettings”or“CustomizeVendor/User Settings”,会依次出现会依次出现图图6-11和和图图6-12窗口窗口。图6-9 uClinux配置主窗口图6-10 目标配置主窗口图6-11 内核配置窗口图6-12 开发板配置窗口6.5.1 6.5.1 配置内核配置内核 你可以根据开发板的参数填入相应的值。你可以根据开发板的参数填入相应的值。所有的预设所有的预设值都是为所带的评估板而设定的。值都是为所带的评估板而设定的。

58、其他配置窗口不再一一赘述。其他配置窗口不再一一赘述。当配置完成之后当配置完成之后,会自动作依赖关系设定。这会需要一会自动作依赖关系设定。这会需要一段时间。在整个过程中,如果你希望终止至,可以按段时间。在整个过程中,如果你希望终止至,可以按”stop”按钮。按钮。6.5.2 6.5.2 编译内核编译内核$第一步第一步是编译是编译user目录下的一些应用程序目录下的一些应用程序,例如例如init.exe,agetty.exe,sh.exe,mount.exe等等等等$第二步第二步是把第一步编好的程序考到是把第一步编好的程序考到romfs目录下目录下,并调用并调用genromfs 命令来生成根文件系

59、统的映像命令来生成根文件系统的映像romfs.img。$第三步第三步才是编译内核才是编译内核,并把并把romfs.img连接进去连接进去,产生产生linux.elf。$第四步第四步是把是把linux.elf 去掉条是信息去掉条是信息,转成转成linux.bin,并把它并把它与与boot 目录下的启动代码连接在一起目录下的启动代码连接在一起,生成最终的生成最终的Flash映像映像linux_bootrom.bin。6.6 6.6 内核的调试内核的调试6.6.1 下载 uClinx内核要进行调试要进行调试,先执行菜单命令先执行菜单命令Project|Init Debugger,使使Hitool与仿

60、真器连接。如果你将要调试的与仿真器连接。如果你将要调试的uClinux内核内核(linux.elf)已准备好,点击已准备好,点击Load按钮将内核下载到开发按钮将内核下载到开发板的板的RAM上。上。这样,你可以调试这样,你可以调试Linux内核就像调试一个普通的嵌入式内核就像调试一个普通的嵌入式程序。程序。Hitool会帮你处理掉很多和会帮你处理掉很多和Linux相关的细节。相关的细节。在在Hitool for uClinux中,我们包括了一个预先编译好的中,我们包括了一个预先编译好的Linux内核,该内核存储于内核,该内核存储于uClinux-dist/linux-2.0.x(for EV4

61、0 board)或者或者uClinux-dist/linux-2.4.x/(for 4510B board)中。中。6.6.2 几个调试窗口1 1uClinux源代码结构窗口和调试符号源代码结构窗口和调试符号窗口窗口在调试过程中在调试过程中,有几个窗口会很有帮助有几个窗口会很有帮助,一个是项目窗一个是项目窗口中的口中的“Linux SRC”pane,这里会列出,这里会列出uClinux的源代的源代码的文件结构。另一个是码的文件结构。另一个是”Symbol”Pane。你可以通过他们在复杂的你可以通过他们在复杂的Linux源代码中找到需要的源代码中找到需要的信息,信息,如图如图6-13和和如图如图

62、6-14所示所示。图6-13 uClinux源代码结构和调试符号6.6.2 几个调试窗口2 2调试源代码窗口调试源代码窗口图图6-14给出了给出了uClinux调试源代码窗口,调试源代码窗口,行号前的圆点表示设置的断点。行号前的圆点表示设置的断点。图6-14 uClinux调试源代码窗口6.6.2 几个调试窗口3 3uClinux任务信息窗口任务信息窗口(1)uClinux 进程窗口进程窗口Hitool为开发者提供了为开发者提供了uClinux中运行的任务的详细的信息。中运行的任务的详细的信息。点击工具菜单的点击工具菜单的TaskInfo,打开,打开uClinux窗口,窗口信息如图窗口,窗口信

63、息如图6-15所示。所示。uClinux窗口显示了系统的所有进程,它们按照创建顺序排列。对窗口显示了系统的所有进程,它们按照创建顺序排列。对于每一个线程,给出了详细内容如下:于每一个线程,给出了详细内容如下:Name程序名;程序名;Pid进程标示符;进程标示符;State目前进程执行状态,目前进程执行状态,图6-15 uClinux 进程窗口进程可处在五个状态中的一个状态下进程可处在五个状态中的一个状态下:Running(运行态)(运行态):进程已经在被进程已经在被CPU执行执行或者正在等待被或者正在等待被CPU执行。执行。Interruptiable(可中断态)(可中断态):进程正在等待某些

64、事件或者资源。可进程正在等待某些事件或者资源。可以被一些信号中断。以被一些信号中断。Uninterruptible(不可中断态)(不可中断态):进程正在等待某些事件或者资源,进程正在等待某些事件或者资源,一般情况下,它在等待硬件资源,不可用任何方式中断。一般情况下,它在等待硬件资源,不可用任何方式中断。Zombie:进程实际上已被中止。但是由于某种原因,进程进程实际上已被中止。但是由于某种原因,进程task_struct还停留在任务向量表还停留在任务向量表task vector中,这是进程的最后状态。中,这是进程的最后状态。Stopped:进程被中断,被调试的进程有可能中断。进程被中断,被调试

65、的进程有可能中断。在在Linux中有的中有的Swapping状态在状态在uClinux中是不存在的。中是不存在的。Counter进程计数器进程计数器Priority进程优先级进程优先级Policy进程的调度算法。进程的调度算法。FIFO运行首先创建的进程。运行首先创建的进程。RR按顺序标记完成进程。按顺序标记完成进程。这样,直到所有的进程都已完成。这样,直到所有的进程都已完成。Register-所选进程的寄存器所选进程的寄存器6.6.2 几个调试窗口(2)uClinux窗口快捷菜单窗口快捷菜单当你右击当你右击uClinux窗口上部任何地方,会弹出窗口上部任何地方,会弹出如图如图6-16的快捷菜

66、单:的快捷菜单:Identifiers窗口窗口这一项弹出这一项弹出如图如图6-17的的Identifiers对话框,显示选中进程标识符,用对话框,显示选中进程标识符,用户标识符和组标识符。户标识符和组标识符。Time窗口窗口如图如图6-18所示所示,显示选中进程的时间信息。包括进程的创建时间,在,显示选中进程的时间信息。包括进程的创建时间,在用户态的运行时间,在内核态的运行时间等等。用户态的运行时间,在内核态的运行时间等等。Timer窗口窗口 Linux支持以下三种计时器:实时,虚拟,以及检索支持以下三种计时器:实时,虚拟,以及检索Profile计时器计时器如如图图6-19所示所示,Timer对话框显示着三个计时器的信息。对话框显示着三个计时器的信息。图6-16 uClinux 任务快捷菜单图6-18 uClinux 进程时间统计窗口图6-19 uClinux 进程定时器窗口6.6.2 几个调试窗口MemoryManagement窗口窗口弹出弹出如图如图6-20所示所示的存储器管理对话框,显示选中进程的代码段,的存储器管理对话框,显示选中进程的代码段,数据段,以及堆栈段的信息。数据段,

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!