天天看点

linux 烧写(1)

第一部分:

一、bootloader的概念

   bootloader是系统加电启运行的第一段软件代码.回忆一下pc的体系结构我们可以知道,pc机中的引导加载程序由bios(其本质就是一段固件程序)和位于硬盘mbr中的引导程序一起组成。bios在完成硬件检测和资源分配后,将硬盘mbr中的引导程序读到系统的ram中,然后将控制权交给引导程序。引导程序的主要运行任务就是将内核映象从硬盘上读到ram中 然后跳转到内核的入口点去运行,也即开始启动操作系统。

    而在嵌入式系统中,通常并没有像bios那样的固件程序(有的嵌入式系统也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由bootloader来完成.比如在一个基于 arm7tdmi core的嵌入式系统中,系统在上电或复位时都从地址 0x00000000开始执行.而在这个地址处安排的通常就是系统的bootloader程序。

    简单地说bootloader就是在操作系统内核或用户应用程序运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核或用户应用程序准备好正确的环境。对于一个嵌入式系统来说,可能有的包括操作系统,有的小型系统也可以只包括应用程序,但是在这之前都需要bootloader为它准备一个正确的环境。通常,bootloader是依赖于硬件而实现的,特别是在嵌入式领域,为嵌入式系统建立一个通用的bootloader是很困难的。

二、boot loader的操作模式

    大多数bootloader都包含两种不同的操作模式。“启动加载”模式和“下载”模式,这种区别仅对于开发人员才有意义。但从最终用户的角度看,bootloader的作用就是用来加载操作系统,而并不存在所谓的启动加载模式与下载工作模式的区别。

    启动加载(boot loading)模式:这种模式也称为“自主”(autonomous)模式,也即bootloader从目标机上的某个固态存储设备上将操作系统加载到ram中运行,整个过程并没有用户的介入。这种模式是bootloader的正常工作模式。因此在嵌入式产品发布的时候,bootloader显然必须工作在这种模式下.

    下载(down loading)模式:在这种模式下 目标机上的bootloader将通过串口连接或网络连接等通信手段从主机下载文件,比如:下载应用程序、数据文件、内核映像等.从主机下载的文件通常首先被bootloader保存到目标机的ram中然后再被bootloader写到目标机上的固态存储设备中。bootloader的这种模式通常在系统更新时使用。工作于这种模式下的bootloader通常都会向它的终端用户提供一个简单的命令行接口。

三、bootloader的工作

总体上bootloader需要完成以下工作。

n     初始化cpu速度;

n     初始化内存,包括启用内存库,初始化内存配置寄存器等;

n     初始化中断控制器,在系统启动时,关闭中断,关闭看门狗;

n     初始化串行端口(如果在目标上有的话);

n     启用指令/数据高速缓存;

n     设置堆栈指针;

n     设置参数区域并构造参数结构和标记(这是重要的一步,因为内核在标识根设备、页面大小、内存大小以及更多内容时要使用引导参数);

n     执行post(加电自检)来标识存在的设备并报告有何问题;

n     为电源管理提供挂起/恢复支持;

n     传输操作系统内核镜像文件到目标机。也可以将操作系统内核镜像文件事先存放在flash中,这样就不需要bootloader和主机传输操作系统内核镜像文件,这通常是在做成产品的情况下使用。而一般在开发过程中,为了调试内核的方便,不将操作系统内核镜像文件固化在flash中,这就需要主机和目标机进行文件传输;

n     跳转到内核的开始,在此又分为rom启动和ram启动。所谓rom启动就是用xip技术直接在flash中执行操作系统镜像文件;所谓ram启动就是指把内核镜像从flash复制到ram中,然后再将pc指针跳转到ram中的操作系统启动地址。

四、vivi的剪裁

bootloader有很多种,如vivi,uboot,redboot,lilo等等。vivi 是韩国mizi公司专门为三星s3c2410芯片设计的bootloader。下面我们以它为例讲述一下bootloader的裁剪和烧写.

首先是上网下载vivi,我的版本是v0.1.4。http://blogimg.chinaunix.net/blog/upfile/071017080947.rar

第一步:解压后进入vivi目录,在终端下输入make distclean命令,清除已生成的目标文件的影像文件;

第二步:输入make menuconfig命令,启动vivi配置gui程序,如下图:

linux 烧写(1)

第三步:根据自己需要修改选项,*号表示选中,如图中使vivi支持uart1(串口2).修改后关闭配置页面.

第四步:输入make命令,在当前目录下会生成vivi映像文件;

生成的映像文件我们先保存着,以后会用到.

第二部分:

一、内核的获得

可以从网上下载内核文件,http://www.kernel.org。如果是为了练习,尽量下载2.4.x的内核。因为2.6.x的内核比较大,当然编译也需要更都的时间。

二、内核的编译

linux内核的编译菜单主要有三个版本:

1)make config:进入命令行,可以一行一行的配置。

2)make menuconfig:开发人员比较熟悉的menuconfig菜单。

3)make xconfig:在2.4.x以及以前版本中xconfig菜单是基于tcl/tk的图形库的.

我们采用menuconfig菜单

编译内核需要root权限,以下操作都假定你是root用户.先在根目录下建立名为arm2410的目录.然后 

把你需要升级的内核拷到/usr/src/下(下文中以2.4.18的内核的linux-2.4.18.tar.gz为例),命令为

  #cp linux-2.4.18.tar.gz /usr/src

然后解压该文件,命令为:

  #tar -zxvf linux-2.4.18.tar.gz 

  如果你所下载的是.bz2文件,例如linux-2.4.0test8.tar.bz2,请使用下面的命令

  #bzip2 -d linux-2.4.18.tar.bz2

  #tar -xvf  linux-2.4.18.tar

下面我们开始编译:

第一步:在终端下进入内核所在目录 "/arm2410";

第二步:键入make menuconfig,进入内核配置菜单,如下图:

linux 烧写(1)

注意:

1)带有"-->"表示该选项包含选项;

2)每个选项前面有[ ]或< >,中括号表示仅有2种选择(*或空),尖括号表示有3种选择(m,*或空),按空格键可显示这几个选择;

3)m表示以模块方式编译进内核,在内核启动后,需要手工执行insmod命令才能使用该项驱动;*表示直接编译进内核;空表示不编译进内核;

第三步:按着自己的需求,配置内核.一共有21项.

第四步:键入make clean命令,删除已生成的模块和目标文件.

第五步:键入make dep命令,编译变量依赖关系等;

第六步:键入make zlmage生成经压缩以后的内核映像文件zlmage;

第七步:键入make modules编译模块;

第八步:键入make modules_install安装编译完成的模块;

内核映像文件zlmage存放在 ./arch/arm/boot/目录下.

第三部分:

1.什么是跟文件系统

linux引导启动时,默认使用的文件系统是根文件系统.其中一般都包括这样一些子目录:

/dev  设备文件及其他特殊文件

/etc   系统配置文件

/usr  大多数用户使用的应用程序和文件目录

/usr/bin 必要的用户命令

/var  监控程序和工具程序存放的可变数据

 

2.什么是busybox

busybox是很多标准linux工具的一个单个可执行程序.它包含了一些简单的工具,例如cat,还包含了一些更大,更复杂的工具,例如grep.,find,mount以及telnet;

3.剪裁配置busy-box

第一步:进入busybox-1.1.0-pre1目录下,执行make menuconfig.

linux 烧写(1)

第二步:设置编译方式、编译器(buile options) 如下图:

linux 烧写(1)

第三步:设置installation options选项,如下图:

linux 烧写(1)

第四步:分别执行make clean命令,make dep命令,make命令,make install命令;

第五步:在busybox-1.1.0-pre1目录下,新建root文件夹,将_install文件夹下的子目录,文件全部拷贝到root下面;

第六步:在busybox-1.1.0-pre1目录下,执行下面命令生成root映像文件:

mkcramfs root root cramfs

最后:

在menuconfig中配置:

详细介绍内核配置选项及删改情况

第一部分:全部删除

code maturity level options ---> 代码成熟等级选项

[]prompt for development and/or incomplete code/drivers 默认情况下是选择的,这将会在设置界面中显示还在开发或者还没有完成的代码与驱动.不选。

第二部分 :除以下选项,其它全部删除

general setup—〉

system v ipc (ipc:inter process communication)是组系统调用及函数库,它能让程序彼此间同步进行交换信息。某些程序以及dos模拟环境都需要它。为进程提供通信机制,这将使系统中各进程间有交换信息与保持同步的能力。有些程序只有在选y的情况下才能运行,所以不用考虑,这里一定要选。

第三部分:除以下选项,其它全部删除

loadable module support ---> 可引导模块支持 建议作为模块加入内核

[] enable loadable module support 这个选项可以让你的内核支持模块,模块是什么呢?模块是一小段代码,编译后可在系统内核运行时动态的加入内核,从而为内核增加一些特性或是对某种硬件进行支持。一般一些不常用到的驱动或特性可以编译为模块以减少内核的体积。在运行时可以使用modprobe命令来加载它到内核中去(在不需要时还可以移除它)。一些特性是否编译为模块的原则是,不常使用的,特别是在系统启动时不需要的驱动可以将其编译为模块,如果是一些在系统启动时就要用到的驱动比如说文件系统,系统总线的支持就不要编为模块了,否在无法启动系统。

[]automatic kernel module loading 一般情况下,如果我们的内核在某些任务中要使用一些被编译为模块的驱动或特性时,我们要先使用modprobe命令来加载它,内核才能使用。不过,如果你选择了这个选项,在内核需要一些模块时它可以自动调用modprobe命令来加载需要的模块,这是个很棒的特性,当然要选y喽。

第四部分:全部删除

block layer-----〉块设备

第五部分:除以下选项,其它全部删除

processor type and features ---> 处理器类型

subarchitecture type (pc-compatible) ---> 这选项的主要的目的,是使linux可以支持多种pc标准,一般我们使用的pc机是遵循所谓ibm兼容结构(pc/at)。这个选项可以让你选择一些其它架构。我们一般选择pc-compatible就可以了。

processor family(386) : 它会对每种cpu做最佳化,让它跑的好又快,一般来说,你是什么型号的就选什么型号的就好。我选的是386,这样内核会省下不少空间

第六部分:除以下选项,其它全部删除

power management options (acpi, apm) ---> 电源管理选项

[ ] power management debug support 电源管理的调试信息支持,如果不是要调试内核有关电源管理部份,请不要选择这项。

acpi support ---〉高级电源接口配置支持,如果bios支持,建议选上这项

[]button 这个选项用于注册基于电源按钮的事件,比如power, sleep等,当你按下按钮时事件将发生,一个守护程序将读取/proc/acpi/event,并执行用户在这些事件上定义的动作比如让系统关机。可以不选择,根据自己的需求。

第七部分:除以下选项,其它全部删除

bus options (pci, pcmcia, eisa, mca, isa) ---> 总线选项

[]pci support

pci access mode (any) ---> pci外围设备配置,强列建议选any,系统将优先使用mmconfig,然后使用bios,最后使用direct检测pci设备。

第八部分:除以下选项,其它全部删除

executable file formats --->

kernel support for elf binaries elf是开放平台下最常用的二进制文件,它支持不同的硬件平台。一定要选。

第九部分:除以下选项,其它全部删除

networking

networking options --->

[]unix domain sockets

[]tcp/ip networking

第十部分:除以下选项,其它全部删除

device drivers --->设备驱动

block devices-------〉

[]compaq smart2 support 

[] compaq smart array 5xxx support 

[]loopback device support 大部分的人这一个选项都选n,因为没有必要。但是如果你要mount iso文件的话,你得选上y。这个选项的意思是说,可以将一个文件挂成一个文件系统。如果要烧光盘片的,那么您很有可能在把一个文件烧进去之前,看看这个文件是否符合is09660的文件系统的内容,是否符合您的需求。而且,可以对这个文件系统加以保护。不过,如果您 想做到这点的话,您必须有最新的mount程序,版本是在2.5x版以上的。而且如果您希望对这个文件系统加上保护,则您必须有des.1.tar.gz这个程序。注意:此处与网络无关。建议编译成模块

[] ram disk support

scsi device support ---> 里面有关于usb支持的,要选择

[]scsi device support usb要用,必须选择

[]legacy /proc/scsi/ support usb要用,必须选择

[]scsi disk support usb要用,必须选择

scsi low-level drivers

[]serial ata(sata) support

[]intel piix/ich sata support   这个必须选择,否则无法产生引导文件

[]via sata support

networking device support ---> 这个下面是选网卡驱动,一定要选

ethernet(1000mbit)-我的电脑是千兆网卡所以就选这个

[]broadcom tigon3support

input device support ---> 这个里面要设置你的鼠标键盘什么的

[]provide legacy /dev/psaux device

graphics support --->

[]support for frame buffer devices 支持frame buffer的,一定要选择

usb support --->

[]usb device filesystem 这个好象是用u盘必须的

[]ehci hcd (usb 2.0) support 有usb2.0就选上把,编译成模块

[]ohci hcd support 必须选择,编译成模块

[]uhci hcd (most intel and via) support 必须选择,编译成模块

[]usb mass storage support 用u盘必须选择

usb human interface device (full hid) support 里面选择usb鼠标和usb键盘,如果你有一定选上这个必需选

hid input layer support 应该选择

/dev/hiddev raw hid device support如果这里有usb键盘和鼠标选项,一定要选择

第十一部分:除以下选项,其它全部删除

file systems --->文件系统

<*> second extended fs support 

[*] ext2 extended attributes 

[*] ext2 posix access control lists 

[*] ext2 security labels 

<m> ext3 journalling file system support 

[*] ext3 extended attributes 

[*] ext3 posix access control lists 

[*] ext3 security labels 以上这些肯定是要选择的,linux的标准文件系统

<m> kernel automounter support 内核自动挂载的,当然要选

<m> kernel automounter version 4 support (also supports v3) 当然要选

dos/fat/nt filesystems ---> 

<m> dos fat fs support 

<m> msdos fs support 

<m> vfat (windows-95) fs support 

<m> ntfs file system support

native language support语言支持,这里就支持英语和汉语就行了,不多说了

[]nls iso 8859-1 必须选择,这个是关于u盘挂载的。

cd-rom/dvd filesystems ---> 这个是关于挂载iso文件的,用的话就选。

<*> iso 9660 cdrom file system support

第十二部分: 全部删除

instrumentation support 

第十三部分:全部删除

kernel hacking --->破解核心?可不是当骸客啦,不选

第十四部分:全部删除

security options --->

第十五部分:全部删除

cryptographic options --->这是核心支持加密的选项

第十六部分:全部删除

library routines --->

附:

内核配置

  内核配置的方法很多,make config、make xconfig、make menuconfig、make oldconfig等等,它们的功能都是一样的,区别应该从名字上就能看出来,只有make oldconfig是指用系统当前的设置(./.config)作为缺省值。这里用的是make menuconfig。

  需要牢记:不必要的驱动越多,内核就越大,不仅运行速度慢、占用内存多,在少数情况下、还会引发其他问题。具体步骤如下:

首先确定shell是bash。

然后

$make menuconfig

有一些默认的符号其含义如下:

y:加载

n:不加载

m:作为模块加载

可以配置的选项有以下一些:

1)code maturity level option 代码成熟度

prompt for development and/or incomplete code/drivers [n/y/?]

如果有兴趣测试一下内核中尚未最终完成的某些模块,就选y,否则选n,想知道更详细的信息选?会看到联机帮助(以下?的含义相同),n大写表示缺省值。

2)processor type and features 处理器类型及特性

processor family(386,486/cx486,586/k5/5x86/6x86,pentium/k6/tsc, ppro/6x86mx)[ppro/6x86mx]

[]内的是缺省值,我们可以根据前面介绍的uname 命令执行的结果选择。此项如果高于386,那么生成的内核在386机器上将不能启动。

math emulation(config_math_emulation)[n/y/?]

需要进行协处理器模拟吗?一般的机器都回n。如果机器已经有硬件的协处理器,那么内核仍将使用硬件,而忽略软件的math-emulation,这将使内核变大变慢。

mtrr(memory type range register)support(config_mtrr)[n/y/?]

在pentium、pro/pentium ii类的系统中可以提高图像写入速度。

symmetric multi-processing support(config_smp)[y/n/?]

如果您的机器有多个处理器,就选y。此时要选中下面的enhanced real time clock support

3)loadable model support 可加载模块支持

enable loadable module support(config_modules)[y/n/?]

最好选y,不然许多仅供动态加载的模块就不能用了。

set version information on all symbols for modules(config_modversions)[n/y/?]

选n

kernel module loader(config_kmod)[n/y/?]

4)general setup 一般设置

networking support(config_net)[y/n/?]

选y吧,现在还有几台计算机不用上网呢?

pci support (config_pci)[y/n/?]

pci 总线和设备总该有吧。

pci access mode(bios,direct,any)[any]

缺省值比较保险,但如果您对您的主板很有信心,就选bios。

pci quirks (config_pci_quirks)[y/n/?]

用于修补bios中对pci有影响的bug,同样,如果您对主板很有信心,就选n。

backward-compatible /proc/pci〉(config_pci_old_proc)[y/n/?]

以前的内核使用/proc/pci,新版内核使用/proc/bus/pci,要保持兼容性就选y。

mca support(config_mca)[n/y/?]

查看帮助吧。

sgi visual workstation support(config_visws)[n/y/?]

您的机器是sgi的吗?是就选y。

system v ipc(config_sysvipc)[y/n/?]

进程间通信函数和系统调用。linux内核的五大组成部分之一,一定要选。

bsd process accounting(config_bsd_process_acct)[n/y/?]

用于启动由内核将进程信息写入文件的用户级系统调用。就看您想不想用它了。

sysctl support(config_sysctl)[y/n/?]

在内核正在运行的时候修改内核。用8kb空间换取某种方便。别选吧,除非你真的想试试。

kernel support for a.out binaries(config_binfmt_aout)[y/m/n/?]

为了能使用以前编译的程序,选y。

kernel support for elf binaries(config_binfmt_elf)[y/m/n/?]

为了能使用现在编译的程序,选y。

kernel support for misc binaries(config_binfmt_misc)[y/m/n/?]

一般选y,用于支持java等代码的自动执行。

parallel port support(config_parport)[n/y/m/?]

并口设备,如打印机。

5)plug and play support 即插即用设备支持

plug and play support (config_pnp)[n/y/?]

选y吧。

6)block devices 块设备

normal pc floppy disk support(config_blk_dev_fd)[y/m/n/?]

一般的软驱。选y。

enhanced ide/mfm/rll disk/cdrom/tape/floppy support(config_blk_dev_ide)[y/m/n/?]

这几种接口的硬盘、光驱、磁带、软驱。选y。

include ide/atapi cdrom support(config_blk_dev_idecd)[y/m/n/?]

cdrom。选y。

7)networking options 网络选项

packet socket (config_pachet)[y/m/n/?]

按照目前网络发展的状况,选y比较好。当然也可以选其它的。

kernel/user netlink socke(config_netlink)[n/y/?]

内核与用户进程双向通信。选y。

network firewalls(config_firewall)[n/y/?]

如果真的需要用防火墙,就选y。

unix domain sockets(confgi_unix)[y/m/n/?]

socket 的用处太多了。选y。

tcp/ip networking(config_inet)[y/n/?]

选y,理由如上一条。

the ipx protocol (config_ipx)[n/y/m/?]

其实并没有那么多人真的需要使用或者学习ipx,所以一般选n。

appletalk ddp(config_atalk)[n/y/m/?]

选n,理由同上。

8)scsi support scsi支持,scsi low-level drives scsi低级驱动

根据系统中scsi设备的实际情况选择。

9)networking device support 网络设备支持

如果用lan上网,就选择网卡;

如果用modem拨号上网,就要看isp提供那种服务了,一般都是ppp。

10)amateur radio support 业余收音机支持

这是什么我不太清楚,所以选n。

11)isdn subsystem isdn子系统

好像已经有支持isdn的modem了,所以最好先看看自己的modem是不是这种,再做选择。

12)old cd-rom dfivers (not scsi, not ide) 老式光驱驱动

一般选n,因为这种设备实在很少见。

13)character devices 字符设备

virtual terminal(config_vt)[y/n/?]

linux上一般可以用alt+f1/f2/f3/f4来切换不同的任务终端,即使在一台计算机上也可以充分使用linux的多任务能力,一些需要以命令行方式安装合适用的软件如果有虚拟终端的支持就会更方便,因此选y。

support for console on virtual terminal(config_vt_console)[y/n/?]

选y将支持一个虚拟终端作为控制台。一般为alt+f1。

support for console on serial port(config_serial)[y/m/n/?]

除非真的需要一个串口控制台,否则选n。

extended dumb serial driver options(config_serial_extended)[n/y/?]

如果希望使用"dumb"的非标准特性(如hub6支持),选y,一般选n。

non-standard serial port support(config_serial_nonstandard)[n/y/?]

非标准串口。一般选n。

unix98 pty support(config_unix98_ptys)[y/n/?]

pty指伪终端,一般用户就选n。但如果想用telnet或者xterms作为终端访问主机,并且已经安装了glibc2.1,就可以选y。

maximum number of unix98 ptys in use(0-2048)(config_unix98_pty_count)[256]

缺省值就可以了。

mouse support(not serial mice)(config_mouse)[y/n/?]

ps/2等非串口鼠标选y,否则选n。

14)mice 鼠标

根据自己的鼠标类型选择。

15)video for linux linux视频

根据系统中的音/视频捕捉设备选择。

16)joystick support 操纵杆

根据系统中的游戏杆设备选择

17)ftape,the floopy tape device driver ftape设备驱动

ftape (qic-80/travan)support(config_ftape)[n/y/m/?]

如果系统中有磁带机,选y。

18)filesystems 文件系统

文件系统的选择要比较仔细,因为其中的一些给某些系统功能提供支持。而且除了proc、ext2等文件系统之外,其它的文件系统(包括下面的网络文件系统)都可以选择为m方式,从而减小内核启动时的体积。

quota support(config_quota)[n/y/?]

用于给用户划分定量的磁盘空间。如不用此功能就选n。

dos fat fs support(config_fat_fs)[n/y/m/?]

为内核提供fat支持,多数用户有可能从linux访问同一系统中的windows硬盘空间,因此最好选y。

iso 9660 cdrom filesystem support(config_iso9660_fs)[y/m/n/?]

有标准光驱的系统应该选y。

minix fs support(config_minix_fs)[n/y/m/?]

用于创建启动盘的文件系统,多数应该选y或者m。

/proc filesystem support(config_proc_fs)[y/n/?]

虚拟文件系统,必须选y。

second extended fs support(config_ext2_fs)[y/m/n/?]

linux标准文件系统,都应该选y。

19)network file systems 网络文件系统

coda filesystem support (advanced network fs)(config_coda_fs)[n/y/m/?]

先看帮助再选。

nfs filesystem support(config_nfs_fs)[y/m/n/?]

选y或n,能够访问远程nfs文件系统。

smb filesystem support(to mount wfw shares etc.)(config_smb_fs)[n/y/m/?]

要访问windows系统中的共享资源选y。

ncp filesystem support(to mout netware volumes)(config_ncp_fs)[n/y/m/?]

如果真的需要访问netware文件系统,就选y或者m。

20)partion types 分区类型

一般用不上;要用请参看帮助。

21)console drivers 控制台驱动

vga text console(config_vga_console)[y/n/?]

用vga模式下用文本方式操作linux,一般选y。

video mode selection support(config_video_select)[n/y/?]

大多数系统都不需要这项功能。

22)sound 声音

sound card support(config_sound)[n/y/m/?]

如果系统中安装了声卡,就选y(或者m),然后查看帮助。

23)kernel hacking 内核监视

kernel hacking往往会生成非常大或者非常慢(甚至又大又慢)的内核,甚至会引起内核工作不稳定。如果一定要选,那么也最好不要选其中的"development"、"experimental"、"debugging"项。

继续阅读