1、这样一句,以后启动就可以直接使用arm-linux-gcc了。要使环境变量立马生效,可以使用下面的命令。source /etc/profile我们可以用arm-linux-gcc -v来查看交叉编译器版本,如果是4.1.1就是正确的。(3)设置Nand Flash分区信息表 设置Nand Flash的分区信息表是为内核启动以后加载文件系统用的,可以将Nand Flash看成我们PC机的硬盘,对Nand Flash的分区看成是对硬盘的分区,硬盘可以分成C盘,D盘之类,而Nand Flash则可以分成很多块,每块有不同的名字、大小和用途。下面是对Super-ARM实验箱的Nand Flash进行分
2、区的情况(参考表5-1-1): 第0块命名为uboot,它用来存放u-boot.bin映像,起始地址是Nand Flash的0x000000,最大0x30000个字节; 第1块命名为kernel,用来存放内核,起始地址是Nand Flash的0x30000,最大0x1D0000个字节; 第2块命名为rootfs,用来存放根文件系统,起始地址是Nand Flash的0x200000,最大30M字节; 第3块命名为ext-fs1,留给用户存放其他文件系统,起始地址是Nand Flash的0x2000000,最大32M字节;至于具体要怎么分,这样根据你的目标机的Nand Flash来定,不能一概而论
3、。分区的方法就是修改arch/arm/plat-s3c24xx目录下的common-smdk.c文件:执行gedit arch/arm/plat-s3c24xx/common-smdk.c命令,找到:static struct mtd_partition smdk_default_nand_part,在其中填入下面的内容(将原来的内容覆盖)0 = .name = , .size = 0x30000, .offset = 0, , 1 = .offset = 0x30000, .size = 0x1D0000, 2 = .offset = SZ_2M, .size = SZ_1M*30, 3 =
4、 .offset = SZ_32M, .size = SZ_32M, (4)添加devfs文件系统支持为了我们的内核支持devfs,以及在启动时能自动挂载/dev。编辑fs/Kconfig:在907行menu Pseudo filesystems下面添加如下代码:config DEVFS_FS bool /dev file system support (OBSOLETE) default y config DEVFS_MOUNT Automatically mount at boot depends on DEVFS_FS (5)配置内核首先执行make s3c2410_defconfig命
5、令获取s3c2410_defconfig文件中给定的配置。然后执行make menuconfig命令配置内核make s3c2410_defconfigmake menuconfig将出现以下图形配置界面:在这个选单中,选择system type -s3c2410 machines中的smdk2410,其它的arch-machines全部取消。这个页面选择s3c2410 Machines -这个页面把其它machines全部取消。配置文件系统支持可选上图是支持Ext3文件系统选项下面是SD卡支持选项选中mmc/SD card support后进入里面选中上面的选项后,插入sd卡时候会有提示退出
6、时候记得选择yes进行保存(6)配置文件系统 为arm系统制作根文件系统的详细过程描述如下。1、首先建立一个空根目录我们的项目空间中将根文件系统规划在rootfs目录下,这个目录现在是空的,就把它作为我们的空根目录,接下来我们就在这个目录下建立根文件系统。2、在rootfs中建立文件系统的目录结构,所有命令如下:mkdir -p /arm2410/rootfs cd /arm2410/rootfsmkdir bin dev etc lib proc sbin sys usr mnt tmp var chmod 0777 tmp #设置目录权限mkdir usr/bin usr/lib usr/
7、sbin lib/modules mkdir mnt/etc mnt/jffs2 mnt/yaffs mnt/data mnt/temp mkdir var/lib var/lock var/log var/run var/tmp chmod 0777 var/tmp #设置目录权限 第一行创建根文件系统目录。 第二行进入根文件系统目录。 第三行在根目录下创建一级目录bin dev etc lib proc sbin sys usr mnt tmp var。 第四行更改tmp权限,使得用户只能修改、删除自己在本目录下创建的文件。 第五行创建usr目录下的子目录 第六行创建mnt目录下的子目录。
8、 第七行创建var目录下的子目录。 第八行更改var/tmp目录的权限。3、创建设备文件先了解一下Linux的设备:Linux中主要有2种类型的设备:字符设备(无缓冲且只能顺序存取)、块设备(有缓冲且可以随机存取)。每个设备都必须有主、次设备号,主设备号相同的设备是同类设备(使用同一个驱动程序)。这些设备中,有些设备是对实际存在的物理硬件的抽象,而有些设备则是内核自身提供的功能(不依赖于特定的物理硬件,又称为虚拟设备)。每个设备在 /dev 目录下都有一个对应的文件(节点)。可以通过 cat /proc/devices 命令查看当前已经加载的设备驱动程序的主设备号。你可以在你的宿主机上执行这个
9、命令看看你的宿主机所拥有的设备文件,可以看到,Linux有很多很多的设备文件,在嵌入式Linux中并没有这么多的设备,下面用mknod命令创建一些主要设备文件。关于Linux的设备号:很多设备在Linux下已经有默认的主次设备号,如帧缓冲设备是Linux的标准字符设备,主设备号是29,如果Linux下有多个帧缓冲设备,那么这些帧缓冲设备的次设备号就从031(Linux最多支持32个帧缓冲设备)进行编号,比如fb0对应的次设备号就是0,fb1为1,类推。用户也可以创建自己的设备文件,比如下一篇章中我们要讨论的Led设备,需要注意的是用户自己的设备号不能与一些标准的系统设备号重叠。Linux下创建
10、设备节点的命令是mknod,下面是它的命令格式:mknod Name b | c Major MinorName是设备名称,“b”或“c”用来指定设备的类型是块设备还是字符设备。Major指定设备的主设备号,Minor是次设备号。下面我们来创建嵌入式Linux系统中一些基本的设备文件,必须是root权限,命令如下:mknod -m 600 dev/console c 5 1 #创建系统控制台设备 mknod -m 666 dev/null c 1 3 #创建空设备,任何写入都将被丢弃,任何读取都得到EOF mknod dev/fb0 c 29 0 #创建第一个帧缓冲设备,显示接口 mknod
11、dev/tty c 5 0 #创建TTY设备 mknod dev/tty0 c 4 0 #创建当前虚拟控制台mknod dev/tty1 c 4 1mknod dev/tty2 c 4 2mknod dev/tty3 c 4 3mknod dev/tty4 c 4 4 ln -s dev/fb0 dev/fb #创建创建fb到fb0的链接4、准备启动配置文件Linux启动所需要的文件有etc/inittab、etc/init.d/rcS、etc/fstab这三个文件(以下均假定当前路径在/arm2410/rootfs)。下面创建inittab文件,命令:gedit etc/inittab, 在
12、文件中添加如下内容::sysinit:/etc/init.d/rcSaskfirst:-/bin/shrespawn:restart:/sbin/init ctrlaltdel:/sbin/rebootshutdown:/bin/umount -a -r/sbin/swapoff -a分析该配置文件,可以知道init进程首先执行/etc/init.d/rcS脚本文件,该文件马上就会被创建。 rcS创建rcS文件,命令:mkdir etc/init.dgedit etc/init.d/rcS 在文件中添加如下内容:#!/bin/sh# mount all filesystem defined i
13、n fstabecho #mount all./bin/mount -a更改该文件的权限:chmod 775 etc/init.d/rcS刚刚说到rcS文件是init进程执行的初始化命令脚本,在该文件中,笔者只加了一条命令:“/bin/mount -a”,用来加载fstab文件中定义的文件系统,fstab文件马上就被会创建。 fstab首先来看看/etc/fstab文件的作用,该文件存放的是系统中的文件系统信息。当正确的设置了该文件,则可以通过mount /directoryname命令来加载一个文件系统,每种文件系统都对应一个独立的行,每行中的字段都有空格或tab键分开。同时fsck、mou
14、nt、umount的等命令都利用该程序。fstab文件格式如下:fs_spec fs_file fs_type fs_options fs_dump fs_pass fs_spec:该字段定义希望加载的文件系统所在的设备或远程文件系统,对于NFS情况,格式一般为,例如:210.43.111.211:/armnfs。对于procfs,使用proc来定义。 fs_file:该字段描述文件系统所希望加载的目录点,对于swap设备,该字段为none;对于加载目录名包含空格的情况,用40来表示空格。 fs_type:定义了该设备上的文件系统类型。 fs_options - 指定加载该设备的文件系统是需要
15、使用的特定参数选项,多个参数是由逗号分隔开来。对于大多数系统使用defaults就可以满足需要。 fs_dump:该选项被dump命令使用来检查一个文件系统应该以多快频率进行转储,若不需要转储就设置该字段为0。 fs_pass:该字段被fsck命令用来决定在启动时需要被扫描的文件系统的顺序,根文件系统/对应该字段的值应该为1,其他文件系统应该为2。若该文件系统无需在启动时扫描则设置该字段为0。下面创建fstab文件,命令:gedit etc/fstab, 在该文件中添加如下内容:proc /proc proc defaults 0 0none /tmp ramfs defaults 0 0sy
16、sfs /sys sysfs defaults 0 0 (5)利用BusyBox安装命令工具 下载并解压BusyBox下载busybox-1.9.2.tar.bz2(地址:解压busybox-1.9.2.tar.bz2,并进入解压后的busybox-1.9.2目录mkdir /arm2410/sysapp/cd /arm2410/sysapp/wget ftp:/192.168.4.210/busybox-1.9.2.tar.bz2tar -jxvf busybox-1.9.2.tar.bz2cd busybox-1.9.2 修改MakefileARCH ?= arm这个步骤太熟悉了,没有再解
17、释的必要了。 配置busybox首先恢复默认配置,然后在默认配置的基础上根据需要更改busybox的配置make defconfig配置busybox就是选择需要的命令。一定要选择Shells里面的ash(图7-2-1)以及Init utilities里面的init(图7-2-2),一般情况下,执行了make defconfig命令以后,这两项已经被选择了,这里提出来希望引起大家的注意。先进入Shells -Choose your default shell(ash) -图7-2-1 选择ash 选择好返回主菜单,选择Init Utilities -图7-2-2 配置init另外还需要注意的配
18、置有以下几项:第一项:Busybox Setting-build option- Build BusyBox as a static binary (no shared libs) * Build shared libbusybox * Produce a binary for each applet, linked against libbusybox * Produce additional busybox binary linked against libbusybox Build with Large File Support (for accessing files 2 GB) 这里
19、有必要解释一下前面的两个选项:第一个选项是是建立静态程序库,静态库就是一些目标文件的集合,以.a结尾。静态库在程序链接的时候使用,链接器会将程序中使用到函数的代码从库文件中拷贝到应用程序中。一旦链接完成,在执行程序的时候就不需要静态库了。由于每个使用静态库的应用程序都需要拷贝所用函数的代码,所以静态链接的文件会比较大,我们不选。第二个选项是建立共享库,共享库以.so结尾。共享库 (so = share object) 在程序的链接时候并不像静态库那样拷贝使用函数的代码,而只是作些标记。然后在程序开始启动运行的时候,动态地加载所需模块。所以,应用程序在运行的时候仍然需要共享库的支持。 共享库链接
20、出来的文件比静态库要小得多,因此,我们选择这个选项。第二项:installation option- * Dont use /usr Applets links (as soft-links) - (./_install) BusyBox installation prefix 第三项:Busybox Library Tuning -(6) Minimum password length (2) MD5: Trade Bytes for Speed * Faster /proc scanning code (+100 bytes) * Support for /etc/networks * C
21、ommand line editing (1024) Maximum length of input * Additional editing keys * vi-style line editing commands (15) History size History saving * Tab completion * Username completion * Fancy shell prompts (4) Copy buffer size, in kilobytes Use clock_gettime(CLOCK_MONOTONIC) syscall * Use ioctl names
22、rather than hex values in error messages 第四项:Linux Module Utilities -* insmod * Enable load map (-m) option * Symbols in load map * rmmod * lsmod * lsmod pretty output for 2.6.x Linux kernels * modprobe Multiple options parsing Fancy alias parsing- Options common to multiple modutils Support tainted
23、 module checking with new kernels Support version 2.2.x to 2.4.x Linux kernels* Support version 2.6.x Linux kernels其他的Busybox选项采用默认设置,配置完成后,保存退出。 编译busyboxmake 安装BusyBox中的工具到根文件系统busybox编译成功以后,将其编译生成的命令工具安装到根文件系统中,采用如下命令:make CONFIG_PREFIX=/arm2410/rootfs install其中,CONFIG_PREFIX用来指定安装路径,这里是根文件系统的目录。
24、若安装成功,会有如下信息:-You will probably need to make your busybox binarysetuid root to ensure all configured applets willwork properly.安装完成后会在/arm2410/rootfs目录下生成linuxrc文件,再去bin和sbin目录下看看,是不是多了很多文件呢,这些都是BusyBox编译生成的命令工具。 修改bin/busybox的属性, 命令如下:cd /arm2410/rootfs/binchmod 4755 busybox我们在这儿可以把交叉编译过后的自己写的程序拷贝到
25、这个目录下,等烧写到开发板上之后,就可以启动并运行它。7、 复制常用的库文件到/arm2410/rootfs/lib/目录下8、制作cramfs文件系统进入目录/arm2410/,将制作好的根文件系统rootfs压缩成cramfs格式的映像文件。cd /arm2410/mkcramfs rootfs arm2410.cramfs也可以将制作好的映像文件再解压到某个目录下,比如将arm2410.cramfs解压到arm2410目录下,可以用下面的命令:mkdir /root/rootfsmount -o loop arm2410.cramfs /root/rootfscp /root/rootf
26、s/* /arm2410/rootfs/ -a执行这条命令会自动建立arm2410/rootfs的目录,然后将arm2410.cramfs的内容释放到该目录下。(7)配置内核参数,使它支持NandFlash上的文件系统要将文件系统烧写到Flash中,然后挂载Flash中的文件系统。这时,这个命令行参数就要变身为下面的形式了:noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0,115200回到Linux 内核目录,再次运行make menuconfig命令以配置启动参数cd /arm2410/kernel/linux-2.6.24在Boot options - Default kernel command string中输入上面的命令行参数,如下图示:图7-6-1 配置内核命令行参数
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1