构建嵌入式Linux体系
发布日期:2011-05-04
引 言:
如今嵌入式体系的应用越来越广泛,一台通用PC的外部配置就有5~10个嵌入衰落处理惩罚处罚器,如键盘、软驱、硬盘、表现器、打印机、扫描仪、USB接口等均是由嵌入式处理惩罚处罚器控制的。在制造财产、进程控制、通讯电视、仪器仪表、汽车船舶、航空航天、斲丧类产品均是嵌入式体系的应用范畴。嵌入式体系如今紧张有:Windows CE、VxWorks、QNX等,它们都具较好的及时性,体系可靠性,任务处理惩罚处罚随机性等长处。但是它们的价格遍及偏高,很多开辟商遭受不起。因而,Linux利用体系成为嵌入式利用体系的首选,缘故因由如下:
在精简内核在编译内核之前,起紧张明白须要那些驱动和模块,然后只选择须要的驱动和模块,比喻,要是体系不须要网络支持,则可以去失网络模块。内核一样通常因此压缩要领存放的,在体系启动时会自行解压。内核都是常驻内存的,当须要调用应用步调时,再把须要的步调从磁盘调入内存运行。
构建内核常用的下令包括:
◆ make config:内核配置,调用 ./scripts/Configure 根据 arch/i386/config.in 来举行配置。
◆ make dep:探求依赖干系。
◆ make clean:打扫已往构建内核所孕育孕育产生的全部目标文件、模块文件、以及一些临时文件等。
◆ make rmproper:删除全部因构建内核进程中孕育孕育产生的全部文件,把内核光复到最原始的状态。
◆ make:构核,通过各目次的Makefile 文件将会在各个目次下孕育孕育产生很多目标文件。要是内核没有错误,将孕育孕育产生文件vmlinux,这便是构建的内核。
◆ make zImage:在make 的底子上孕育孕育产生压缩的内核映象文件./arch/$(ARCH)/boot/zImage 以及在 ./arch/$(ARCH)/boot/compresed/目次下孕育孕育产生临时文件。
◆ make bzImage:在make 的底子上孕育孕育产生压缩比例更大的内核映象文件./arch/$(ARCH)/boot/bzImage 以及在 ./arch/$(ARCH)/boot/compresed/目次下孕育孕育产生临时文件。
◆ make modules:编译模块文件,在make config 时所配置的全部模块将在这时编译,形成模块目标文件,并把这些目标文件存放在modules 目次中。
◆ make modules_install:把上面编译好的模块目标文件摆设在目次 ./lib/modules/$KERNEL_VERSION/ 中。上面的编译内核是在没有变革源代码的环境下实现的,要因此为源代码提供的结果在某些方面不克不及餍足恳求,就要修改源代码了。源代码中紧张有以下几个关键部分:有关进程办理的task_struct 布局,这个布局险些包括了与进程有关的全部文件内容,另有任务行列步队、时钟办理和克制办理,种种进程间的通讯机制,内存办理中种种内存分派函数的实现,假造文件体系。
体系启动
引导启动步调紧张包括以下三个文件:bootsect.s,head.s和setup.s 这三个文件固然都是汇编步调,但确利用了两种语法格局。bootsect.s和setup.s 采取了雷同于Intel的汇编语言语法,须要利用Intel 8086 汇编器和连接器 as86和ld86。head.s 则利用了GUN的汇编格局,并且运行在掩护模式下,须要用GUN的as 举行编译。这是一种AT&T语法的汇编语言格局。 Bootsect.s代码时磁盘引导块步调,驻留在磁盘的第一个扇区中,在PC机加电ROM-BIOS自检后,引导扇区由BIOS加载到内存0x7C00处,然后将本身移动到内存0x90000处。该步调的紧张作用是起首将setup模块(由setup.s编译的)从磁盘加载到内存紧接着bootsect的反面位置(0x90200),然后利用BIOS克制0x13取磁盘参数表中当前启动引导盘的参数,接着在屏幕上表现“Loading system...”字符串。再将system模块从磁盘上加载到内存0x10000开始的地方。随后确定根文件体系的配置号。
Setup步调的作用紧张是利用ROM-BIOS克制读取呆板体系数据,并将这些数据生存到0x90000开始的位置(包围了bootsect步调地点的地方)。然后setup步调将system模块从0x10000整块向下移动到内存绝对地点0x0000处,接下来加载克制形貌符表寄存器(idtr)和全局形貌表寄存器(gdtr)。打开A20地点线,重新设置两此克制控制芯片8259A,将硬件克制号重新设置为0x20-0x2f。着末设置CPU的控制寄存器CR0(也称呆板状态字),从而进入32位掩护模式举行,并跳转到位于system模块最前面部分的head.s步调连续运行。 Head.s步调在被编译后,会被连接成system模块的最前面开始部分,即头部(head)步调。从这里开始,内核完全都是在掩护模式下运行了。这段步调实际上处于内存绝对地点0处开始的地方。这个步调结果比较单一,起首是加载各个数据段寄存器,重新设置克制形貌符表idt,共256项。然后重新设置克制形貌符表gdt,接下来检测A20地点线是不是打开了,再检测PC机是否含有数学协处理惩罚处罚器芯片,然后设置办理内存的分页处理惩罚处罚机制,着末利用返回指令将预先摆设在堆栈中的/init/main.c步调的入口地点弹出,去运行main()内核初始化步调。
配置驱动步调
配置驱动步调在Linux内核中扮演着分外的角色,它们是一个个独立的“黑盒子”,使某个特定的硬件相应一个定义精良的内部编程接口,同时完全潜伏了配置的变乱细节。用户利用通过一组标准化的调用完成,而这些调用是和特定的驱动步调无关的。配置驱动步调提供的结果是同外设举行数据发送。配置包括三种典范:字符配置、块配置和网络接口。每个模块通常实现此中一种典范,相应地,模块可分为字符模块(char module)、块模块(block module)和网络模块(network module)三种。然而这种分类要领并不好坏常严格,步调员可以构建一个大的模块,在此中实现差别典范的配置驱动步调。三种典范的配置如下:
字符模块
字符配置是可以大概象字节流(比如文件)一样被访问的配置,由字符配置驱动步调来实现这种特性。字符配置驱动步调通常至少须要实现open、close、read和write的体系调用。字符终端(dev/console)和串口(/dev/ttySO以及配置典范)便是字符配置的两个例子,它们可以大概用流抽象很好地表现。
块配置和字符配置一样,块配置也是通过/dev目次下的文件体系节点被访问的。块配置(比喻磁盘)上可以大概容纳文件体系。在大多数Unix体系中,块配置包括整数个块,而每块包括1KB或2的重复幂字节的数据。Linux容许应用步调如字符配置那样读写块配置,可以一次转达恣意多字节的数据。因而,块配置和字符配置的区别仅仅在于内核内部办理数据的要领,也便是内核和驱动步调的接口差别。块配置的接口必须支持挂装(mount)文件体系。
网络接口
恣意网络变乱都要颠末一个网络接口,即一个可以大概和别的主机互换数据的配置。通常接口是个硬件配置,但也大概是个纯软件配置,比如回环(loopback)接口。网络接口由内核中的网络子体系驱动,认真发送和汲取数据包,它必须相识每项变乱是怎样映射到实际发送的数据包的。只管Telnet和FTP连接都是面向流的,它们都利用了同一个配置,但这个配置看到的只是数据包,而不是独立的流。
在Linux里,除了直接修改体系内核的源代码,把配置驱动步调加进内核以外,还可以把配置驱动步调作为可加载的模块,由体系办理员动态的加载和卸载,使之成为内核的一部分。Linux的模块可以用C语言编写,用gcc编译成目标文件(不举行链接,作为*.o文件存在),为此须要在gcc下令行里加上-c的参数。由于在不链接时,gcc只容许一个输入文件,因此一个模块的全部部分都必须在一个文件里实现。编译好的模块*.o放在 / lib / modules / xxxx/misc下(xxxx表现内核版本),然后用depmod -a使此模块成为可加载模块。模块用insmod下令加载,用rmmod下令来卸载,并可以用lsmod下令来观察全部已经加载的模块的状态。编写模块时必须提供两个函数,一个是init_module(void),供insmod在加载的时间主动调用,认真举行配置驱动步调的初始化变乱。Init_module返回0表现初始化告成,返回负数表现失败。另一个函数是void cleanup_module(void),载模块卸载时调用,认真举行配置驱动步调的打扫变乱。在告成的向体系注册了配置驱动步调后(调用register_chrdev告成后),就可以用mknod下令来把配置映射成一个分外文件,别的步调社用这个配置的时间,只要对此分外文件举行利用就可以了。
结 语
本文紧张叙述了怎样布局嵌入式Linux体系,筹划和实现一个完备并且小巧利用的嵌入式Linux体系是一个非常巨大的进程。由于嵌入式Linux是由标准Linux淘汰而来的,以是须要对Linux的内核有深入的相识。本文所构建的一个小型嵌入式Linux体系,已告成运用于S3C2410 。所短缺的是构建的内核还不敷小,缘故因由大概是存在一些不须要的硬件驱动步调以及库的淘汰不敷抱负导致的。以后的变乱紧张会合在对外设模块和库的淘汰上,以及开辟一些特定硬件的驱动步调。 参考文献: 1 魏永明,骆刚,姜军译。Linux配置驱动步调(第二版)。中国电力出版社,2002 2 赵炯着。Linux内核完全表明,2004 3 冯永红,朱善君。裁剪Linux技能阐发。2001嵌入式体系及单片机国际学术互换会论文集,2001 本文于2004年8月30日收到。刘新朝:研究生,研究方向为微机控制。