微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 如何构造嵌入式Linux系统

如何构造嵌入式Linux系统

时间:05-23 来源:EDN 点击:
引 言:

  目前嵌入式系统的应用越来越广泛,一台通用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()内核初始化程序。

  

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top