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
// 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 -
正在阅读:
linux2.6.26在FS2410上的移植含错误解决方法,很实用10-30
善待身边人11-03
父亲节微信创意祝贺词大全-导游词模板12-30
化妆师的发展前景、收入怎么样?03-12
9760使用说明书11-13
第五周法律诊所教学案例11-21
转院知情同意书08-24
化妆师前景职业道德 文档04-06
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 移植
- 错误
- 实用
- 解决
- 方法
- FS2410
- linux
- 2.6
- 26
- win8.1下载地址及安装密钥
- 2020年青岛版小学科学六年级上册《病毒》教学设计精品版
- xx县20XX年度安全生产行政执法工作总结及20XX工作思路
- 中国转向助力泵市场规模份额及行业前景调查分析报告2018年目录
- 必须这样推荐历史书目
- 常见设计美学—太极图赏析
- 教你摆Pose和选取拍摄角度 - 图文
- 传热试卷 - 图文
- 北航计算机控制系统实验报告 - 图文
- OPC DCOM配置过程中常见问题及其处理
- Matlab-Simulink各模块对应的中文名称及介绍 - 图文
- 清江大桥总体施工组织设计 - 图文
- 2010年迎新晚会策划
- 中秋节户外活动策划方案
- 22销售管理-物流与供应链管理-真题1
- 资料分析十大速算技巧及练习
- 中考古诗鉴赏专题复习教学反思
- 美学原理作业题汇总
- 江苏省青年公益项目大赛申报书 - 南理工常青藤支教队
- 纺纱学复习要点