院系:计算机与信息工程学院
班级:09级计算机应用2班
姓名:刘志卿
学号:0906042003
嵌入式系统移植三步曲
Bootloader的移植
Linux内核的移植
Linux根文件系统的移植
一、Bootloader的移植
准备工作:
1. 创建交叉编译环境:
解压arm-linux-gcc-2.95.3.tar.bz2到/usr/local/arm/中
[root@localhost Desktop]# tar -xjvf arm-linux-gcc-2.95.3.tar.bz2 -C /usr/local/arm/
修改/etc/profile 文件,在文件的末尾添加如下内容:
PATH=$PATH:/usr/local/arm/2.95.3/bin/arm-linux-
运行:
[root@localhost 嵌入式实验]# source /etc/profile
检查所使用的交叉编译环境:
[root@localhost 嵌入式实验]# arm-linux-gcc -v
Reading specs from /usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3/specs
gcc version 2.95.3 20010315 (release)
2. 安装SkyEye解压源码包
[root@localhost Desktop]# tar -xjvf skyeye-1.2.6_rc1.tar.bz2 -C ./
编译skyeye-1.2.6
[root@localhost Desktop]# cd skyeye-1.2.6_rc1
[root@localhost skyeye-1.2.6_rc1]# ls
aclocal.m4 ChangeLog configure depcomp LICENSE misc REPORTING-BUGS
arch config.guess configure.in device MAINTAINERS missing TODO
AUTHORS config.h.in COPYING INSTALL Makefile.am NEWS utils
autom4te.cache config.sub dbct install-sh Makefile.in README
[root@localhost skyeye-1.2.6_rc1]# gedit INSTALL //该文件包含安装帮助信息
[root@localhost skyeye-1.2.6_rc1]# ./configure //配置
[root@localhost skyeye-1.2.6_rc1]# make //编译
[root@localhost skyeye-1.2.6_rc1]# make install //将skyeye安装到/usr/local/bin/
[root@localhost skyeye-1.2.6_rc1]# ll /usr/local/bin/skyeye
-rwxr-xr-x 1 root root 2544308 05-17 17:59 /usr/local/bin/skyeye
下面一条命令将/usr/local/bin/skyeye改名为/usr/local/bin/skyeye1.2.6。
[root@localhost skyeye-1.2.6_rc1]# mv /usr/local/bin/skyeye /usr/local/bin/skyeye1.2.6
Bootloader的移植
本试验用的是u-boot-1.1.4.tar.bz2,编辑u-boot根目录中的Makefile文件:
将
ifeq ($(ARCH),arm)
CROSS_COMPILE = arm-linux-
endif
改为
ifeq ($(ARCH),arm)
CROSS_COMPILE=/usr/local/arm/2.95.3/bin/arm-linux-
endif
在
smdk2410_config : unconfig
@./mkconfig $(@:_config=) arm arm920t smdk2410 NULL s3c24x0
后面添加
ok2410_config : unconfig
@./mkconfig $(@:_config=) arm arm920t ok2410 NULL s3c24x0
接着复制必要的文件,编辑ok2410.h头文件:
将
#define CFG_PROMPT "SMDK2410 # " /* Monitor Command Prompt */
改为
#define CFG_PROMPT "OK2410 # " /* Monitor Command Prompt */
编辑board/limin2410/Makefile文件:
将
OBJS := smdk2410.o flash.o
改为
OBJS := ok2410.o flash.o
配置、编译u-boot:出现如下错误:
......
make -C examples all
make[1]: Entering directory `/root/Desktop/u-boot-1.1.4/examples'
/usr/local/arm/2.95.3/bin/arm-linux-gcc -g -Os -fno-strict-aliasing -fno-common -ffixed-r8 -msoft-float -D__KERNEL__ -DTEXT_BASE=0x33F80000 -I/root/Desktop/u-boot-1.1.4/include -fno-builtin -ffreestanding -nostdinc -isystem /usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3/include -pipe -DCONFIG_ARM -D__ARM__ -march=armv4 -mabi=apcs-gnu -Wall -Wstrict-prototypes -c -o hello_world.o hello_world.c
cc1: Invalid option `abi=apcs-gnu'
make[1]: *** [hello_world.o] 错误 1
make[1]: Leaving directory `/root/Desktop/u-boot-1.1.4/examples'
make: *** [examples] 错误 2
修改cpu/arm920t/config.mk文件:
将
PLATFORM_CPPFLAGS +=$(call cc-option,-mapcs-32,-mabi=apcs-gnu)
改成:
PLATFORM_CPPFLAGS +=$(call cc-option,-mapcs-32,$(call cc-option,-mabi=apcs-gnu,))
编译接着出现了如下的错误:
......
/usr/local/arm/2.95.3/bin/arm-linux-ar crv libstubs.a stubs.o
a - stubs.o
make[1]: *** 没有规则可以创建“all”需要的目标“hello_world.srec”。 停止。
make[1]: Leaving directory `/root/Desktop/u-boot-1.1.4/examples'
make: *** [examples] 错误 2
修改examples目录下的Makefile文件:
将原文件的第58行开始的内容:
将原文件的第58行开始的内容:
SREC = hello_world.srec
BIN = hello_world.bin hello_world
改为
SREC = hello_world.o
BIN = hello_world.o hello_world
即可重新编译。
出现如下错误:
make[1]: Leaving directory `/root/Desktop/u-boot-1.1.4/common'
UNDEF_SYM=`/usr/local/arm/2.95.3/bin/arm-linux-objdump -x lib_generic/libgeneric.a board/ok2410/libok2410.a cpu/arm920t/libarm920t.a cpu/arm920t/s3c24x0/libs3c24x0.a lib_arm/libarm.a fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a fs/reiserfs/libreiserfs.a fs/ext2/libext2fs.a net/libnet.a disk/libdisk.a rtc/librtc.a dtt/libdtt.a drivers/libdrivers.a drivers/sk98lin/libsk98lin.a post/libpost.a post/cpu/libcpu.a common/libcommon.a |sed -n -e 's/.*\(__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\
/usr/local/arm/2.95.3/bin/arm-linux-ld -Bstatic -T /root/Desktop/u-boot-1.1.4/board/ok2410/u-boot.lds -Ttext 0x33F80000 $UNDEF_SYM cpu/arm920t/start.o \
--start-group lib_generic/libgeneric.a board/ok2410/libok2410.a cpu/arm920t/libarm920t.a cpu/arm920t/s3c24x0/libs3c24x0.a lib_arm/libarm.a fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a fs/reiserfs/libreiserfs.a fs/ext2/libext2fs.a net/libnet.a disk/libdisk.a rtc/librtc.a dtt/libdtt.a drivers/libdrivers.a drivers/sk98lin/libsk98lin.a post/libpost.a post/cpu/libcpu.a common/libcommon.a --end-group -L /usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3 -lgcc \
-Map u-boot.map -o u-boot
[root@localhost u-boot-1.1.4]# ll u-boot*
再添加skyeye.conf文件
-rwxr-xr-x 1 root root 396429 05-03 18:32 u-boot
-rwxr-xr-x 1 root root 100156 05-03 18:32 u-boot.bin
-rw-r--r-- 1 root root 48690 05-03 18:32 u-boot.map
-rwxr-xr-x 1 root root 300538 05-03 18:32 u-boot.srec
[root@localhost u-boot-1.1.4]# skyeye1.2.6
**************************** WARNING **********************************
If you want to run ELF image, you should use -e option to indicate
your elf-format image filename. Or you only want to run binary image,
you need to set the filename of the image and its entry in skyeye.conf.
***********************************************************************
Your elf file is little endian.
arch: arm
cpu info: armv4, arm920t, 41009200, ff00fff0, 2
mach info: name s3c2410x, mach_init addr 0x806bae0
ethmod num=1, mac addr=8:0:3e:26:a:5b, hostip=10.0.0.1
nandflash: dump ./nand.dump
file size:69206016
dbct info: turn on dbct!
uart_mod:0, desc_in:, desc_out:, converter:
SKYEYE: use arm920t mmu ops
Loaded RAM ./u-boot.bin
ERROR: s3c2410x_io_write_word(0x4c000000) = 0x00ffffff
ERROR: s3c2410x_io_write_word(0x4c000008) = 0x00048032
U-Boot 1.1.4 (May 3 2009 - 18:31:55)
U-Boot code: 33F80000 -> 33F9873C BSS: -> 33F9C814
RAM Configuration:
Bank #0: 30000000 64 MB
Flash: 512 kB
*** Warning - bad CRC, using default environment
In: serial
Out: serial
Err: serial
开始移植nand:
修改cpu/arm920t/start.S文件:
将从NOR Flash启动改成从NAND Flash启动。
将以下U-Boot的重定向语句段:
#ifndef CONFIG_SKIP_RELOCATE_UBOOT
relocate: /* relocate U-Boot to RAM */
adr r0, _start /* r0 <- current position of code */
ldr r1, _TEXT_BASE /* test if we run from flash or RAM */
cmp r0, r1 /* don't reloc during debug */
beq stack_setup
ldr r2, _armboot_start
ldr r3, _bss_start
sub r2, r3, r2 /* r2 <- size of armboot */
add r2, r0, r2 /* r2 <- source end address */
copy_loop:
ldmia r0!, {r3-r10} /* copy from source address [r0] */
stmia r1!, {r3-r10} /* copy to target address [r1] */
cmp r0, r2 /* until source end addreee [r2] */
ble copy_loop
#endif /* CONFIG_SKIP_RELOCATE_UBOOT */
替换成:
//#ifndef CONFIG_SKIP_RELOCATE_UBOOT
//relocate: /* relocate U-Boot to RAM */
// adr r0, _start /* r0 <- current position of code */
// ldr r1, _TEXT_BASE /* test if we run from flash or RAM */
// cmp r0, r1 /* don't reloc during debug */
// beq stack_setup
// ldr r2, _armboot_start
// ldr r3, _bss_start
// sub r2, r3, r2 /* r2 <- size of armboot */
// add r2, r0, r2 /* r2 <- source end address */
//copy_loop:
// ldmia r0!, {r3-r10} /* copy from source address [r0] */
// stmia r1!, {r3-r10} /* copy to target address [r1] */
// cmp r0, r2 /* until source end addreee [r2] */
// ble copy_loop
//#endif /* CONFIG_SKIP_RELOCATE_UBOOT */
#ifdef CONFIG_S3C2410_NAND_BOOT
@ reset NAND
mov r1, #NAND_CTL_BASE
ldr r2, =0xf830 @ initial value
str r2, [r1, #oNFCONF]
ldr r2, [r1, #oNFCONF]
bic r2, r2, #0x800 @ enable chip
str r2, [r1, #oNFCONF]
mov r2, #0xff @ RESET command
strb r2, [r1, #oNFCMD]
mov r3, #0 @ wait
nand1:
add r3, r3, #0x1
cmp r3, #0xa
blt nand1
nand2:
ldr r2, [r1, #oNFSTAT] @ wait ready
tst r2, #0x1
beq nand2
ldr r2, [r1, #oNFCONF]
orr r2, r2, #0x800 @ disable chip
str r2, [r1, #oNFCONF]
@ get read to call C functions (for nand_read())
ldr sp, DW_STACK_START @ setup stack pointer
mov fp, #0 @ no previous frame, so fp=0
@ copy U-Boot to RAM
ldr r0, =TEXT_BASE
mov r1, #0x0
mov r2, #0x20000
bl nand_read_ll
tst r0, #0x0
beq ok_nand_read
bad_nand_read:
loop2: b loop2 @ infinite loop
ok_nand_read:
@ verify
mov r0, #0
ldr r1, =TEXT_BASE
mov r2, #0x400 @ 4 bytes * 1024 = 4K-bytes
go_next:
ldr r3, [r0], #4
ldr r4, [r1], #4
teq r3, r4
bne notmatch
subs r2, r2, #4
beq stack_setup
bne go_next
notmatch:
loop3: b loop3 @ infinite loop
#endif /* CONFIG_S3C2410_NAND_BOOT */
在
_start_armboot: .word start_armboot
后面加入
.align 2
DW_STACK_START: .word STACK_BASE+STACK_SIZE-4
修改board/ok2410/Makefil e文件 :将
OBJS := ok2410.o flash.o
改为
OBJS := ok2410.o flash.o nand_read.o
创建board/ok2410/nand_read.c文件,内容如下:
#include
#define __REGb(x) (*(volatile unsigned char *)(x))
#define __REGi(x) (*(volatile unsigned int *)(x))
#define NF_BASE 0x4e000000
#define NFCONF __REGi(NF_BASE + 0x0)
#define NFCMD __REGb(NF_BASE + 0x4)
#define NFADDR __REGb(NF_BASE + 0x8)
#define NFDATA __REGb(NF_BASE + 0xc)
#define NFSTAT __REGb(NF_BASE + 0x10)
#define BUSY 1
#ifndef NAND_SECTOR_SIZE
#define NAND_SECTOR_SIZE 512
#endif
#ifndef NAND_BLOCK_MASK
#define NAND_BLOCK_MASK 511
#endif
inline void wait_idle(void) {
int i;
while(!(NFSTAT & BUSY))
for(i=0; i<10; i++);
}
/* low level nand read function */
int nand_read_ll(unsigned char *buf, unsigned long start_addr, int size)
{
int i, j;
if ((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK)) {
return -1; /* invalid alignment */
}
/* chip Enable */
NFCONF &= ~0x800;
for(i=0; i<10; i++);
for(i=start_addr; i < (start_addr + size);) {
/* READ0 */
NFCMD = 0;
/* Write Address */
NFADDR = i & 0xff;
NFADDR = (i >> 9) & 0xff;
NFADDR = (i >> 17) & 0xff;
NFADDR = (i >> 25) & 0xff;
wait_idle();
for(j=0; j < NAND_SECTOR_SIZE; j++, i++) {
*buf = (NFDATA & 0xff);
buf++;
}
}
/* chip Disable */
NFCONF |= 0x800; /* chip disable */
return 0;
}
编辑include/configs/ok2410.h文件:
在文件的后部添加
/****************** me add begin *******************/
/*
* Nandflash Boot
*/
#define CONFIG_S3C2410_NAND_BOOT 1
#define STACK_BASE 0x33f00000
#define STACK_SIZE 0x8000
//#define UBOOT_RAM_BASE 0x33f80000
/* NAND Flash Controller */
#define NAND_CTL_BASE 0x4E000000
#define bINT_CTL(Nb) __REG(INT_CTL_BASE + (Nb))
/* Offset */
#define oNFCONF 0x00
#define oNFCMD 0x04
#define oNFADDR 0x08
#define oNFDATA 0x0c
#define oNFSTAT 0x10
#define oNFECC 0x14
/****************** me add end *******************/
编译u-boot,然后测试u-boot是否可以从nand启动
多次执行skyeye1.2.6,出现如下页面:
**************************** WARNING **********************************
If you want to run ELF image, you should use -e option to indicate
your elf-format image filename. Or you only want to run binary image,
you need to set the filename of the image and its entry in skyeye.conf.
***********************************************************************
Your elf file is little endian.
arch: arm
cpu info: armv4, arm920t, 41009200, ff00fff0, 2
mach info: name s3c2410x, mach_init addr 0x806bae0
ethmod num=1, mac addr=8:0:3e:26:a:5b, hostip=10.0.0.1
nandflash: dump ./nand.dump
Init nandflash dump file.
file size:69206016
finish init nandflash dump
dbct info: turn on dbct!
uart_mod:0, desc_in:, desc_out:, converter:
到此停止不动,需要执行如下命令:
[root@localhost u-boot-1.1.4]# mknandflashdump u-boot.bin nand.dump 0
finish
[root@localhost u-boot-1.1.4]# ll nand.dump
-rw-r--r-- 1 root root 118272 05-10 22:29 nand.dump
注意:使用mknandflashdump命令生成nand.dump文件,同时向该文件所模拟的NAND Flash的起始地址(0x0)处烧写u-boot.bin。
再次执行skyeye1.2.6:
[root@localhost u-boot-1.1.4]# skyeye1.2.6
以下是u-boot添加nand指令的支持。
编辑include/configs/ok2410.h文件:
在
#define CONFIG_BAUDRATE 115200
后面添加
/*********************** me add begin *************************************/
/* enable passing of ATAGs */
#define CONFIG_CMDLINE_TAG 1
#define CONFIG_SETUP_MEMORY_TAGS 1
#define CONFIG_INITRD_TAG 1
/*********************** me add end *************************************/
说明:为了能使U-BOOT正确引导Linux内核,必须传递合适的参数给内核。引导内核时可以将bootargs传递给内核。bootargs是指ok2410.h文件中的CONFIG_BOOTARGS宏。
将
/*CFG_CMD_NAND |*/ \
改为
CFG_CMD_NAND | \
将
/*#define CONFIG_BOOTARGS "root=ramfs devfs=mount console=ttySA0,9600" */
改为
#define CONFIG_BOOTARGS "noinitrd root=/dev/nfs rw nfsroot=10.0.0.1:/tmp/nfs ip=10.0.0.110:10.0.0.1:10.0.0.1:255.255.255.0 init=linuxrc console=ttySAC0,115200 mem=64M"
将
/*#define CONFIG_BOOTCOMMAND "tftp; bootm" */
改为
#define CONFIG_BOOTCOMMAND "tftp 0x31000000 uImage;bootm 0x31000000"
进一步编辑include/configs/ok2410.h文件:
/****************** me add begin *******************/
// #define CFG_ENV_IS_IN_FLASH 1 /*将该行注释,添加下面一行*/
#define CFG_ENV_IS_IN_NAND 1 /*该行很重要,没有该行,saveenv命令将失效*/
#define CFG_ENV_SIZE 0x10000 /* Total Size of Environment Sector */
#define CFG_NAND_LEGACY 1
#define CFG_ENV_OFFSET 0X20000 /*环境变量在Nand Flash的0x20000处*/
#if (CONFIG_COMMANDS & CFG_CMD_NAND)
#define CFG_NAND_BASE 0x4E000000 /* physical address to access nand at CS0*/
/* Nand Flash控制器在SFR区起始寄存器地址 */
#define CFG_MAX_NAND_DEVICE 1 /*支持Nand Flash设备的最大个数*/
#define SECTORSIZE 512
#define NAND_SECTOR_SIZE SECTORSIZE
#define NAND_BLOCK_MASK 511
#define ADDR_COLUMN 1
#define ADDR_PAGE 3
#define ADDR_COLUMN_PAGE 4
#define NAND_ChipID_UNKNOWN 0x00 /* 未知芯片的ID号 */
#define NAND_MAX_FLOORS 1
#define NAND_MAX_CHIPS 1 /* 板子上NAND Flash芯片的最大个数 */
/*下面7行是Nand Flash命令层底层的接口函数 */
#define WRITE_NAND_COMMAND(d, adr) {rNFCMD = d;}
#define WRITE_NAND_ADDRESS(d, adr) {rNFADDR = d;}
#define WRITE_NAND(d, adr) {rNFDATA = d;}
#define READ_NAND(adr) (rNFDATA)
#define NAND_WAIT_READY(nand) {while(!(rNFSTAT&(1<<0)));}
#define NAND_DISABLE_CE(nand) {rNFCONF |= (1<<11);}
#define NAND_ENABLE_CE(nand) {rNFCONF &= ~(1<<11);}
/* the following functions are NOP's because S3C24X0 handles this in hardware */
#define NAND_CTL_CLRALE(nandptr)
#define NAND_CTL_SETALE(nandptr)
#define NAND_CTL_CLRCLE(nandptr)
#define NAND_CTL_SETCLE(nandptr)
#define CONFIG_MTD_NAND_VERIFY_WRITE 1 /* 允许Nand Flash写校验 */
/*
* Nandflash Boot
*/
#define CONFIG_S3C2410_NAND_BOOT 1
#define STACK_BASE 0x33f00000
#define STACK_SIZE 0x8000
//#define UBOOT_RAM_BASE 0x33f80000
/* NAND Flash Controller */
#define NAND_CTL_BASE 0x4E000000
#define bINT_CTL(Nb) __REG(INT_CTL_BASE + (Nb))
/* Offset */
#define oNFCONF 0x00
#define oNFCMD 0x04
#define oNFADDR 0x08
#define oNFDATA 0x0c
#define oNFSTAT 0x10
#define oNFECC 0x14
#define rNFCONF (*(volatile unsigned int *)0x4e000000)
#define rNFCMD (*(volatile unsigned char *)0x4e000004)
#define rNFADDR (*(volatile unsigned char *)0x4e000008)
#define rNFDATA (*(volatile unsigned char *)0x4e00000c)
#define rNFSTAT (*(volatile unsigned int *)0x4e000010)
#define rNFECC (*(volatile unsigned int *)0x4e000014)
#define rNFECC0 (*(volatile unsigned char *)0x4e000014)
#define rNFECC1 (*(volatile unsigned char *)0x4e000015)
#define rNFECC2 (*(volatile unsigned char *)0x4e000016)
#endif /* CONFIG_COMMANDS & CFG_CMD_NAND*/
/****************** me add end *******************/
编辑board/ok2410/ok2410.c文件,在文件的尾部添加如下内容:
/****************** me add begin *******************/
#if (CONFIG_COMMANDS & CFG_CMD_NAND)
typedef enum {
NFCE_LOW,
NFCE_HIGH
} NFCE_STATE;
static inline void NF_Conf(u16 conf)
{
S3C2410_NAND * const nand = S3C2410_GetBase_NAND();
nand->NFCONF = conf;
}
static inline void NF_Cmd(u8 cmd)
{
S3C2410_NAND * const nand = S3C2410_GetBase_NAND();
nand->NFCMD = cmd;
}
static inline void NF_CmdW(u8 cmd)
{
NF_Cmd(cmd);
udelay(1);
}
static inline void NF_Addr(u8 addr)
{
S3C2410_NAND * const nand = S3C2410_GetBase_NAND();
nand->NFADDR = addr;
}
static inline void NF_SetCE(NFCE_STATE s)
{
S3C2410_NAND * const nand = S3C2410_GetBase_NAND();
switch (s) {
case NFCE_LOW:
nand->NFCONF &= ~(1<<11);
break;
case NFCE_HIGH:
nand->NFCONF |= (1<<11);
break;
}
}
static inline void NF_WaitRB(void)
{
S3C2410_NAND * const nand = S3C2410_GetBase_NAND();
while (!(nand->NFSTAT & (1<<0)));
}
static inline void NF_Write(u8 data)
{
S3C2410_NAND * const nand = S3C2410_GetBase_NAND();
nand->NFDATA = data;
}
static inline u8 NF_Read(void)
{
S3C2410_NAND * const nand = S3C2410_GetBase_NAND();
return(nand->NFDATA);
}
static inline void NF_Init_ECC(void)
{
S3C2410_NAND * const nand = S3C2410_GetBase_NAND();
nand->NFCONF |= (1<<12);
}
static inline u32 NF_Read_ECC(void)
{
S3C2410_NAND * const nand = S3C2410_GetBase_NAND();
return(nand->NFECC);
}
#endif
/*
* NAND flash initialization.
*/
#if (CONFIG_COMMANDS & CFG_CMD_NAND)
extern ulong nand_probe(ulong physadr);
static inline void NF_Reset(void)
{
int i;
NF_SetCE(NFCE_LOW);
NF_Cmd(0xFF); /* reset command */
for(i = 0; i < 10; i++); /* tWB = 100ns. */
NF_WaitRB(); /* wait 200~500us; */
NF_SetCE(NFCE_HIGH);
}
static inline void NF_Init(void)
{
#if 0 /* a little bit too optimistic */
#define TACLS 0
#define TWRPH0 3
#define TWRPH1 0
#else
#define TACLS 0
#define TWRPH0 4
#define TWRPH1 2
#endif
NF_Conf((1<<15)|(0<<14)|(0<<13)|(1<<12)|(1<<11)|(TACLS<<8)|(TWRPH0<<4)|(TWRPH1<<0));
/*nand->NFCONF = (1<<15)|(1<<14)|(1<<13)|(1<<12)|(1<<11)|(TACLS<<8)|(TWRPH0<<4)|(TWRPH1<<0); */
/* 1 1 1 1, 1 xxx, r xxx, r xxx */
/* En 512B 4step ECCR nFCE=H tACLS tWRPH0 tWRPH1 */
NF_Reset();
}
void nand_init(void)
{
S3C2410_NAND * const nand = S3C2410_GetBase_NAND();
NF_Init();
#ifdef DEBUG
printf("NAND flash probing at 0x%.8lX\n", (ulong)nand);
#endif
printf ("%4lu MB\n", nand_probe((ulong)nand) >> 20);
}
#endif
/****************** me add end *******************/
修改 common/cmd_nand.c文件 :将NanD_ReadBuf函数中的
NanD_Command (nand, NAND_CMD_READ0);
改为
//NanD_Command (nand, NAND_CMD_READ0);
如果没有将该行注释掉,启动skyeye1.2.6后,将会出现如下错误:
Hit any key to stop autoboot: 0
OK2410 # nand read 0x31000000 0x0 0x1BFC8
NAND read: device 0 offset 0, size 114632 ... warning when RE falling,do nothing
0 bytes read: ERROR
OK2410 #
编译、测试:
[root@localhost u-boot-1.1.4]# skyeye1.2.6
**************************** WARNING **********************************
If you want to run ELF image, you should use -e option to indicate
your elf-format image filename. Or you only want to run binary image,
you need to set the filename of the image and its entry in skyeye.conf.
***********************************************************************
Your elf file is little endian.
arch: arm
cpu info: armv4, arm920t, 41009200, ff00fff0, 2
mach info: name s3c2410x, mach_init addr 0x806bae0
ethmod num=1, mac addr=8:0:3e:26:a:5b, hostip=10.0.0.1
nandflash: dump ./nand.dump
file size:69206016
dbct info: turn on dbct!
uart_mod:0, desc_in:, desc_out:, converter:
SKYEYE: use arm920t mmu ops
Loaded RAM ./u-boot.bin
ERROR: s3c2410x_io_write_word(0x4c000000) = 0x00ffffff
ERROR: s3c2410x_io_write_word(0x4c000008) = 0x00048032
U-Boot 1.1.4 (Jun 14 2011 - 18:45:47)
U-Boot code: 33F80000 -> 33F9C304 BSS: -> 33FA03E0
RAM Configuration:
Bank #0: 30000000 64 MB
Flash: 512 kB
NAND: 64 MB
*** Warning - bad CRC or NAND, using default environment
In: serial
Out: serial
Err: serial
Hit any key to stop autoboot: 0
TFTP from server 10.0.0.1; our IP address is 10.0.0.110
Filename 'uImage'.
Load address: 0x31000000
Loading: checksum bad
checksum bad
T T T T T .................
出现
Flash: 512 kB
NAND: 64 MB
表示实验成功,T代表try尝试去连接服务器,因为没有建立服务器所以不能连接成功。将NAND Flash(/dev/mtdblock2)作为根文件系统:
**************************** WARNING **********************************
If you want to run ELF image, you should use -e option to indicate
your elf-format image filename. Or you only want to run binary image,
you need to set the filename of the image and its entry in skyeye.conf.
***********************************************************************
Your elf file is little endian.
arch: arm
cpu info: armv4, arm920t, 41009200, ff00fff0, 2
mach info: name s3c2410x, mach_init addr 0x806bae0
ethmod num=1, mac addr=8:0:3e:26:a:5b, hostip=10.0.0.1
nandflash: dump ./nand.dump
file size:69206016
dbct info: turn on dbct!
uart_mod:0, desc_in:, desc_out:, converter:
SKYEYE: use arm920t mmu ops
Loaded RAM ./u-boot.bin
ERROR: s3c2410x_io_write_word(0x4c000000) = 0x00ffffff
ERROR: s3c2410x_io_write_word(0x4c000008) = 0x00048032
U-Boot 1.1.4 (May 11 2009 - 11:46:42)
U-Boot code: 33F80000 -> 33F9C20C BSS: -> 33FA02E8
RAM Configuration:
Bank #0: 30000000 64 MB
Flash: 512 kB
NAND: 64 MB
*** Warning - bad CRC, using default environment
In: serial
Out: serial
Err: serial
Hit any key to stop autoboot: 0
OK2410 # printenv
bootargs=noinitrd root=/dev/nfs rw nfsroot=10.0.0.1:/tmp/nfs ip=10.0.0.110:10.0.0.1:10.0.0.1:255.255.255.0 init=linuxrc console=ttySAC0,115200 mem=64M
bootcmd=tftp 0x31000000 uImage;bootm 0x31000000 //要记住该环境变量,后面的实例中会用到
bootdelay=3
baudrate=115200
ipaddr=10.0.0.110
serverip=10.0.0.1
netmask=255.255.255.0
stdin=serial
stdout=serial
stderr=serial
ethaddr=08:00:3E:26:0A:5B
Environment size: 341/65532 bytes
OK2410 #
OK2410 # setenv bootargs noinitrd mem=64M root=/dev/mtdblock2 init=/linuxrc console=ttySAC0,115200
OK2410 # tftp 0x31000000 uImage
OK2410 # bootm 31000000
## Booting image at 31000000 ...
Image Name: linux-2.6.14.7
Created: 2009-05-10 14:48:03 UTC
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 1009504 Bytes = 985.8 kB
Load Address: 30008000
Entry Point: 30008000
Verifying Checksum ... OK
OK
Starting kernel ...
Uncompressing Linux................................................................ done, booting the kernel.
Linux version 2.6.14.7 (root@localhost.localdomain) (gcc version 3.4.1) #1 Sun May 10 15:13:57 CST 2009
CPU: ARM920Tid(wb) [41009200] revision 0 (ARMvundefined/unknown)
Machine: SMDK2410
Warning: bad configuration page, trying to continue
Memory policy: ECC disabled, Data cache writeback
CPU S3C2410 (id 0x32410000)
S3C2410: core 202.800 MHz, memory 101.400 MHz, peripheral 50.700 MHz
S3C2410 Clocks, (c) 2004 Simtec Electronics
CLOCK: Slow mode (1.500 MHz), fast, MPLL on, UPLL on
CPU0: D VIVT write-back cache
CPU0: I cache: 16384 bytes, associativity 64, 32 byte lines, 8 sets
CPU0: D cache: 16384 bytes, associativity 64, 32 byte lines, 8 sets
Built 1 zonelists
Kernel command line: noinitrd mem=64M root=/dev/mtdblock2 init=/linuxrc console=ttySAC0,115200
irq: clearing pending status 00004000
irq: clearing pending status 00008000
irq: clearing pending status 00800000
irq: clearing pending status 10000000
irq: clearing subpending status 00000093
PID hash table entries: 512 (order: 9, 8192 bytes)
timer tcon=00500000, tcnt a509, tcfg 00000200,00000000, usec 00001e4c
Console: colour dummy device 80x30
Dentry cache hash table entries: 16384 (order: 4, 65536 bytes)
Inode-cache hash table entries: 8192 (order: 3, 32768 bytes)
Memory: 64MB = 64MB total
Memory: 62720KB available (1635K code, 321K data, 92K init)
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok
softlockup thread 0 started up.
NET: Registered protocol family 16
S3C2410: Initialising architecture
NetWinder Floating Point Emulator V0.97 (double precision)
devfs: 2004-01-31 Richard Gooch (rgooch@atnf.csiro.au)
devfs: boot_options: 0x1
Console: switching to colour frame buffer device 80x25
fb0: Virtual frame buffer device, using 1024K of video memory
S3C2410 RTC, (c) 2004 Simtec Electronics
s3c2410_serial0 at MMIO 0x50000000 (irq = 70) is a S3C2410
s3c2410_serial1 at MMIO 0x50004000 (irq = 73) is a S3C2410
s3c2410_serial2 at MMIO 0x50008000 (irq = 76) is a S3C2410
io scheduler noop registered
io scheduler anticipatory registered
io scheduler deadline registered
io scheduler cfq registered
RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize
Cirrus Logic CS8900A driver for Linux (Modified for SMDK2410)
eth0: CS8900A rev D at 0xe0000300 irq=53, no eeprom , addr: 08: 0:3E:26:0A:5B
S3C24XX NAND Driver, (c) 2004 Simtec Electronics
s3c2410-nand: mapped registers at c4980000
s3c2410-nand: timing: Tacls 10ns, Twrph0 30ns, Twrph1 10ns
NAND device: Manufacturer ID: 0xec, Chip ID: 0x76 (Samsung NAND 64MiB 3,3V 8-bit)
NAND_ECC_NONE selected by board driver. This is not recommended !!
Scanning device for bad blocks
Creating 4 MTD partitions on "NAND 64MiB 3,3V 8-bit":
0x00000000-0x00100000 : "bootloader"
0x00100000-0x00400000 : "kernel"
0x00400000-0x02c00000 : "root"
0x02d00000-0x03c00000 : "user"
mice: PS/2 mouse device common for all mice
NET: Registered protocol family 2
IP route cache hash table entries: 1024 (order: 0, 4096 bytes)
TCP established hash table entries: 4096 (order: 2, 16384 bytes)
TCP bind hash table entries: 4096 (order: 2, 16384 bytes)
TCP: Hash tables configured (established 4096 bind 4096)
TCP reno registered
TCP bic registered
NET: Registered protocol family 1
Reading data from NAND FLASH without ECC is not recommended
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(31,2)
//错误,因为mtdblock2中还没有文件系统,该问题将在下一小节中解决
通过NFS访问文件系统:
**************************** WARNING **********************************
If you want to run ELF image, you should use -e option to indicate
your elf-format image filename. Or you only want to run binary image,
you need to set the filename of the image and its entry in skyeye.conf.
***********************************************************************
…… //部分启动信息省略
Hit any key to stop autoboot: 0
OK2410 # tftp 0x31000000 uImage
TFTP from server 10.0.0.1; our IP address is 10.0.0.110
Filename 'uImage'.
Load address: 0x31000000
Loading:
…… //部分信息省略
done
Bytes transferred = 1009568 (f67a0 hex)
OK2410 # bootm 31000000
…… //部分信息省略
OK
Starting kernel ...
Uncompressing Linux................................................................ done, booting the kernel.
Linux version 2.6.14.7 (root@localhost.localdomain) (gcc version 3.4.1) #1 Sun May 10 15:13:57 CST 2009
CPU: ARM920Tid(wb) [41009200] revision 0 (ARMvundefined/unknown)
Machine: SMDK2410
…… //部分信息省略
Kernel command line: noinitrd root=/dev/nfs rw nfsroot=10.0.0.1:/tmp/nfs ip=10.0.0.110:10.0.0.1:10.0.0.1:255.255.255.0 init=linuxrc console=ttySAC0,115200 mem=64M
…… //部分信息省略
Creating 4 MTD partitions on "NAND 64MiB 3,3V 8-bit":
0x00000000-0x00100000 : "bootloader"
0x00100000-0x00400000 : "kernel"
0x00400000-0x02c00000 : "root"
0x02d00000-0x03c00000 : "user"
…… //部分信息省略
NET: Registered protocol family 1
IP-Config: Complete:
device=eth0, addr=10.0.0.110, mask=255.255.255.0, gw=10.0.0.1,
host=10.0.0.110, domain=, nis-domain=(none),
bootserver=10.0.0.1, rootserver=10.0.0.1, rootpath=
Looking up port of RPC 100003/2 on 10.0.0.1
Looking up port of RPC 100005/1 on 10.0.0.1
VFS: Mounted root (nfs filesystem).
Mounted devfs on /dev
Freeing init memory: 92K
Failed to execute linuxrc. Attempting defaults...
Kernel panic - not syncing: No init found. Try passing init= option to kernel.
//错误,原因可能是NFS文件系统没有准备好,或者是防火墙,该问题将在下一小节中解决
三、根文件系统的移植
解压busybox-1.13.4.tar.bz2到桌面
[root@localhost Desktop]# tar -xjvf busybox-1.13.4.tar.bz2 -C ./
[root@localhost Desktop]# cd busybox-1.13.4
[root@localhost busybox-1.13.4]#
编辑Makefile文件[root@localhost busybox-1.13.4]# gedit Makefile
将
CROSS_COMPILE ?=
改为
CROSS_COMPILE ?=/usr/local/arm/3.4.1/bin/arm-linux-
将
ARCH ?= $(SUBARCH)
改为
ARCH ?= arm
进行默认配置[root@localhost busybox-1.13.4]# make defconfig //恢复默认配置
对配置信息进行修改[root@localhost busybox-1.13.4]# make menuconfig
HOSTLD scripts/kconfig/mconf
HOSTCC scripts/kconfig/lxdialog/checklist.o
HOSTCC scripts/kconfig/lxdialog/inputbox.o
HOSTCC scripts/kconfig/lxdialog/lxdialog.o
HOSTCC scripts/kconfig/lxdialog/menubox.o
HOSTCC scripts/kconfig/lxdialog/msgbox.o
HOSTCC scripts/kconfig/lxdialog/textbox.o
HOSTCC scripts/kconfig/lxdialog/util.o
HOSTCC scripts/kconfig/lxdialog/yesno.o
HOSTLD scripts/kconfig/lxdialog/lxdialog
scripts/kconfig/mconf Config.in
在检查Miscellaneous Utilities--->
taskset 是否去除
同时设置如下:
Busybox Settings --->
Build Options --->
[*]Build BusyBox as a static binry (no shared libs) //选用静态连接
[*]Build with Large File Support (for accessing files > 2 GB)
(/usr/local/arm/3.4.1/bin/arm-linux-) Cross Compiler prefix
Installation Options --->
[*] Don't use /usr
(./_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
[*] Command line editing
(1024) Maximum length of input
[*] vi-style line editing commands
(15) History size
[*] History saving
[*] Tab completion
[*] Username completion
[*] Fancy shell prompts //Setting this option allows for prompts to use things like \w and
// \$ and escape codes.
[ ] Give more precise messages when copy fails (cp, mv etc)
(4) Copy buffer size, in kilobytes
[ ] Use clock_gettime(CLOCK_MONOTONIC) syscall
[*] Use ioctl names rather than hex values in error messages
[*] Support infiniband HW弹出的TUI界面中进行如下配置:
设置完毕后,保存、退出。
编译
[root@localhost busybox-1.13.4]# make
......
CC networking/inetd.o
CC networking/interface.o
networking/interface.c:818: error: `ARPHRD_INFINIBAND' undeclared here (not in a function)
networking/interface.c:818: error: initializer element is not constant
networking/interface.c:818: error: (near initialization for `ib_hwtype.type')
make[1]: *** [networking/interface.o] 错误 1
make: *** [networking] 错误 2
编译出错,此时需要编辑networking/interface.c文件。
[root@localhost busybox-1.13.4]# gedit networking/interface.c
将networking/interface.c文件的818行修改为“.type = -1”,然后再次编译。
[root@localhost busybox-1.13.4]# make
......
CC util-linux/volume_id/volume_id.o
CC util-linux/volume_id/xfs.o
AR util-linux/volume_id/lib.a
LINK busybox_unstripped
Trying libraries: crypt m
Library crypt is not needed, excluding it
Library m is needed, can't exclude it (yet)
Final link with: m
DOC busybox.pod
DOC BusyBox.txt
DOC BusyBox.1
DOC BusyBox.html
[root@localhost busybox-1.13.4]# ll busybox*
[root@localhost busybox-1.13.4]# make install
-rwxr-xr-x 1 root root 1701216 05-11 17:26 busybox
-rwxr-xr-x 1 root root 2045185 05-11 17:26 busybox_unstripped
-rw-r--r-- 1 root root 889321 05-11 17:26 busybox_unstripped.map
-rw-r--r-- 1 root root 83503 05-11 17:26 busybox_unstripped.out
如果成功,会出现如下信息:
--------------------------------------------------
You will probably need to make your busybox binary
setuid root to ensure all configured applets will
work properly.
--------------------------------------------------
解决办法是修改_install/bin/busybox文件的属性。
[root@localhost busybox-1.13.4]# ll _install/bin/busybox
-rwxr-xr-x 1 root root 1701216 05-11 17:41 _install/bin/busybox
[root@localhost busybox-1.13.4]# chmod 4755 ./_install/bin/busybox //修改busybox属性
[root@localhost busybox-1.13.4]# ll _install/bin/busybox
-rwsr-xr-x 1 root root 1701216 05-11 17:41 _install/bin/busybox
[root@localhost busybox-1.13.4]# ll _install/
总计 20
drwxr-xr-x 2 root root 4096 05-11 17:41 bin
lrwxrwxrwx 1 root root 11 05-11 17:41 linuxrc -> bin/busybox
drwxr-xr-x 2 root root 4096 05-11 17:41 sbin
[root@localhost busybox-1.13.4]# cd _install/
[root@localhost _install]# pwd
/root/Desktop/busybox-1.13.4/_install
在/tmp/nfs中创建所需的目录
[root@localhost nfs]# mkdir -p bin sbin lib/modules etc/init.d dev usr/bin usr/sbin usr/lib proc sys home root boot mnt/etc mnt/jffs2 mnt/yaffs mnt/data mnt/temp var/lib var/lock var/log var/run var/tmp tmp
[root@localhost nfs]# chmod 1777 tmp
[root@localhost nfs]# chmod 1777 var/tmp
[root@localhost nfs]# cd dev/
[root@localhost dev]# pwd
/tmp/nfs/dev
[root@localhost dev]# mknod -m 600 console c 5 1
[root@localhost dev]# mknod -m 666 null c 1 3
复制文件到/tmp/nfs中
将/root/Desktop/busybox-1.13.4/_install中的内容复制到/tmp/nfs中。
[root@localhost _install]# pwd
/root/Desktop/busybox-1.13.4/_install
[root@localhost _install]# cp -a bin /tmp/nfs/
[root@localhost _install]# cp -a sbin /tmp/nfs/
[root@localhost _install]# ll linuxrc
lrwxrwxrwx 1 root root 11 05-11 17:41 linuxrc -> bin/busybox
[root@localhost _install]# cp -a linuxrc /tmp/nfs/
[root@localhost _install]# ll /tmp/nfs/linuxrc
lrwxrwxrwx 1 root root 11 05-11 17:43 /tmp/nfs/linuxrc -> bin/busybox
[root@localhost _install]# cd ..
[root@localhost busybox-1.13.4]# pwd
/root/Desktop/busybox-1.13.4
[root@localhost busybox-1.13.4]# cp -a examples/bootfloppy/etc/* /tmp/nfs/etc/
[root@localhost busybox-1.13.4]# ls /tmp/nfs/etc/
fstab init.d inittab profile
[root@localhost busybox-1.13.4]#
创建配置文件
编写etc/inittab文件、修改其权限
[root@localhost nfs]# gedit etc/inittab
文件内容如下:
::sysinit:/etc/init.d/rcS #指定系统初始化脚本文件
::respawn:-/bin/login #加上-语句会在登陆终端之后调用/etc/目录下的profile文件
::restart:/sbin/init #指定系统重启时执行的初始化程序
tty0::respawn:-/bin/login
::shutdown:/bin/umount -a -r #指定关机时执行的操
::shutdown:/sbin/swapoff -a
[root@localhost nfs]# ll etc/inittab
-rw-r--r-- 1 root root 309 05-11 18:28 etc/inittab
[root@localhost nfs]# chmod 755 etc/inittab
编写etc/init.d/rcS文件、修改其权限
[root@localhost nfs]# gedit etc/init.d/rcS
文件内容如下:
#!/bin/sh
# mount all filesystem defined in "fstab"
echo "#mount all......."
/bin/mount -a
/bin/mknod -m 600 /dev/console c 5 1
/bin/mknod -m 666 /dev/null c 1 3
/bin/mknod -m 666 /dev/tty0 c 4 0
/bin/mknod -m 666 /dev/mtdblock0 b 31 0
/bin/mknod -m 666 /dev/mtdblock1 b 31 1
/bin/mknod -m 666 /dev/mtdblock2 b 31 2
/bin/mknod -m 666 /dev/mtdblock3 b 31 3
#/bin/mount -t ext2 /dev/mtdblock3 /mnt/temp/
echo "******************************************************************"
echo " OK 2410 Rootfs made by liminmin, 2010.06"
echo "******************************************************************"
[root@localhost nfs]# ll etc/init.d/rcS
-rw-r--r-- 1 root root 92 05-11 18:27 etc/init.d/rcS
[root@localhost nfs]# chmod 755 etc/init.d/rcS
编写etc/fstab文件、修改其权限
[root@localhost nfs]# gedit etc/fstab
文件内容如下:
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
none /tmp ramfs defaults 0 0
mdev /dev ramfs defaults 0 0
[root@localhost nfs]# ll etc/fstab
-rw-r--r-- 1 root root 59 05-11 18:30 etc/fstab
[root@localhost nfs]# chmod 755 etc/fstab
编写etc/proflie文件、修改其权限
[root@localhost nfs]# gedit etc/proflie
文件内容如下:
# /etc/profile: system-wide .profile file for the Bourne shells
echo
echo -n "Processing /etc/profile... "
# no-op
# Set search library path
echo "Set search library path in /etc/profile"
export LD_LIBRARY_PATH=/lib:/usr/lib
# Set user path
echo "Set user path in /etc/profile"
export PATH=/bin:/sbin:/usr/bin:/usr/sbin #设置命令搜索路径
export HISTSIZE=100
export PS1='[\u@\h \W]\$ '
alias ll='ls -l'
#/sbin/ifconfig eth0 192.168.1.22 netmask 255.255.255.0
/sbin/ifconfig lo 127.0.0.1
echo "Configure net done"
echo "All Done"
echo
创建密码文件、修改其权限
下面3个文件可以从宿主机中复制,只留下root帐号。
[root@localhost nfs]# cp /etc/passwd etc/ ;cp /etc/shadow etc/ ;cp /etc/group etc/
[root@localhost nfs]# chmod 600 etc/shadow
[root@localhost nfs]# gedit etc/passwd
内容是:root:x:0:0:root:/root:/bin/sh
[root@localhost nfs]# gedit etc/shadow
内容是:root:$1$zs2zr2N4$15U99ll5tUm3DwOvKnCVV1:14335:0:99999:7:::
[root@localhost nfs]# gedit etc/group
内容是:root:x:0:root
为mdev创建配置文件
[root@localhost nfs]# gedit etc/mdev.conf
内容是:空
[root@localhost nfs]# ll etc/
总计 60
-rwxr-xr-x 1 root root 117 05-11 19:28 fstab
-rw-r--r-- 1 root root 14 05-11 20:09 group
drwxr-xr-x 2 root root 4096 05-11 20:04 init.d
-rwxr-xr-x 1 root root 184 05-11 19:33 inittab
-rw-r--r-- 1 root root 0 05-11 20:09 mdev.conf
-rw-r--r-- 1 root root 30 05-11 20:07 passwd
-rwxr-xr-x 1 root root 801 05-11 19:42 proflie
-rw-r--r-- 1 root root 59 05-11 20:08 shadow
删除备份文件
[root@localhost nfs]# rm
复制常用的库文件编写脚本文件copy_lib.sh
[root@localhost nfs]# gedit copy_lib.sh
文件内容如下:
#!/bin/bash
#You should put this file cp.sh in /usr/local/arm/3.4.1/arm-linux/lib/
ROOTFS_LIB=/tmp/nfs/lib/
for file in libc libcrypt libdl libm libpthread libresolv libutil
do
cp $file-*.so ${ROOTFS_LIB}
cp -d $file.so.[*0-9] ${ROOTFS_LIB}
done
cp -d ld*.so* ${ROOTFS_LIB}
[root@localhost nfs]# ll copy_lib.sh
-rw-r--r-- 1 root root 303 05-11 20:18 copy_lib.sh
[root@localhost nfs]# chmod a+x copy_lib.sh
[root@localhost nfs]# cp copy_lib.sh /usr/local/arm/3.4.1/arm-linux/lib/
[root@localhost nfs]# cd /usr/local/arm/3.4.1/arm-linux/lib/
[root@localhost lib]# ./copy_lib.sh
[root@localhost lib]# cd -
/tmp/nfs
[root@localhost nfs]# ll lib
总计 2516
-rwxr-xr-x 1 root root 131480 05-11 20:19 ld-2.3.2.so
lrwxrwxrwx 1 root root 11 05-11 20:19 ld-linux.so.2 -> ld-2.3.2.so
-rwxr-xr-x 1 root root 1560352 05-11 20:19 libc-2.3.2.so
-rwxr-xr-x 1 root root 30155 05-11 20:19 libcrypt-2.3.2.so
lrwxrwxrwx 1 root root 17 05-11 20:19 libcrypt.so.1 -> libcrypt-2.3.2.so
lrwxrwxrwx 1 root root 13 05-11 20:19 libc.so.6 -> libc-2.3.2.so
-rwxr-xr-x 1 root root 15736 05-11 20:19 libdl-2.3.2.so
lrwxrwxrwx 1 root root 14 05-11 20:19 libdl.so.2 -> libdl-2.3.2.so
-rwxr-xr-x 1 root root 546854 05-11 20:19 libm-2.3.2.so
lrwxrwxrwx 1 root root 13 05-11 20:19 libm.so.6 -> libm-2.3.2.so
-rwxr-xr-x 1 root root 97975 05-11 20:19 libpthread-0.10.so
lrwxrwxrwx 1 root root 18 05-11 20:19 libpthread.so.0 -> libpthread-0.10.so
-rwxr-xr-x 1 root root 81495 05-11 20:19 libresolv-2.3.2.so
lrwxrwxrwx 1 root root 18 05-11 20:19 libresolv.so.2 -> libresolv-2.3.2.so
-rwxr-xr-x 1 root root 13689 05-11 20:19 libutil-2.3.2.so
lrwxrwxrwx 1 root root 16 05-11 20:19 libutil.so.1 -> libutil-2.3.2.so
drwxr-xr-x 2 root root 4096 05-11 11:23 modules
[root@localhost nfs]#
至此,一个基本的根文件系统(通过NFS挂载)构建完成。
完整的启动过程(u-boot、内核、文件系统)
编辑/etc/xinetd.d/tftp文件
[root@localhost Desktop]# gedit /etc/xinetd.d/tftp
tftp文件内容如下:
1 # default: off
2 # description: The tftp server serves files using the trivial file transfer \
3 # protocol. The tftp protocol is often used to boot diskless \
4 # workstations, download configuration files to network-aware printers, \
5 # and to start the installation process for some operating systems.
6 service tftp
7 {
8 socket_type = dgram
9 protocol = udp
10 wait = yes
11 user = root
12 server = /usr/sbin/in.tftpd
13 server_args = -s /tftpboot
14 disable = no
15 per_source = 11
16 cps = 100 2
17 flags = IPv4
18 }
重启tftp服务器
[root@localhost opt]# service xinetd restart
停止 xinetd: [确定]
启动 xinetd: [确定]
编辑/etc/exports文件
[root@localhost Desktop]# gedit /etc/exports
exports文件内容如下:
/tmp/nfs *(rw,sync,no_root_squash)
重启NFS服务器
[root@localhost u-boot-1.1.4]# service nfs restart
关闭 NFS mountd: [确定]
关闭 NFS 守护进程: [确定]
关闭 NFS quotas: [确定]
关闭 NFS 服务: [确定]
启动 NFS 服务: [确定]
关掉 NFS 配额: [确定]
启动 NFS 守护进程: [确定]
启动 NFS mountd: [确定]
[root@localhost u-boot-1.1.4]# exportfs
/tmp/nfs
[root@localhost u-boot-1.1.4]# exportfs -ra
完整的启动过程(u-boot、内核、文件系统、用户程序),使用NFS文件系统
**************************** WARNING **********************************
If you want to run ELF image, you should use -e option to indicate
your elf-format image filename. Or you only want to run binary image,
you need to set the filename of the image and its entry in skyeye.conf.
***********************************************************************
…… //部分启动信息省略
Hit any key to stop autoboot: 0
OK2410 # run bootcmd
TFTP from server 10.0.0.1; our IP address is 10.0.0.110
Filename 'uImage'.
Load address: 0x31000000
Loading: checksum bad
checksum bad
#################################################################
#################################################################
#################################################################
################################
done
Bytes transferred = 1161416 (11b8c8 hex)
## Booting image at 31000000 ...
Image Name: linux-2.6.14.7
Created: 2009-05-24 11:22:39 UTC
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 1161352 Bytes = 1.1 MB
Load Address: 30008000
Entry Point: 30008000
Verifying Checksum ... OK
OK
Starting kernel ...
Uncompressing Linux.......................................................................... done, booting the kernel.
Linux version 2.6.14.7 (root@localhost.localdomain) (gcc version 3.4.1) #6 Sun May 24 19:22:08 CST 2009
CPU: ARM920Tid(wb) [41009200] revision 0 (ARMvundefined/unknown)
Machine: SMDK2410
Memory policy: ECC disabled, Data cache writeback
CPU S3C2410 (id 0x32410000)
S3C2410: core 202.800 MHz, memory 101.400 MHz, peripheral 50.700 MHz
S3C2410 Clocks, (c) 2004 Simtec Electronics
CLOCK: Slow mode (1.500 MHz), fast, MPLL on, UPLL on
CPU0: D VIVT write-back cache
CPU0: I cache: 16384 bytes, associativity 64, 32 byte lines, 8 sets
CPU0: D cache: 16384 bytes, associativity 64, 32 byte lines, 8 sets
Built 1 zonelists
Kernel command line: noinitrd root=/dev/nfs rw nfsroot=10.0.0.1:/tmp/nfs ip=10.0.0.110:10.0.0.1:10.0.0.1:255.255.255.0 init=linuxrc console=ttySAC0,115200 mem=64M
…… //部分启动信息省略
Memory: 64MB = 64MB total
Memory: 62464KB available (1888K code, 393K data, 92K init)
…… //部分启动信息省略
JFFS version 1.0, (C) 1999, 2000 Axis Communications AB
JFFS2 version 2.2. (NAND) (C) 2001-2003 Red Hat, Inc.
yaffs May 24 2009 19:21:42 Installing.
Console: switching to colour frame buffer device 80x25
fb0: Virtual frame buffer device, using 1024K of video memory
…… //部分启动信息省略
RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize
Cirrus Logic CS8900A driver for Linux (Modified for SMDK2410)
eth0: CS8900A rev D at 0xe0000300 irq=53, no eeprom , addr: 08: 0:3E:26:0A:5B
S3C24XX NAND Driver, (c) 2004 Simtec Electronics
s3c2410-nand: mapped registers at c4980000
s3c2410-nand: timing: Tacls 10ns, Twrph0 30ns, Twrph1 10ns
NAND device: Manufacturer ID: 0xec, Chip ID: 0x76 (Samsung NAND 64MiB 3,3V 8-bit)
NAND_ECC_NONE selected by board driver. This is not recommended !!
Scanning device for bad blocks
Bad eraseblock 7 at 0x0001c000
Creating 4 MTD partitions on "NAND 64MiB 3,3V 8-bit":
0x00000000-0x00100000 : "bootloader"
0x00100000-0x00400000 : "kernel"
0x00400000-0x02c00000 : "root"
0x02d00000-0x03c00000 : "user"
mice: PS/2 mouse device common for all mice
NET: Registered protocol family 2
…… //部分启动信息省略
IP-Config: Complete:
device=eth0, addr=10.0.0.110, mask=255.255.255.0, gw=10.0.0.1,
host=10.0.0.110, domain=, nis-domain=(none),
bootserver=10.0.0.1, rootserver=10.0.0.1, rootpath=
Looking up port of RPC 100003/2 on 10.0.0.1
Looking up port of RPC 100005/1 on 10.0.0.1
VFS: Mounted root (nfs filesystem).
Mounted devfs on /dev
Freeing init memory: 92K
#mount all.......
******************************************************************
OK 2410 Rootfs made by liminmin, 2011.5.16
******************************************************************
liminmin login: root
login[25]: root login on 'console'
Processing /etc/profile... Set search library path in /etc/profile
Set user path in /etc/profile
Configure net done
All Done
[root@liminmin /root]# printenv
USER=root
LD_LIBRARY_PATH=/lib:/usr/lib
HOME=/root
PS1=[\u@\h \W]\$
LOGNAME=root
TERM=vt102
PATH=/bin:/sbin:/usr/bin:/usr/sbin
HISTSIZE=100
SHELL=/bin/sh
PWD=/root
[root@liminmin /root]# ifconfig
eth0 Link encap:Ethernet HWaddr 08:00:3E:26:0A:5B
inet addr:10.0.0.110 Bcast:10.0.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1826 errors:0 dropped:0 overruns:0 frame:0
TX packets:730 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:2386884 (2.2 MiB) TX bytes:116644 (113.9 KiB)
Interrupt:53 Base address:0x300
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
[root@liminmin /root]# ping -c 2 10.0.0.1
PING 10.0.0.1 (10.0.0.1): 56 data bytes
64 bytes from 10.0.0.1: seq=0 ttl=64 time=0.034 ms
64 bytes from 10.0.0.1: seq=1 ttl=64 time=0.021 ms
--- 10.0.0.1 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.021/0.027/0.034 ms
[root@liminmin /root]# ll
-rwxr-xr-x 1 root root 8044 May 14 2009 test //该文件在宿主机通过交叉编译器编译
-rw-r--r-- 1 root root 284 May 14 2009 test.c //该文件在宿主机编辑
[root@liminmin /root]# ./test
===== main =====
Hello world!
argv[0]=./test
==== exit main ====
[root@liminmin /root]# ./test as sdfasdf asdfasf
===== main =====
Hello world!
argv[0]=./test
argv[1]=as
argv[2]=sdfasdf
argv[3]=asdfasf
==== exit main ====
[root@liminmin /root]# less test.c //查看文件内容
#include
#include
int main (int argc,char* argv[])
{
int i;
printf("===== main =====\n");
printf ("Hello world!\n");
for(i=0;i
{
printf("argv[%d]=%s\n",i,argv[i]);
}
printf("==== exit main ====\n");
return 0;
}
[root@liminmin /root]#
完整的启动过程(u-boot、内核、文件系统),使用/dev/mtdblock2中的文件系统创建cramfs文件系统
[root@localhost tmp]# pwd
/tmp
[root@localhost tmp]# mkfs.cramfs nfs ok2410.cramfs
[root@localhost tmp]# ll ok2410.cramfs
-rw-r--r-- 1 root root 2199552 05-13 08:18 ok2410.cramfs
复制ok2410.cramfs到tftp服务器根目录
[root@localhost tmp]# cp ok2410.cramfs /tftpboot/
执行skyeye1.2.6,启动系统
[root@localhost u-boot-1.1.4]# pwd
/root/Desktop/u-boot-1.1.4
[root@localhost u-boot-1.1.4]# skyeye1.2.6
**************************** WARNING **********************************
If you want to run ELF image, you should use -e option to indicate
your elf-format image filename. Or you only want to run binary image,
you need to set the filename of the image and its entry in skyeye.conf.
***********************************************************************
…… //部分启动信息省略
Hit any key to stop autoboot: 0
OK2410 # tftp 0x31000000 ok2410.cramfs
TFTP from server 10.0.0.1; our IP address is 10.0.0.110
Filename 'ok2410.cramfs'.
Load address: 0x31000000
Loading: checksum bad
############checksum bad
#####################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#######################################
done
Bytes transferred = 2195456 (218000 hex)
OK2410 # nand erase 400000 300000
NAND erase: device 0 offset 4194304, size 3145728 ... OK
OK2410 # nand write 31000000 400000 0x218000
NAND write: device 0 offset 4194304, size 2195456 ... 2195456 bytes written: OK
OK2410 # setenv bootargs noinitrd mem=64M root=/dev/mtdblock2 init=/linuxrc console=ttySAC0,115200
OK2410 # run bootcmd
…… //启动信息省略
错误:按照书上说的去做,基本上不会出错,如果出错,一定是因为自己粗心大意。多做几遍,熟能生巧!
http://blog.chinaunix.net/space.php?uid=14735472&do=blog&id=110947