linux2.6.26在FS2410上的移植含错误解决方法,很实用

更新时间:2023-10-30 09:10:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

1.内核的移植

kernel:2.6.26

gcc:arm-linux-gcc (gcc 3.4.1) cpu:s3c2410

1. 1 编译设置

使用arm-linux-交叉编译工具链 修改根目录下Makefile ARCH ?= arm

CROSS_COMPILE ?=arm-linux-

1.2nand分区(FS2410分区见附录)

修改arch/arm/plat-s3c24xx/common-smdk2410.c,找到相关代码做如下修改 static struct mtd_partition smdk_default_nand_part[] = { /* [0] = { .name = \ .size = SZ_16K, .offset = 0, }, [1] = { .name = \ .offset = 0, .size = SZ_2M, }, [2] = { .name = \ .offset = SZ_4M, .size = SZ_4M, }, [3] = { .name = \ .offset = SZ_8M, .size = SZ_2M, }, [4] = { .name = \ .offset = SZ_1M * 10, .size = SZ_4M, }, [5] = { .name = \

- 1 -

.offset = SZ_1M * 14, .size = SZ_1M * 10, }, [6] = { .name = \ .offset = SZ_1M * 24, .size = SZ_1M * 24, }, [7] = { .name = \ .offset = SZ_1M * 48, .size = SZ_16M, }*/

我的分区是采用下面的蓝色的分区

/* start:for harbour */ [0] = { name: \ size: 0x00100000, offset: 0x0, }, [1] = { name: \ size: 0x00300000, offset: 0x00100000, }, [2] = { name: \ size: 0x02800000, offset: 0x00400000, }, [3] = { name: \ size: 0x00f00000, offset: 0x02d00000, } };

/* end: for harbour */

static struct s3c2410_nand_set smdk_nand_sets[] = { [0] = { .name = \ .nr_chips = 1, .nr_partitions = ARRAY_SIZE(smdk_default_nand_part), .partitions = smdk_default_nand_part, }, };

- 2 -

static struct s3c2410_platform_nand smdk_nand_info = { .tacls = 0, .twrph0 = 30, .twrph1 = 0,

.nr_sets = ARRAY_SIZE(smdk_nand_sets), .sets = smdk_nand_sets, };

1.3 禁止 Flash ECC校验

我们的内核都是通过UBOOT 写到Nand Flash 的, UBOOT 通过的软件ECC 算法产生ECC 校验码, 这与内核校验的ECC 码不一样, 内核中的ECC 码是由S3C2410 中Nand Flash 控制器产生的. 所以, 我们在这里选择禁止 内核ECC 校验. 修改drivers/mtd/nand/s3c2410.c 文件:

[arm@localhost linux-2.6.14]$ vi drivers/mtd/nand/s3c2410.c 找到s3c2410_nand_init_chip()函数:

这里我把chip->eccmode = NAND_ECC_SOFT;改为 chip->eccmode = NAND_ECC_NONE; 保存,退出。

1.4 修改时钟频率

修改arch/arm/mach-s3c2410/mach-smdk2410.c文件中的内核时钟。 static void __init smdk2410_map_io(void) {

s3c24xx_init_io(smdk2410_iodesc, ARRAY_SIZE(smdk2410_iodesc));

s3c24xx_init_clocks(12000000); //这里为ARM晶振的频率,默认这里为0 s3c24xx_init_uarts(smdk2410_uartcfgs, ARRAY_SIZE(smdk2410_uartcfgs)); }

注:这一步很重要,不知道为什么很多介绍内核移植的文章没有提到这么重要的一点,我因为不知道有这一步,折腾了我好久。这里的数字为晶振的频率,根据实际的情况修改。

1.5 内核菜单配置make menuconfig

在配置内核前,先拷贝s3c2410的默认配置到内核根目录下,以简化配置过程。s3c2410的默认配置在arch/arm/configs/s3c2410_defconfig #pwd

- 3 -

/usr/local/arm/linux-2.6.22.2

# cp arch/arm/configs/s3c2410_defconfig .config # make menuconfig 修改

boot option

default command line

root=/dev/mtdblock2 init=linuxrc console=ttySAC0,115200

1.6 配置内核

在配置内核前,先拷贝s3c2410开发板的默认配置到内核根目录下,以简化配置过程。 #pwd

/home/li/working/kernel/linux-2.6.31.5

# cp arch/arm/configs/s3c2410_defconfig .config # make menuconfig

以下是在 s3c2410_defconfig 基础上要配置的选项 General setup --->

[*] Configure standard kernel features (for small systems) --->

选上这项,否则文件系统中的一些选项不会出现

System Type --->

S3C2410 Machines --->

[*] SMDK2410/A9M2410 留下这项就够了,其他全部“N”掉

“N”掉 S3C2412 Machines ---> 、 S3C2440 Machines ---> 和 S3C2443 Machines ---> 里的所有选项,都是和2410无关的选项。 Boot options --->

将 (root=/dev/hda1 ro init=/bin/bash console=ttySAC0) Default kernel command string

改成 (noinitrd root=/dev/nfs rw nfsroot=192.168.1.55:/nfs-rootfs ip=dhcp console=ttySAC0,115200 init=/linuxrc) Default kernel command string #说明:

#mtdblock4代表第5个flash分区,用来作根文件系统rootfs;

# console=ttySAC0,115200使kernel启动期间的信息全部输出到串口0上,波特率为115200; # 2.6内核对于串口的命名改为ttySAC0,但这不影响用户空间的串口编程。 # 用户空间的串口编程针对的仍是/dev/ttyS0等

# mem=64M表示内存是64M,如果是32则设为32M

- 4 -

在实践中,我发现“rootfstype=cramfs”这句还是挺重要的。如果没有这句,系统启动时即使分区挂载正确了,但是文件系统的类型有可能出错。在这里定义过,就不会出错了。这里的选项也和根文件系统的配置有关。(我先使用cramfs做跟文件系统,以后再换JFFS2或是YAFFS)

Userspace binary formats --->

< > Kernel support for a.out and ECOFF binaries (去除该选项,a.out和ECOFF是两种可执行文件的格式,在ARM-Linux下一般都用ELF,所以这两种基本用不上。) Networking --->

Networking options ---> <*> Packet socket

[*] Packet socket: mmapped IO

Device Drivers --->

“N”掉 Parallel port support ---> 里的所有选项。

Plug and Play support --->里的所有选项一定要“N”掉,不然编译会出错!!!!!!!! Network device support --->

Ethernet (10 or 100Mbit) --->

“N”掉< > DM9000 support和< > Generic Media Independent Interface device support

“N”掉 [ ] Ethernet (1000 Mbit) --->和 [ ] Ethernet (10000 Mbit) ---> USB Network Adapters --->

<*> Multi-purpose USB Networking Framework <*> MMC/SD/SDIO card support ---> Real Time Clock --->

“N”掉 [ ] Set system time from RTC on startup and resume 运行

#make bzImage

此时的内核就可在板上跑通了。

说明一下:

在这里遇到一个问题,就是bootm 启动内核的时候,

OK

Starting kernel ... 这一步启动好慢,大概花掉了10分钟左右的时间,刚开始的时候以为死掉了,所

以我的板子没关电源,就这样让他开着,结果过了一阵子居然启动了。 Linux version 2.6.26 (root@solylee-virtual-machine) (gcc version 3.4.1) #24 F1

CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0007177 Machine: SMDK2410 Memory policy: ECC disabled, Data cache writeback CPU S3C2410A (id 0x32410002)

- 5 -

解决方法:

去掉Kernel hacking->Kernel low-level debugging functions

2 CS8900a网卡驱动移植

2.1 内核linux-2.6.26.2并不能正常驱动开发板采用的CS8900A网卡,我们需要对其做一些修改才行,具体修改步骤如下所示:

添加linux-2.6.26.2/include/asm/arch/smdk2410.h文件,内容如清单30所示。 清单30 smdk2410.h文件内容

-------------------------------------------------------------------------------- #ifndef _INCLUDE_SMDK2410_H_

#define _INCLUDE_SMDK2410_H_

#include

#define pSMDK2410_ETH_IO __phys_to_pfn(0x19000000) #define vSMDK2410_ETH_IO 0xE0000000 #define SMDK2410_ETH_IRQ IRQ_EINT9

#endif // _INCLUDE_SMDK2410_H_

--------------------------------------------------------------------------------

2.2 在linux-2.6.26.2/arch/arm/mach-s3c2410/mach-smdk2410.c文件中添加清单31所示内容。

清单31 在mach-smdk2410.c文件中添加的内容 #include \

static struct map_desc smdk2410_iodesc[] __initdata = {

{vSMDK2410_ETH_IO, pSMDK2410_ETH_IO, SZ_1M, MT_DEVICE} /* Add this line */ /* nothing here yet */ };

修改linux-2.6.26.2/drivers/net/cs8900a.c文件,主要是2.6.26内核字符设备注册的兼容问题与头文件的变动。同时在函数int __init cs8900a_probe (struct net_device *dev)的memset (&priv,0,sizeof (cs8900_t));语句下添加:

__raw_writel(0x2211d110,S3C2410_BWSCON); __raw_writel(0x1f7c,S3C2410_BANKCON3); 这两行源代码。具体修改内容参见附录一。 清单32 cs8900a.c文件的内容 /*

- 6 -

* linux/drivers/net/cs8900.c *

* Author: Abraham van der Merwe *

* A Cirrus Logic CS8900A driver for Linux

* based on the cs89x0 driver written by Russell Nelson, * Donald Becker, and others. *

* This source code is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. *

* History:

* 22-May-2002 Initial version (Abraham vd Merwe)

* 30-May-2002 Added char device support for eeprom (Frank Becker) * 24-Jan-2004 Fixups for 2.6 (Frank Becker)

* 15-July-2004 Modified for SMDK2410 (Roc Wu pwu at jadechip.com) */

#define VERSION_STRING \

/*

* At the moment the driver does not support memory mode operation. * It is trivial to implement this, but not worth the effort. */ /*

* TODO: *

* 1. Sort out ethernet checksum

* 2. If !ready in send_start(), queue buffer and send it in interrupt handler * when we receive a BufEvent with Rdy4Tx, send it again. dangerous! * 3. how do we prevent interrupt handler destroying integrity of get_stats()? * 4. Change reset code to check status.

* 5. Implement set_mac_address and remove fake mac address * 7. Link status detection stuff

* 8. Write utility to write EEPROM, do self testing, etc.

* 9. Implement DMA routines (I need a board w/ DMA support for that) * 10. Power management

* 11. Add support for multiple ethernet chips */

- 7 -

// added BSt

#include

#include #include #include #include #include #include #include #include #include

#include #include

#include #include #include #include

// Added BSt

#include

#ifdef CONFIG_SA1100_CERF #include \#endif

#ifdef CONFIG_ARCH_SMDK2410 #include \#endif

#include \

//#define FULL_DUPLEX //#define DEBUG

typedef struct { struct net_device_stats stats; u16 txlen; int char_devnum;

- 8 -

spinlock_t lock;

} cs8900_t;

int cs8900_probe (struct net_device *dev); static struct net_device cs8900_dev = {

init: cs8900_probe }; /*

* There seems to be no way to determine the exact size of the eeprom, * so we use the largest size.

* FIXME: Verify it's safe to read/write past the end of a 64/128 * byte eeprom. *

* Possible eeprom sizes: * Cx46 - 64 bytes * Cx56 - 128 bytes * Cx66 - 256 bytes */

#define MAX_EEPROM_SIZE 256

static int cs8900_eeprom_fopen(struct inode *inode, struct file *file); static int cs8900_eeprom_frelease(struct inode *inode, struct file *file); static loff_t cs8900_eeprom_fllseek(struct file * file,loff_t offset, int flags);

static ssize_t cs8900_eeprom_fread(struct file *file, char *buf, size_t count, loff_t *f_pos);

static ssize_t cs8900_eeprom_fwrite(struct file *file, const char *buf, size_t count, loff_t *f_pos); static struct file_operations cs8900_eeprom_fops = { owner: THIS_MODULE,

open: cs8900_eeprom_fopen, release: cs8900_eeprom_frelease, llseek: cs8900_eeprom_fllseek, read: cs8900_eeprom_fread, write: cs8900_eeprom_fwrite, };

static u16 cs8900_eeprom_cache[MAX_EEPROM_SIZE/2]; /*

- 9 -

* I/O routines */

static inline u16 cs8900_read (struct net_device *dev,u16 reg) { outw (reg,dev->base_addr + PP_Address); return (inw (dev->base_addr + PP_Data)); }

static inline void cs8900_write (struct net_device *dev,u16 reg,u16 value) { outw (reg,dev->base_addr + PP_Address); outw (value,dev->base_addr + PP_Data); }

static inline void cs8900_set (struct net_device *dev,u16 reg,u16 value) { cs8900_write (dev,reg,cs8900_read (dev,reg) | value); }

static inline void cs8900_clear (struct net_device *dev,u16 reg,u16 value)

{ cs8900_write (dev,reg,cs8900_read (dev,reg) & ~value); }

static inline void cs8900_frame_read (struct net_device *dev,struct sk_buff *skb,u16 length) { insw (dev->base_addr,skb_put (skb,length),(length + 1) / 2); }

static inline void cs8900_frame_write (struct net_device *dev,struct sk_buff *skb) { outsw (dev->base_addr,skb->data,(skb->len + 1) / 2); } /*

* EEPROM I/O routines */

static int cs8900_eeprom_wait (struct net_device *dev)

- 10 -

dump_packet (dev,skb,\#endif /* #ifdef FULL_DUPLEX */ }

skb->protocol = eth_type_trans (skb,dev); netif_rx (skb);

dev->last_rx = jiffies; priv->stats.rx_packets++;

priv->stats.rx_bytes += length;

static int cs8900_send_start (struct sk_buff *skb,struct net_device *dev) { cs8900_t *priv = (cs8900_t *) dev->priv; u16 status; spin_lock_irq(&priv->lock); netif_stop_queue (dev); cs8900_write (dev,PP_TxCMD,TxStart (After5));

cs8900_write (dev,PP_TxLength,skb->len); status = cs8900_read (dev,PP_BusST);

if ((status & TxBidErr)) { spin_unlock_irq(&priv->lock); printk (KERN_WARNING \ priv->stats.tx_errors++; priv->stats.tx_aborted_errors++; priv->txlen = 0; }

return (1);

if (!(status & Rdy4TxNOW)) { spin_unlock_irq(&priv->lock); printk (KERN_WARNING \ priv->stats.tx_errors++; priv->txlen = 0; /* FIXME: store skb and send it in interrupt handler */

- 16 -

}

return (1);

cs8900_frame_write (dev,skb); spin_unlock_irq(&priv->lock);

#ifdef DEBUG dump_packet (dev,skb,\#endif /* #ifdef DEBUG */ dev->trans_start = jiffies;

dev_kfree_skb (skb); priv->txlen = skb->len; return (0); }

static irqreturn_t cs8900_interrupt (int irq,void *id,struct pt_regs *regs) {

struct net_device *dev = (struct net_device *) id; cs8900_t *priv; volatile u16 status; irqreturn_t handled = 0;

if (dev->priv == NULL) { printk (KERN_WARNING \ return 0; }

priv = (cs8900_t *) dev->priv;

while ((status = cs8900_read (dev, PP_ISQ))) { handled = 1;

switch (RegNum (status)) { case RxEvent: cs8900_receive (dev); break;

- 17 -

case TxEvent:

priv->stats.collisions += ColCount (cs8900_read (dev,PP_TxCOL)); if (!(RegContent (status) & TxOK)) { priv->stats.tx_errors++;

if ((RegContent (status) & Out_of_window)) priv->stats.tx_window_errors++; if ((RegContent (status) & Jabber)) priv->stats.tx_aborted_errors++; break;

} else if (priv->txlen) {

priv->stats.tx_packets++;

priv->stats.tx_bytes += priv->txlen; }

priv->txlen = 0;

netif_wake_queue (dev); break;

case BufEvent: if ((RegContent (status) & RxMiss)) { u16 missed = MissCount (cs8900_read (dev,PP_RxMISS)); priv->stats.rx_errors += missed; priv->stats.rx_missed_errors += missed;

}

if ((RegContent (status) & TxUnderrun)) { priv->stats.tx_errors++; priv->stats.tx_fifo_errors++;

priv->txlen = 0;

netif_wake_queue (dev); }

/* FIXME: if Rdy4Tx, transmit last sent packet (if any) */ break;

case TxCOL: priv->stats.collisions += ColCount (cs8900_read (dev,PP_TxCOL)); break; case RxMISS: status = MissCount (cs8900_read (dev,PP_RxMISS)); priv->stats.rx_errors += status; priv->stats.rx_missed_errors += status;

- 18 -

}

break;

} return IRQ_RETVAL(handled); }

static void cs8900_transmit_timeout (struct net_device *dev) { cs8900_t *priv = (cs8900_t *) dev->priv; priv->stats.tx_errors++; priv->stats.tx_heartbeat_errors++; priv->txlen = 0; netif_wake_queue (dev); }

static int cs8900_start (struct net_device *dev) { int result;

#if defined(CONFIG_ARCH_SMDK2410) set_irq_type(dev->irq, IRQT_RISING);

/* enable the ethernet controller */ cs8900_set (dev,PP_RxCFG,RxOKiE | BufferCRC | CRCerroriE | RuntiE | ExtradataiE); cs8900_set (dev,PP_RxCTL,RxOKA | IndividualA | BroadcastA); cs8900_set (dev,PP_TxCFG,TxOKiE | Out_of_windowiE | JabberiE); cs8900_set (dev,PP_BufCFG,Rdy4TxiE | RxMissiE | TxUnderruniE | TxColOvfiE | MissOvfloiE); cs8900_set (dev,PP_LineCTL,SerRxON | SerTxON); cs8900_set (dev,PP_BusCTL,EnableRQ);

#ifdef FULL_DUPLEX

cs8900_set (dev,PP_TestCTL,FDX); #endif /* #ifdef FULL_DUPLEX */ udelay(200); /* install interrupt handler */ if ((result = request_irq (dev->irq, &cs8900_interrupt, 0, dev->name, dev)) < 0) { printk (\ return (result); } #else

- 19 -

/* install interrupt handler */

if ((result = request_irq (dev->irq, &cs8900_interrupt, 0, dev->name, dev)) < 0) { printk (\ return (result); }

set_irq_type(dev->irq, IRQT_RISING);

/* enable the ethernet controller */

cs8900_set (dev,PP_RxCFG,RxOKiE | BufferCRC | CRCerroriE | RuntiE | ExtradataiE); cs8900_set (dev,PP_RxCTL,RxOKA | IndividualA | BroadcastA);

cs8900_set (dev,PP_TxCFG,TxOKiE | Out_of_windowiE | JabberiE); cs8900_set (dev,PP_BufCFG,Rdy4TxiE | RxMissiE | TxUnderruniE | TxColOvfiE | MissOvfloiE); cs8900_set (dev,PP_LineCTL,SerRxON | SerTxON); cs8900_set (dev,PP_BusCTL,EnableRQ);

#ifdef FULL_DUPLEX cs8900_set (dev,PP_TestCTL,FDX); #endif /* #ifdef FULL_DUPLEX */ #endif /* #if defined(CONFIG_ARCH_SMDK2410) */ /* start the queue */ netif_start_queue (dev); return (0); }

static int cs8900_stop (struct net_device *dev) {

/* disable ethernet controller */ cs8900_write (dev,PP_BusCTL,0); cs8900_write (dev,PP_TestCTL,0); cs8900_write (dev,PP_SelfCTL,0); cs8900_write (dev,PP_LineCTL,0); cs8900_write (dev,PP_BufCFG,0); cs8900_write (dev,PP_TxCFG,0); cs8900_write (dev,PP_RxCTL,0); cs8900_write (dev,PP_RxCFG,0);

- 20 -

noinitrd root=/dev/nfs rw nfsroot=192.168.1.55:/arm-linux/rootfs/nfs-rootfs ip=dhcp console=ttySAC0,115200 init=/linuxrc

清单47 内核网络选项配置 Networking --->

[*] Networking support Networking options --->

[*] IP: kernel level autoconfiguration [*] IP: DHCP support [*] IP: BOOTP support [*] IP: RARP support 清单48 内核文件系统配置 File systems --->

[*] Network File Systems ---> --- Network File Systems

<*> NFS file system support

[*] Provide NFSv3 client support

[ ] Provide client support for the NFSv3 ACL protocol exten [ ] Provide NFSv4 client support (EXPERIMENTAL) < > NFS server support [*] Root file system on NFS

5.2 NFS测试

把NFS文件/arm-linux/rootfs/nfs-rootfs做为根文件系统启动内核,查看运行信息。测试结果如清单49所示,测试表明NFS根文件系统制作成功。 清单49 NFS根文件系统的启动结果 ...

Sending DHCP requests ., OK

IP-Config: Got DHCP answer from 0.0.0.0, my address is 135.1.2.150 IP-Config: Complete:

device=eth0, addr=135.1.2.150, mask=255.255.255.0, gw=255.255.255.255, host=135.1.2.150, domain=, nis-domain=(none),

bootserver=0.0.0.0, rootserver=135.1.2.192, rootpath=/arm-linux/rootfs/nfs-rootfs Looking up port of RPC 100003/2 on 135.1.2.192 Looking up port of RPC 100005/1 on 135.1.2.192 VFS: Mounted root (nfs filesystem). Freeing init memory: 144K

init started: BusyBox v1.9.0 (2008-09-17 11:51:15 CST) starting pid 810, tty '': '/etc/init.d/rcS' Processing /etc/init.d/rcS...... mount all

- 46 -

Starting mdev...... YF2410 Rootfs(nfs)

Enjoy Linux......

starting pid 814, tty '': '/bin/login' 135.1.2.150 login: root Password: <12345678>

login[814]: root login on `console' Processing /etc/profile......

Set search library path in /etc/profile Set user path in /etc/profile Set PS1 in /etc/profile Done

[root@/root]#cd / [root@/]#ls

bin dev home linuxrc proc sbin tmp var boot etc lib mnt root sys usr [root@/]#cd /home [root@/home]#ls

[root@/home]#vi testfile [root@/home]#ls testfile

[root@/home]#cat testfile This a test file!

把/etc/inittab文件中的::respawn:-/bin/login 语句修改为::respawn:-/bin/sh语句可以不用登录即可直接进入shell,测试结果如清单50。

清单50 不用登录即可直接进入shell

-------------------------------------------------------------------------------- …

VFS: Mounted root (nfs filesystem). Freeing init memory: 144K

init started: BusyBox v1.9.0 (2008-09-17 11:51:15 CST) starting pid 810, tty '': '/etc/init.d/rcS' Processing /etc/init.d/rcS...... mount all

Starting mdev...... YF2410 Rootfs(nfs) Enjoy Linux......

starting pid 814, tty '': '/bin/sh' Processing /etc/profile......

- 47 -

Set search library path in /etc/profile Set user path in /etc/profile

Set PS1 in /etc/profile Done

[root@/]#ls

bin dev home linuxrc proc sbin tmp var boot etc lib mnt root sys usr

--------------------------------------------------------------------------------

提示:挂载根文件时,提示“Warning: unable to open an initial console. ”启动信息问题的解决,以NFS为例。

清单51 问题现象

-------------------------------------------------------------------------------- …

VFS: Mounted root (nfs filesystem). Freeing init memory: 144K

Warning: unable to open an initial console.<启动停到此处>

-------------------------------------------------------------------------------- 根据提示信息定位错误

查找错误原因: 根据错误提示信息:”Warning: unable to open an initial console.”查看内核源代码。可定位错误提示在内核文件linux-2.6.26.2/init/main.c文件中。 清单52 分析main.c的调用关系

-------------------------------------------------------------------------------- asmlinkage void __init start_kernel(void) { …

rest_init(); }

static void noinline __init_refok rest_init(void) __releases(kernel_lock)

{ …

kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND); … }

static int __init kernel_init(void * unused) { …

- 48 -

init_post(); return 0;

}

static int noinline init_post(void) { …

if (sys_open((const char __user *) \

printk(KERN_WARNING \…

run_init_process(\…

}

--------------------------------------------------------------------------------

通过分析知道内核启动时需要成功打开/dev/console设备,否则给出\console.\的错误提示。

检查nfs根文件系统的/dev目录<在Host上的nfs文件/arm-linux/rootfs/nfs-rootfs /dev中>是否包含console设备文件。具体修改参见清单53。 清单53 修改NFS设备文件 [root@lxf dev]# pwd

/arm-linux/rootfs/nfs-rootfs/dev

[root@lxf dev]# ls

//无console设备文件节点,参考主机配置给NFS添加console设备文件节点 [root@lxf dev]# ls -l /dev|grep console

crw------- 1 root root 5, 1 09-05 08:06 console //为目标机配置console设备文件节点 [root@lxf dev]# mknod console c 5 1 [root@lxf dev]# mknod null c 1 3 //查看配置结果 [root@lxf dev]# ls -l 总计 0

crw------- 1 root root 5, 1 09-17 11:38 console crw-rw-rw- 1 root root 1, 3 09-17 11:38 null NFS根文件系统的启动结果表明修改正确。 清单54 NFS测试结果

-------------------------------------------------------------------------------- ...

VFS: Mounted root (nfs filesystem). Freeing init memory: 144K

init started: BusyBox v1.9.0 (2008-09-17 11:51:15 CST)

- 49 -

starting pid 810, tty '': '/etc/init.d/rcS' Processing /etc/init.d/rcS...... mount all

Starting mdev...... YF2410 Rootfs(nfs) Enjoy Linux......

starting pid 814, tty '': '/bin/sh' Processing /etc/profile......

Set search library path in /etc/profile Set user path in /etc/profile Set PS1 in /etc/profile Done

[root@/]#ls

bin dev home linuxrc proc sbin tmp var boot etc lib mnt root sys usr

说明:我的启动信息如下:

FS2410 # tftp 30008000 zImage TFTP from server 192.168.1.55; our IP address is 192.168.1.3

Filename 'zImage'. Load address: 0x30008000 Loading: ################################################################# ######################################### done Bytes transferred = 1544896 (1792c0 hex)

FS2410 # go 30008000 ## Starting application at 0x30008000 ... Uncompressing Linux...........................................................

.......................................... done, booting the kernel.

[ 0.000000] in start_kernel,creat by Sorin [ 0.000000] Linux version 2.6.26 (root@solylee-virtual-machine) (gcc versio

n 3.4.1) #42 Sun May 8 12:27:25 CST 2011 [ 0.000000] CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0007177 [ 0.000000] Machine: SMDK2410 [ 0.000000] Warning: bad configuration page, trying to continue [ 0.000000] Memory policy: ECC disabled, Data cache writeback

[ 0.000000] CPU S3C2410A (id 0x32410002) [ 0.000000] S3C2410: core 200.000 MHz, memory 100.000 MHz, peripheral 50.00

0 MHz [ 0.000000] S3C24XX Clocks, (c) 2004 Simtec Electronics [ 0.000000] CLOCK: Slow mode (1.500 MHz), fast, MPLL on, UPLL on [ 0.000000] CPU0: D VIVT write-back cache [ 0.000000] CPU0: I cache: 16384 bytes, associativity 64, 32 byte lines, 8

sets

- 50 -

本文来源:https://www.bwwdw.com/article/yaj2.html

Top