七月 2007


常总结总结03 Jul 2007 05:09 pm

利用RTLinux开发嵌入式应用程序

  对于中国工程师来说,利用实时Linux开发嵌入式应用程序是他们面临的困难之一,本文以RTLinux为例,并结合最为业界关注的是RTAI进行讨论,尽管这两种实现方式在句法细节上存在差异,但工作方式基本一样,因此所讲述的内容对两者都适用。

在实时任务与用户进程相互通信的过程中,有些实时应用程序无需任何用户界面即可在后台平静地运行,然而,越来越多的实时应用程序确实需要一个用户界面及其 它系统功能,如文件操作或联网等,所有这些功能都必须在用户空间内运行。问题是,用户空间操作是非确定性的,而且与实时操作不兼容。

幸运的是实时Linux具有一种可在时间上减弱实时与非实时操作的机制,这种机制表现为一种称为实时FIFO的驱动程序。当insmod将 rtl_fifo.o驱动程序插入Linux内核时,该驱动程序将自己注册为RTLinux的一部分,并成为Linux驱动程序。一旦插入Linux内 核,用户空间进程和实时任务都可使用实时Linux FIFO。

在深入探讨实时FIFO的细节之前,还要回顾一下实时应用程序结构的某些部分(图1)。有效的嵌入式应用程序设计方法是将实时部分与固有的非实时功能分离 开来(表1)。如果应用程序的任一部分,如用户界面、图形、数据库或网络仅需软实时性能,最好是将该部分写入用户空间。然后,仅将必须满足时序要求的那部 分写成实时任务。

注意,RTLinux(PSC,便携式信号编码)和RTAI(LXRT,Linux实时扩展)的最新版本已采用了一种可在用户空间执行软和硬实时任务的方法。

任何硬实时任务都是在RTLinux的控制下运行的,该任务一般可执行周期性任务、处理中断并与I/O设备驱动程序通信,以采集或输出模拟和数字信息。当 实时任务需要告诉用户进程有一个事件将发生时,它便将这一消息送给实时FIFO。每一个FIFO都是在一个方向上传送数据:从实时任务到用户空间,或反 之。因此,双向通信需要使用两个FIFO。任何读出或写入实时任务一侧的操作都是非模块操作,因此rtf_put()和rtf_get()都立即返回,而 不管FIFO状态是什么。

从应用程序一侧来看,FIFO就像一个常规文件。缺省情况下,RTLinux安装程序将在/dev目录下创建64个实时FIFO节点;如果需要,还必须自己创建新的节点。例如,要创建/dev/rtf80,需采用如下命令:

=========================
mknod c 150 80;
chmod 0666 /dev/rtf80
=========================

其中,150是实时FIFO主数,而80是rtf80的次数。

从用户进程的角度看,实时FIFO可执行标准文件操作。从实时任务来看,FIFO有两种通信方式:直接调用RTLinux FIFO功能,或将FIFO作为一个RTLinux设备驱动程序,并使用open()、close()、read()和write()操作。要想将 FIFO作为一个设备驱动程序,就必须将rtl_conf.h中的配置变量CONFIG_RTL_POSIX_IO设定为1。

rtf_create_handler()可设置处理程序功能。每次Linux进程读或写FIFO时,rtl_fifo驱动程序都要调用该处理程序。应注 意的是,该处理程序驻留在Linux内核,因此当Linux需要调用时,从该处理程序进行任何内核调用都是安全的。从该处理程序到实时任务间的最好通信方 法是使用旗语或线程同步功能。最后,FIFO驱动程序还必须对内核存储器进行配置。因此,实时线程内的rtf_create()不应调用。相反,可调用 init_module()中的rtf_create()功能及cleanup_module()中的rtf_destroy()功能。

例如,列表1给出了一个采用两个FIFO的简单数据采集应用程序的实时部分。两个FIFO都是在init_module()创建,并赋予minor numbers 为1和2。在调用rtf_create(minor, size)之前,该程序在已创建该FIFO的情况下调用rtf_destroy(minor)。这种情况就是另一个模块在开发过程中未被调用。然后,调用 rtf_create_handler(ID, &pd_do_aout)以注册带该实时FIFO的数据采集模拟输出功能pd_do_aout()。注意,创建实时线程pp_thread_ep ()是因为它是周期性的,其间隔为1/100秒。

每次周期性线程得到系统控制权后,它就调用rtf_put(ID,dataptr,size)以便将数据插入minor number为2的FIFO。Linux进程打开/dev/rtf2,从实时FIFO中读取并显示所采集的数据。该进程还打开/dev/rtf1,将数据 写入其它实时FIFO。当用户移动屏幕滑动器以改变模拟输出电压时,进程就向该FIFO写入一个新的值。RTLinux便调用pd_do_aout()处 理程序,随后pd_do_aout()利用rtf_get()从FIFO获得值,并调用实际的硬件驱动程序以设置模拟输出的电压。可以看到,实时任务和用 户进程是异步使用FIFO的。

任务间的存储器共享

FIFO为用户进程和实时任务的连接提供了一种方便的机制,但将它们作为消息队列更合适。比如,一个实时线程可利用FIFO记录测试结果,然后用户进程就可读取该结果,并将之存入数据库文件。

许多数据采集应用程序涉及到内核及用户空间之间的大量数据。Linux内核v. 2.2.x并没有为这些空间的数据共享提供任何机制,但v. 2.4.0版本预计会包括kiobuf结构。为解决现有稳定内核的这个缺点,RTLinux包括mbuff驱动程序。该驱动程序可利用vmalloc() 分配虚拟内核存储器的已命名存储器区域,它采用的存储器分配和页面锁定技巧跟大多数Linux中bttv帧抓取器(frame-grabber)驱动程序 所用的一样。

更具体地说,mbuff一页一页地将虚拟内存锁定到实际的物理内存页面。任何实时或内核任务,或用户进程在任何时间都可访问该存储器。通过将虚拟内存页面 锁定到物理内存页面,mbuff可确保所分配的页面永久驻留在物理内存,而且不会发生页面错误。换言之,当实时或内核进程访问所分配的存储器时,它可确保 VMM不被调用。注意:由于实时任务执行期间实时Linux冻结标准内核的执行,任何对VMM的调用都会引起系统暂停。如果它要访问并不位于物理RAM内 的虚拟存储页面,那么即使正常的Linux内核驱动程序也会引起系统故障。

由于mbuff是一种Linux驱动程序,其功能可通过设备节点/dev/mbuff实现。该节点可显示几个录入点,其中包括可将内核空间地址映射到用户 空间的mmap()。它还可以利用录入点ioctl()来控制。然而,并不需要复杂的结构及直接调用ioctl。相反,mbuff可为ioctl()调用 提供一个包裹,而且仅仅调用两个简单的功能即可配置和释放共享的存储缓冲器。

当然,不能从实时任务调用mbuff驱动程序,因为该驱动程序所调用的虚拟存储器分配功能本身是不确定性操作。分配共享存储器所需的时间依赖于主系统的存 储器容量以及CPU速度、磁盘驱动器性能和存储器分配的现有状态。因此,只能从模块的Linux内核一侧来分配共享存储器,比如从init_module ()或一个ioctl()请求开始。

那么,一个共享缓冲器到底能分配多少存储器呢?如果不是任务繁重的服务器或图形应用,建议至少为Linux保留8MB存储空间。为了获得优化的配置,可在限制存储器大小的同时测量实时应用程序的性能,以确定需要多少存储空间。

列表2给出了如何从实时任务和用户进程方面访问共享的存储器。内核模块和用户任务采用同样的功能集。当然,要想使用insmod mbuff.o,还必须将之置于Linux内核中。例如,mbuff_alloc(”buf_name”, size)可将符号名buf_name分配给一个缓冲器,而mbuff_free(”buf_name”, mbuf)可将之释放。

当第一次调用带有符号缓冲器名的mbuff_alloc()时,mbuff执行实际的存储器分配。而当从内核模块或用户进程再次调用该功能时,它只是简单 地增加使用数(usage count)及将指针返回现有的缓冲器。每次调用mbuff_free()都会减少使用数,直至为零,这时mbuff就去分配带符号名的缓冲器。这种方法 从多个内核模块和用户进程获得一个指向同一共享缓冲器的指针,从而解决了问题。它还可确保共享缓冲器一直有效,直到最后的应用程序释放它。请注意,是实时 内核还是用户进程执行实际的buf1配置依赖于谁先获得控制权。

还有一个“笨”方法可在实时应用程序、内核模块和用户应用程序间共享存储器。对于嵌入式应用,该方法还是可以接受的。例如,如果PC带有128MB RAM,可将线搜索路径=”mem=120m”添加进lilo.conf文件(列表3)。当启动带有Linux内核和RTLinux 2.3的系统时,Linux仅使用120MB内存。OS也不用剩下的8MB内存(物理地址为0×7F00000到0×7FFFFFF),而是留给在OS下 运行的各种任务共享。要想从用户进程获取存储器地址并访问预留的存储器,必须用O_RDWR访问模式来打开/dev/mem驱动程序,然后利用mmap ()保留存储器(列表4)。而从实时模块或内核驱动程序一侧进行,则必须使用ioremap(0×7F00000, 0×100000)才能获取这8MB (0×100000字节)预留内存。

这种方法有利有弊。既不能通过预留内存的所有权,也不能通过读或写来获取控制权。正确地配置和释放大量内存的机制尚未问世。另外,无论实时进程是否需要,该内存都不能为Linux所用。

也许存储器共享笨方法的唯一适用场合是专为特定应用而定制的小型嵌入式系统,因为此时可为小型化而放弃使用mbuff驱动程序。

中断

RTLinux有两种中断:硬中断和软中断。软中断就是常规Linux内核中断,它的优点在于可无限制地使用Linux内核调用。这类中断作为硬中断处理的第二部分还是相当有用的(由参考文献5可获得更多有关Linux环境下中断处理的细节)。

硬(实时)中断是安装实时Linux的前提。要安装中断处理程序,先调用rtl_request_irq(…),然后调用rtl_free_irq ()释放它。依赖于不同的系统,实时Linux下硬(或实时)中断的延迟是15μs的数量级。较快的处理器具有较好的延迟。如果想在实时处理程序和常规 Linux驱动程序中处理同一设备IRQ,必须为每一个硬中断单独设置IRQ。

列表5给出了安装实时中断处理程序的过程。RTLinux在执行实时中断处理程序时将禁止IRQ。应注意,该代码须在退出实时中断处理程序前调用rtl_hard_enable_irq()才能重新使能中断。

有两个问题影响直接从实时中断处理程序调用Linux内核功能:内核禁止所有中断及不定义执行内容。还应注意的是,这里也不能执行浮点操作。利用实时中断 处理程序来控制线程执行是避免出现这些问题的好办法。本例采用pthread_wakeup_np()功能来唤醒一个实时线程。中断处理程序可处理即时的 工作,余下的由该线程解决。

SMP结构的优点

实时Linux都支持多处理器架构。对称多处理器(SMP)结构采用了高级可编程中断控制器(APIC),奔腾级处理器都有片上本地APIC,可为本地处 理器传送中断。SMP(甚至单处理器母板)都有I/O APIC,可收集来自外设的中断请求,并将它们传送给本地APIC。旧的8259 PIC速度很慢,所处理的中断向量数不充分,迫使设备共享中断,使得中断处理更慢。但是,APIC可解决这些问题。通过为每个设备请求设置一个特定的 IRQ,系统可减少中断延迟,APIC还可加速同步代码。

实时Linux可充分利用APIC。在SMP系统中,实时调度程序利用APIC,而不是采用过时的8254芯片来完成时序分配。由于PC的兼容性, 8254位于每一个ISA总线上,而且每一个再编程设备的调用都要占用处理器周期。一个千兆赫CPU要浪费数百个处理器周期来等待8MHz定时器(大约 2.5μs)。APIC工作在总线频率,而且可立即执行所有的定时器操作,这意味着必须利用本地APIC时钟在AMP机器上获取更高的周期性频率(双P- III-500 CPU可在100kHz运行周期性实时线程,而无明显的性能损失)。

实时Linux能很好地执行多处理任务,它为每个CPU实施单独的进程。调用pthread_create()可创建一个在现有CPU上运行的线程。还可 用pthread_attr_setcpu_np()将该线程分配给一个特定的CPU,以改变线程属性。在调用这一功能之前,必须首先初始化线程属性。

RTLinux v. 3包括reserve_cpu功能,可预留SMP平台上的一个CPU,专供RTLinux使用。它可运行于2.4x内核,RTAI也具有几乎同样的功能。

如果想将任务分给某一特定的CPU,请留意“pset”方案(http://isunix.it.ilstu.edu/thockin/pset/)。利用该内核可将一个SMP处理器专门分配给一个用户应用程序,甚至可从Linux处理器组中调用一个处理器专用于实时任务。

同步基元

早期的实时Linux没有同步基元。现在,POSIX型的旗语、互斥和信号在最新的实时Linux版本中都已出现。虽然在实时设计中采用这些同步基元还存 在问题,但同步或用信号表示实时任务和用户应用程序很有意义,然而,这要求软件开发者具有高超的技能,这一问题已超出本文的讨论范围。

快速学习pthread_mutex_init()、pthread_mutex_lock()、pthread_mutex_trylock()、 pthread_mutex_unlock()和pthread_mutex_destroy()等同步功能的最好方法是查看. /examples/mutex/mutex.c。特别要提醒的是./examples/mutex/sema_test.c文件是学习旗语的很好起点。

实时Linux发展方向

实时Linux与Linux一样仍然处于不断发展之中。每一个新的版本都添加了更多的特性和功能。实时Linux正朝着更好的POSIX 1003.x实现方向发展,最新的特性包括用户空间进程的实时支持、互斥、信号、旗语、实时存储器管理和扩展的SMP支持等。如果还未确定下一个项目采用 哪个实时系统,可下载一种实时Linux版本了解一下。其实,Linux已经是一种成熟的OS,而且具备实时扩展版本,它是嵌入式应用的最佳选择之一。

Alex Ivchenko博士是联合电子实业公司的研发工程经理,也是该公司PowerDAQ II系列PCI数据采集板的主要开发者之一。最近,他正为该系列卡编写Linux驱动程序。可通过电子邮件aivchenko@ueidaq.com与他联系。

常总结总结02 Jul 2007 02:31 pm

摘 要:在分析Linux2.6内核新特性的基础上,在S3C2410开发板上移植了2.6内核和新的文件系统,并成功地对H.264编解码多媒体系统提供了支持。

关键词:Linux 内核 嵌入式系统 S3C2410

随着多媒体技术与通讯技术相结合的信息技术的快速发展和互联网的广泛应用,PC 时代也过渡到了后PC时代。在数字信息技术和网络技术高速发展的后PC时代,嵌入式技术越来越与人们的生活紧密结合。

操作系统为用户使用计算机及其外部设备提供最基本的接口程序,管理计算机上的资源。随着应用领域的扩大,为了适应不同的应用场合,考虑到系统的灵活性、 可伸缩性以及可裁剪性,一种以应用为中心、以计算机技术为基础、软硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗要求严格的专用计算机系统 ——嵌入式操作系统随之延生。

Linux 操作系统是一种性能优良、源码公开且被广泛应用的免费操作系统,由于其体积小、可裁减、运行速度高、良好的网络性能等优点,可以作为嵌入式操作系统。随着 2.6内核的发布,Linux向现有主流的RTOS提供商在嵌入式系统市场提出了巨大挑战,例如VxWorks和WinCE,具有许多新特性,将成为更优 秀的嵌入式操作系统。

Linux的低成本和开放性,为其在嵌入式系统领域的应用营造了肥沃的土壤。本文着重介绍Linux 2.6内核的新特性及其嵌入式应用中的优势,并将其移植到嵌入式平台中,成功支持H.264编解码多媒体系统。

1、Linux 2.6内核针对嵌入式开发显著特点

实时可靠性是嵌入式应用较为普遍的要求,尽管Linux 2.6 并不是一个真正的实时操作系统,但其改进的特性能够满足响应需求。Linux 2.6 已经在内核主体中加入了提高中断性能和调度响应时间的改进,其中有三个最显著的改进:采用可抢占内核、更加有效的调度算法以及同步性的提高[4]。在企业 服务器以及嵌入式系统应用领域,Linux 2.6 都是一个巨大的进步。在嵌入式领域,Linux 2.6 除了提高其实时性能,系统的移植更加方便,同时添加了新的体系结构和处理器类型——包括对没有硬件控制内存管理方案的 MMU-less系统的支持,可以支持大容量内存模型、微控制器,同时还改善了I/O子系统,增添更多的多媒体应用功能[4]。

1.1 可抢占内核

在先前的内核版本中(包括2.4内核)不允许抢占以核心态运行的任务(包括通过系统调用进入内核模式的用户任务),只能等待它们自己主动释放CPU。这样必然导致一些重要任务延时以等待系统调用结束。

一个内核任务可以被抢占,为的是让重要的用户应用程序可以继续运行。这样做最主要的优势是极大地增强系统的用户交互性。

2.6内核并不是真正的RTOS(Real Time Operation System),其在内核代码中插入了抢占点,允许调度程序中止当前进程而调用更高优先级的进程,通过对抢占点的测试避免不合理的系统调用延时。2.6内 核在一定程度上是可抢占的,比2.4内核具备更好的响应性。但也不是所有的内核代码段都可以被抢占,可以锁定内核代码的关键部分,确保CPU的数据结构和 状态始终受到保护而不被抢占。

软件需要满足最终时间限制与虚拟内存请求页面调度之间是相互矛盾的。慢速的页错误处理将会破坏系统的实时响应性,而2.6内核可以编译无虚拟内存系统避免这个问题,这是解决问题的关键,但要求软件设计者有足够的内存来保证任务的执行。

1.2 有效的调度程序

2.6版本的 Linux内核使用了由 Ingo Molnar开发的新的调度器算法,称为O(1)算法,如图1所示。它在高负载情况下执行得极其出色,并且当有很多处理器并行时也可以很好地扩展[2]。 过去的调度程序需要查找整个ready task队列,并且计算它们的重要性以决定下一步调用的task,需要的时间随task数量而改变。O(1)算法则不再每次扫描所有的任务,当task就 绪时被放入一个活动队列中,调度程序每次从中调度适合的task,因而每次调度都是一个固定的时间。任务运行时分配一个时间片,当时间片结束,该任务将放 弃处理器并根据其优先级转到过期队列中。活动队列中任务全部调度结束后,两个队列指针互换,过期队列成为当前队列,调度程序继续以简单的算法调度当前队列 中的任务。这在多处理器的情况更能提高SMP的效率,平衡处理器的负载,避免进程在处理器间的跳跃。

1.3 同步原型与共享内存

多进程应用程序需要共享内存和外设资源,为避免竞争采用了互斥的方法保证资源在同一时刻只被一个任务访问。Linux内核用一个系统调用来决定一个线程 阻塞或是继续执行来实现互斥,在线程继续执行时,这个费时的系统调用就没有必要了。Linux2.6所支持的Fast User-Space Mutexes 可以从用户空间检测是不是需要阻塞线程,只在需要时执行系统调用终止线程。它同样采用调度优先级来确定将要执行的进程[4]。多处理器嵌入式系统各处理器 之间需要共享内存,对称多处理技术对内存访问采用同等优先级,在很大程度上限制了系统的可量测性和处理效率。Linux2.6 则提供了新的管理方法——NUMA(Non Uniform Memory Access)。NUMA根据处理器和内存的拓扑布局,在发生内存竞争时,给予不同处理器不同级别权限以解决内存抢占瓶颈,提高吞吐量。

1.4 POSIX线程及NPTL

新的线程模型基于一个1:1的线程模型(一个内核线程对应一个用户线程),包括内核对新的 NPTL(Native POSIX Threading Library)的支持,这是对以前内核线程方法的明显改进。2.6内核同时还提供POSIX signals和POSIX high-resolution timers。POSIX signals不会丢失,并且可以携带线程间或处理器间的通信信息。嵌入式系统要求系统按时间表执行任务,POSIX timer可以提供1kHz的触发器使这一切变得简单,从而可以有效地控制进度。

1.5 微控制器的支持

Linux2.6内核加入了多种微控制器的支持。无MMU的处理器以前只能利用一些改进的分支版本,如uClinux,而2.6内核已经将其整合进了新的 内核中,开始支持多种流行的无MMU微控制器,如Dragonball、ColdFire、Hitachi H8/300。Linux在无MMU控制器上仍旧支持多任务处理,但没有内存保护功能。同时也加入了许多流行的控制器的支持,如S3C2410等。

1.6 面向应用

嵌入式应用有用户定制的特点,硬件设计都针对特定应用开发,这给系统带来对非标准化设计支持的问题(如IRQ的管理)。为了更好地实现,可以采用部件化 的操作系统。Linux2.6采用的子系统架构将功能模块化,可以定制而对其他部分影响最小。同时Linux2.6提供了多种新技术的支持以实现各种应用 开发,如Advanced Linux Sound Architecture(ALSA)和Video4Linux等,对多媒体信息处理更加方便;对USB2.0的支持,提供更高速的传输,增加蓝牙无线接 口、音频数据链接和面向链接的数据传输L2CAP,满足短距离的无线连接的需要;而且在2.6内核中还可以配置成无输入和显示的纯粹无用户接口系统。

2、应用研究

在S3C2410开发板上移植嵌入式Linux 2.6.11.7内核系统,应用于构建H.264多媒体系统。

2.1 建立交叉编译环境

在RedHat9的主机上进行内核移植开发,首先需要建立交叉编译环境。由于2.6内核中采用了一些新的特性和指令,需要采用较新的工具集,采用 binutils-2.15、gcc-3.4.2、glibc-2.2.5、linux-2.6.8、glibc-linuxthreads-2.2.5 来建立交叉编译工具链,建立之后将工具链路径加入系统路径$PATH中。

2.2 内核修改

Linux 2.6.11.7内核加入了对S3C2410芯片的支持,不再需要任何补丁文件。修改内核源码中Makefile的交叉编译选项ARCH=arm, CROSS_COMPILE=arm-linux-。针对硬件配置,需要在arch/arm/mach-s3c2410/devs.c或者 smdk2410.c中添加FLASH的分区信息s3c_nand_info,如表1。

表1 NAND FLASH分区表

分区名 起始地址 大 小

Vivi 0×00000000 0×00020000

Param 0×00020000 0×00010000

Kernel 0×00030000 0×001c0000

Root 0×00200000 0×00200000

Usr 0×00400000 0×03c00000

然后在s3c_device_nand中增加.dev={.platform_data= &s3c_nand_info},在arch/arm/mach-s3c2410/mach-smdk2410.c中的__initdata部分 增加&s3c_device_nand,使内核在启动时初始化NAND FLASH信息。

2.3 内核编译加载

对内核进行适当的配置是一个量体裁衣的过程。由于2.6内核会根据本地系统配置进行初始设置,可以导入内核源码默认s3c2410的配置文件,方便加载 内核基本配置,然后再选择所需选项。对MTD配置选择支持MTD设备驱动以及NAND FLASH驱动;选择支持要用到的各类文件系统(DEVFS、TMPFS、CRAMFS、YAFFS、EXT2、NFS)以及网络设备和协议,本系统加载 了网络芯片CS8900以及USB支持;在H.264多媒体系统中还需要加载Frame buffer以支持LCD显示功能。使用交叉编译工具编译内核源码后, 会在arch/arm/boot/下生成名为zImage的内核映像,在Boot loader的命令提示模式下使用下载命令完成内核加载到开发板的存储设备FLASH中。编译过程(相对以前版本的编译过程,2.6内核编译有所简化):

make mrproper

make menuconfig(字符界面,或者用make xconfig图形界面,但需要Qt库的支持,而make gconfig则需要GTK库的支持)

make

make bzImage

2.4 文件系统

Linux采用文件系统组织系统中的文件和设备,为设备和用户程序提供统一接口。Linux 支持多种文件系统,本系统使用CRAMFS格式的只读根文件系统,而将FLASH中的USER区使用支持可读写的YA FFS文件系统格式,方便添加自己的应用程序。

在根文件系统中,为保护系统的基本设置不被更改,采用CRAMFS格式。采用DEVFS来实现基本设备的建立挂载,同时使用BusyBox也是一个缩小 根文件系统的办法,提供了系统的基本指令;还需要建立一些必备的目录,添加所需配置文件,如fstab、inittab等;还有一个重要的工作就是添加系 统应用必备的动态函数库。使用生成工具mkcramfs 将整个根文件目录里的内容制作成映像文件。

mkcramfs rootfs rootfs.ramfs

YAFFS文件系统格式的支持需要将驱动加入到内核代码树下fs/yaffs/,修改内核配置文件,就可以在内核编译中加载对该文件系统的支持。使用 mkyaffs工具将NAND FLASH分区格式化为YAFFS分区,将mkyaffsimage生成的应用程序镜像烧写进YAFFS分区,在启动时通过写入fstab自动加载 YAFFS分区即可。

2.5 网络设备驱动

系统中采用CS8900A的10M网络芯片,它使用S3C2410 的nGCS3和IRQ_EINT9,相应修改linux/arch/arm/mach-s3c2410/irq.c,并在mach-smdk2410.c 的smdk2410_iodesc[]中增加{SMDK2410_ETH_IO,S3C2410_CS2, SZ_1M, MT_DEVICE},内核源码中加入芯片的驱动程序drivers/net/arm/cs8900.h和cs8900.c,并且配置网络设备驱动的 Makefile和Kconfig文件,加入CS8900A的配置选项,这样可以在内核编译时加载网络设备的驱动。

在 Linux2.6应用的同时,也要看到其与以前版本内核比较存在的一些问题。在内核的编译时间、内核镜像大小、内核占用RAM空间大小、系统启动时间相对 Linux2.4而言都存在不同程度的不足,但在硬件条件日益进步的现今可以接受,而且一部分也是由于功能加强必然带来的。虽然Linux并非一个真正的 实时操作系统,但2.6内核的改进能够满足大部分的应用需求,所以Linux2.6内核将会在嵌入式系统领域大展身手。