ramdisk是一种基于内存的虚拟文件系统(并非一个实际的文件系统),它将一部分固定大小(这个大小在编译内核的make menuconfig时配置)的内存当作硬盘一个分区来使用。ramdisk是一种将实际的文件系统装入内存的机制,并且可以作为根文件系统,通常我们会使用ext2或ext3文件系统来格式化它。由于ramdisk是在内存中进行操作的,所以我们可以对里面的文件进行添加,修改,删除等等操作,但是一掉电,就什么也没有了。由于这个特性,我们可以将一些经常被访问而又不会更改的文件(如只读的根文件系统)通过Ramdisk放在内存中,这样可以明显地提高系统的性能。
在Linux的启动阶段,内核和ramdisk都是由 bootloader在启动时加载至内存的指定位置(),而initrd提供了一套机制,可以将内核映像和根文件系统一起载入内存。initrd 是boot loader initialized RAM disk,顾名思义是在系统初始化引导时候用的ramdisk,它的作用是完善内核的模块机制,让内核的初始化流程更具弹性。
1、在内核中为256M的nandflash进行分区,修改文件arch/arm/plat-s3c24xx/common-smdk.c 中第109行开始处的代码如下:
/* NAND parititon from 2.4.18-swl5,modify by guowenxue 2011.08.30, K9F2G08,256MiB */
static struct mtd_partitionsmdk_default_nand_part[] = {
[0] = {
.name = "mtdblock0 u-boot 1MB",
.size = SZ_1M*1,
.offset = 0,
},
[1] = {
.name = "mtdblock1 kernel 4MB",
.offset = MTDPART_OFS_NXTBLK,
.size = SZ_1M*4,
},
[2] = {
.name = "mtdblock2 ramdisk10MB",
.offset = MTDPART_OFS_NXTBLK,
.size = SZ_1M*10,
},
[3] = {
.name = "mtdblock3 cramfs 15MB",
.offset = MTDPART_OFS_NXTBLK,
.size = SZ_1M*15,
},
[4] = {
.name = "mtdblock4 jffs2 40MB",
.offset = MTDPART_OFS_NXTBLK,
.size = SZ_1M*40,
},
[5] = {
.name = "mtdblock5 yaffs2 40MB",
.offset = MTDPART_OFS_NXTBLK,
.size = SZ_1M*40,
},
[6] = {
.name = "mtdblock6 ubifs 40MB",
.offset = MTDPART_OFS_NXTBLK,
.size = SZ_1M*40,
},
[7] = {
.name = "mtdblock7 info 1MB",
.offset = MTDPART_OFS_NXTBLK,
.size = SZ_1M*1,
},
[8] = {
.name = "mtdblock8 apps 40MB",
.offset = MTDPART_OFS_NXTBLK,
.size = SZ_1M*40,
},
[9] = {
.name = "mtdblock9 data 40MB",
.offset = MTDPART_OFS_NXTBLK,
.size = SZ_1M*40,
},
[10] = {
.name = "mtdblock10 backup25MB",
.offset = MTDPART_OFS_NXTBLK,
.size = MTDPART_SIZ_FULL,
}
};
下面是修改后的内核在开发板启动时打印的信息:
Creating 11 MTD partitions on "NAND":
0x000000000000-0x000000100000 : "mtdblock0 u-boot 1MB"
0x000000100000-0x000000500000 : "mtdblock1 kernel 4MB"
0x000000500000-0x000000f00000: "mtdblock2 ramdisk 10MB"
0x000000f00000-0x000001e00000: "mtdblock3 cramfs 15MB"
0x000001e00000-0x000004600000 : "mtdblock3 jffs2 40MB"
0x000004600000-0x000006e00000 : "mtdblock4 yaffs2 40MB"
0x000006e00000-0x000009600000 : "mtdblock5 ubifs 40MB"
0x000009600000-0x000009700000 : "mtdblock6 info 1MB"
0x000009700000-0x00000bf00000 : "mtdblock7 apps 40MB"
0x00000bf00000-0x00000e700000 : "mtdblock8 data 40MB"
0x00000e700000-0x000010000000 : "mtdblock9 backup 25MB"
我们现在重点关心mtdblock2这个分区,它将是我们存放ramdisk映像的地方。
修改内核:
[lingyun@localhostlinux-3.0]$ vt100
[lingyun@localhostlinux-3.0]$ make menuconfig
Generalsetup --->
[*] InitialRAM filesystem and RAM disk (initramfs/initrd) support
DeviceDrivers --->
[*] Block devices --->
<*> RAM block device support
(1) Default number of RAM disks
(16384)Default RAM disk size (kbytes)
编译内核:
[lingyun@localhostlinux-3.0]$ sudo make
[lingyun@localhostlinux-3.0]$ ls
arch crypto fs Kbuild MAINTAINERS modules.order REPORTING-BUGS sound usr
block Documentation include Kconfig Makefile Module.symvers samples System.map virt
COPYING drivers init kernel mm net scripts tools vmlinux
CREDITS firmware ipc lib modules.builtin README security uImage-s3c2440.gz vmlinux.o
[lingyun@localhostlinux-3.0]$ du -h uImage-s3c2440.gz
2.5M uImage-s3c2440.gz
[lingyun@localhostlinux-3.0]$ cp uImage-s3c2440.gz/tftp/yz_ramdisk.gz
制作镜像文件:
使用dd命令建立一个16MB的文件系统映像ramdisk. 以/dev/zero对其初始化.对于dd命令可以参考
http://www.cnblogs.com/dkblog/archive/2009/09/18/1980715.html
[lingyun@localhostyangzheng]$ ls
busybox-1.20.2 busybox-1.20.2.tar.bz2 linux-3.0 linux-3.0.tar.bz2 mkimage rootfs
[lingyun@localhostyangzheng]$ dd if=/dev/zero of=ramdisk bs=1Mcount=16
16+0 recordsin
16+0 recordsout
16777216 bytes(17 MB) copied, 0.01041 s, 1.6 GB/s
[lingyun@localhostyangzheng]$ ls
busybox-1.20.2 busybox-1.20.2.tar.bz2 linux-3.0 linux-3.0.tar.bz2 mkimage ramdisk rootfs
注:因为ramdisk只是一个块设备,只有将其格式化为特定的文件系统后才能使用,我们将其格式化ext2格式:
[lingyun@localhostyangzheng]$ mke2fs -F -v -m0 ramdisk
mke2fs 1.42.7(21-Jan-2013)
fs_types formke2fs.conf resolution: 'ext2', 'small'
Discardingdevice blocks: done
Discardsucceeded and will return 0s - skippinginode table wipe
Filesystemlabel=
OS type: Linux
Blocksize=1024 (log=0)
Fragmentsize=1024 (log=0)
Stride=0blocks, Stripe width=0 blocks
4096 inodes,16384 blocks
0 blocks(0.00%) reserved for the super user
First datablock=1
Maximumfilesystem blocks=16777216
2 block groups
8192 blocksper group, 8192 fragments per group
2048 inodesper group
Superblockbackups stored on blocks:
8193
Allocatinggroup tables: done
Writing inodetables: done
Writingsuperblocks and filesystem accounting information: done
[lingyun@localhostyangzheng]$ file ramdisk
ramdisk: Linuxrev 1.0 ext2 filesystem data
其中:
-F : 迫使mke2fs在ramdisk.image上运行, 否则, mke2fs会抱怨ramdisk.image不是块备.
-v : 以verbose模式运行
-m0 : 指定不必在文件系统上为"超级用户"保留任何block.(一般嵌入式Linux都是单用户系统).
挂载ramdisk,并拷贝制作好的根文件系统到mnt目录下:
[lingyun@localhostyangzheng]$ mkdir mnt
[lingyun@localhostyangzheng]$ ls
busybox-1.20.2 busybox-1.20.2.tar.bz2 linux-3.0 linux-3.0.tar.bz2 mkimage mnt ramdisk rootfs
[lingyun@localhostyangzheng]$ sudo mount -o loop ramdisk mnt/
[lingyun@localhostyangzheng]$ mount |grep ramdisk
/usr/local/src/lingyun/yangzheng/ramdiskon /usr/local/src/lingyun/yangzheng/mnt type ext2 (rw,loop=/dev/loop1)
[lingyun@localhostyangzheng]$ ls mnt/
lost+found
[lingyun@localhostyangzheng]$ rm -rf mnt/*
[lingyun@localhostyangzheng]$ ls mnt/
[lingyun@localhostyangzheng]$ sudo cp -af rootfs/* mnt/
[lingyun@localhostyangzheng]$ ls mnt/
apps bin data dev etc haha info init lib linuxrc mnt proc root sbin sys tmp usr var
卸载并压缩ramdisk根文件系统Image:
[lingyun@localhostyangzheng]$ sudo umount ramdisk
[lingyun@localhostyangzheng]$ du -h ramdisk
16M ramdisk
[lingyun@localhostyangzheng]$ gzip ramdisk
[lingyun@localhostyangzheng]$ ls
busybox-1.20.2 busybox-1.20.2.tar.bz2 linux-3.0 linux-3.0.tar.bz2 mkimage mnt ramdisk.gz rootfs
[lingyun@localhostyangzheng]$ du -h ramdisk.gz
5.8M ramdisk.gz
[lingyun@localhostyangzheng]$ cp ramdisk.gz /tftp/yz_ramdisk.gz
添加u-boot对ramdisk的支持:
[ s3c2440@ yangzheng ]# set bkr 'tftp30008000 yz_ramuImage-2440.gz;nand erase 100000 27dd40;nand write 30008000100000 27dd40'
[ s3c2440@ yangzheng ]# set brdfs 'tftp30008000 yz_ramdisk.gz;nand erase 500000 5b42c7;nandwrite 30008000 500000 5b42c7'
[ s3c2440@ yangzheng ]# set bootcmd_ramdisk'nand read 30008000 100000 27dd40;nand read 30800000 500000 5b42c7;bootm 30008000'
[ s3c2440@ yangzheng ]# set bootcmd 'run bootcmd_ramdisk'
[ s3c2440@ yangzheng ]#set bootargs'console=ttyS0,115200 mem=64Minitrd=0x30800000,16Mroot=/dev/ram0 rw loglevel=7'
[ s3c2440@ yangzheng ]# save
启动linux:
[ s3c2440@ yangzheng ]# run bkr
dm9000 i/o:0x20000300, id: 0x90000a46
DM9000:running in 16 bit mode
MAC:08:00:3e:26:0a:6b
could notestablish link
operating at 100M full duplex mode
Using dm9000device
TFTP fromserver 192.168.1.3; our IP address is 192.168.1.244
Filename'yz_ramuImage-2440.gz'.
Load address:0x30008000
Loading: T#################################################################
#################################################################
################################################
done
Bytestransferred = 2612544 (27dd40 hex)
NAND erase:device 0 offset 0x100000, size 0x27e000
Erasing at0x360000 -- 100% complete.
OK
NAND write:device 0 offset 0x100000, size 0x27e000
2613248 bytes written: OK
[ s3c2440@ yangzheng ]# run brdfs
dm9000 i/o:0x20000300, id: 0x90000a46
DM9000:running in 16 bit mode
MAC:08:00:3e:26:0a:6b
could notestablish link
operating at 100M full duplex mode
Using dm9000device
TFTP fromserver 192.168.1.3; our IP address is 192.168.1.244
Filename'yz_ramdisk.gz'.
Load address:0x30008000
Loading: T T#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
##################
done
Bytestransferred = 5980871 (5b42c7hex)
NAND erase:device 0 offset 0x500000, size 0x5b4800
Erasing at0xaa0000 -- 100% complete.
OK
NAND write:device 0 offset 0x500000, size 0x5b4800
5982208 bytes written: OK
[ s3c2440@ yangzheng ]# boot
NAND read:device 0 offset 0x100000, size 0x27e000
2613248 bytes read: OK
NAND read:device 0 offset 0x500000, size 0x5b4800
5982208 bytes read: OK
## Bootingkernel from Legacy Image at 30008000 ...
Image Name: Linux Kernel
Created: 2013-06-01 11:56:31 UTC
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 2612480 Bytes = 2.5 MiB
Load Address: 30008000
Entry Point: 30008040
Verifying Checksum ... OK
XIP Kernel Image ... OK
OK
OS entrypoint: 30008040
Image entrypoint=30008040
Startingkernel ...
UncompressingLinux... done, booting the kernel.
Linux version 3.0.0(lingyun@localhost.localdomain) (gcc version 4.5.4 (Buildroot 2012.08) ) #4 SatJun 1 19:56:27 CST 2013
CPU: ARM920T[41129200] revision 0 (ARMv4T), cr=c0007177
CPU: VIVT datacache, VIVT instruction cache
Machine:SMDK2440
Memory policy:ECC disabled, Data cache writeback
CPU S3C2440A(id 0x32440001)
S3C24XX Clocks, Copyright 2004 SimtecElectronics
S3C244X: core 405.000 MHz, memory 101.250MHz, peripheral 50.625 MHz
CLOCK: Slowmode (1.500 MHz), fast, MPLL on, UPLL on
Built 1zonelists in Zone order, mobility grouping on. Total pages: 16256
Kernel commandline: console=ttyS0,115200 mem=64Minitrd=0x30800000,16Mroot=/dev/ram0 rw loglevel=7
PID hash tableentries: 256 (order: -2, 1024 bytes)
Dentry cachehash table entries: 8192 (order: 3, 32768 bytes)
Inode-cachehash table entries: 4096 (order: 2, 16384 bytes)
Memory: 64MB =64MB total
Memory:43088k/43088k available, 22448k reserved, 0K highmem
Virtual kernelmemory layout:
vector : 0xffff0000 - 0xffff1000 ( 4 kB)
fixmap : 0xfff00000 - 0xfffe0000 ( 896kB)
DMA : 0xffc00000 - 0xffe00000 ( 2 MB)
vmalloc : 0xc4800000 - 0xf6000000 ( 792 MB)
lowmem : 0xc0000000 - 0xc4000000 ( 64 MB)
modules : 0xbf000000 - 0xc0000000 ( 16MB)
.init : 0xc0008000 - 0xc002f000 ( 156 kB)
.text : 0xc002f000 - 0xc04f3000 (4880 kB)
.data : 0xc04f4000 - 0xc0523960 ( 191 kB)
.bss : 0xc0523984 - 0xc054fde4 ( 178 kB)
NR_IRQS:85
irq: clearingpending ext status 00080000
irq: clearingsubpending status 00000003
irq: clearingsubpending status 00000002
Console:colour dummy device 80x30
console[ttyS0] enabled
Calibrating delayloop... 201.52 BogoMIPS (lpj=503808)
pid_max:default: 32768 minimum: 301
Mount-cachehash table entries: 512
CPU: Testingwrite buffer coherency: ok
gpiochip_add:gpios 288..303 (GPIOK) failed to register
gpiochip_add:gpios 320..334 (GPIOL) failed to register
gpiochip_add:gpios 352..353 (GPIOM) failed to register
NET:Registered protocol family 16
S3C Power Management, Copyright 2004Simtec Electronics
S3C2440: Initialising architecture
S3C2440: IRQ Support
S3C24XX DMA Driver, Copyright 2003-2006Simtec Electronics
DMA channel 0at c4804000, irq 33
DMA channel 1at c4804040, irq 34
DMA channel 2at c4804080, irq 35
DMA channel 3at c48040c0, irq 36
S3C244X: Clock Support, DVS off
bio: createslab <bio-0> at 0
SCSI subsysteminitialized
usbcore:registered new interface driver usbfs
usbcore:registered new interface driver hub
usbcore:registered new device driver usb
s3c-i2cs3c2440-i2c: slave address 0x10
s3c-i2cs3c2440-i2c: bus frequency set to 98 KHz
s3c-i2cs3c2440-i2c: i2c-0:S3C I2C adapter
Advanced LinuxSound Architecture Driver Version 1.0.24.
cfg80211:Calling CRDA to update world regulatory domain
NET:Registered protocol family 2
IP route cachehash table entries: 1024 (order: 0, 4096 bytes)
TCPestablished hash table entries: 2048 (order: 2, 16384 bytes)
TCP bind hashtable entries: 2048 (order: 1, 8192 bytes)
TCP: Hashtables configured (established 2048 bind 2048)
TCP reno registered
UDP hash tableentries: 256 (order: 0, 4096 bytes)
UDP-Lite hashtable entries: 256 (order: 0, 4096 bytes)
NET:Registered protocol family 1
RPC:Registered named UNIX socket transport module.
RPC:Registered udp transport module.
RPC:Registered tcp transport module.
RPC:Registered tcp NFSv4.1 backchannel transport module.
Trying tounpack rootfs image as initramfs...
rootfs imageis not initramfs (no cpio magic); looks like an initrd
Freeing initrdmemory: 16384K
NetWinderFloating Point Emulator V0.97 (extended precision)
NTFS driver 2.1.30[Flags: R/W].
JFFS2 version2.2. (NAND) (SUMMARY) 漏 2001-2006 Red Hat, Inc.
msgmni hasbeen set to 116
io schedulernoop registered
io schedulerdeadline registered
io schedulercfq registered (default)
Console:switching to colour frame buffer device 60x34
fb0: s3c2410fb frame buffer device
s3c2440-uart.0: ttyS0 at MMIO 0x50000000(irq = 70) is a S3C2440
s3c2440-uart.1: ttyS1 at MMIO 0x50004000(irq = 73) is a S3C2440
s3c2440-uart.2: ttyS2 at MMIO 0x50008000(irq = 76) is a S3C2440
brd: moduleloaded
loop: moduleloaded
S3C24XX NAND Driver, (c) 2004 SimtecElectronics
s3c24xx-nand s3c2440-nand: Tacls=3, 29ns Twrph0=7 69ns, Twrph1=329ns
s3c24xx-nand s3c2440-nand: NAND soft ECC
NAND device:Manufacturer ID: 0xec, Chip ID: 0xda (Samsung NAND 256MiB 3,3V 8-bit)
Scanningdevice for bad blocks
Bad eraseblock421 at 0x0000034a0000
Bad eraseblock1177 at 0x000009320000
Bad eraseblock1727 at 0x00000d7e0000
Creating 11MTD partitions on "NAND":
0x000000000000-0x000000100000: "mtdblock0 u-boot 1MB"
0x000000100000-0x000000500000: "mtdblock1 kernel 4MB"
0x000000500000-0x000000f00000 : "mtdblock2 ramdisk10MB"
0x000000f00000-0x000001e00000 :"mtdblock3 cramfs 15MB"
0x000001e00000-0x000004600000: "mtdblock3 jffs2 40MB"
0x000004600000-0x000006e00000: "mtdblock4 yaffs2 40MB"
0x000006e00000-0x000009600000: "mtdblock5 ubifs 40MB"
0x000009600000-0x000009700000: "mtdblock6 info 1MB"
0x000009700000-0x00000bf00000: "mtdblock7 apps 40MB"
0x00000bf00000-0x00000e700000: "mtdblock8 data 40MB"
0x00000e700000-0x000010000000: "mtdblock9 backup 25MB"
PPP genericdriver version 2.4.2
PPP DeflateCompression module registered
PPP BSDCompression module registered
PPP MPPECompression module registered
NET:Registered protocol family 24
dm9000Ethernet Driver, V1.31
eth0: dm9000a at c4864300,c4866304 IRQ 51 MAC:08:00:3e:26:0a:6b(chip)
usbcore: registerednew interface driver rt2800usb
ohci_hcd: USB1.1 'Open' Host Controller (OHCI) Driver
s3c2410-ohci s3c2410-ohci: S3C24XXOHCI
s3c2410-ohci s3c2410-ohci: new USB bus registered, assigned busnumber 1
s3c2410-ohci s3c2410-ohci: irq 42, io mem 0x49000000
usb usb1: NewUSB device found, idVendor=1d6b, idProduct=0001
usb usb1: NewUSB device strings: Mfr=3, Product=2, SerialNumber=1
usb usb1:Product: S3C24XXOHCI
usb usb1:Manufacturer: Linux 3.0.0 ohci_hcd
usb usb1:SerialNumber: s3c24xx
hub 1-0:1.0: USBhub found
hub 1-0:1.0: 2ports detected
InitializingUSB Mass Storage driver...
usbcore:registered new interface driver usb-storage
USB MassStorage support registered.
usbcore:registered new interface driver usbserial
usbserial: USBSerial Driver core
USB Serialsupport registered for ch341-uart
usbcore:registered new interface driver ch341
USB Serialsupport registered for FTDI USB Serial Device
usbcore:registered new interface driver ftdi_sio
ftdi_sio: v1.6.0:USBFTDI Serial Converters Driver
USB Serialsupport registered for GSM modem (1-port)
usbcore:registered new interface driver option
option: v0.7.2:USBDriver for GSM modems
USB Serialsupport registered for pl2303
usbcore:registered new interface driver pl2303
pl2303:Prolific PL2303 USB to serial adaptor driver
mousedev: PS/2mouse device common for all mice
S3C24XX RTC, (c) 2004,2006 SimtecElectronics
i2c /dev entries driver
usbcore:registered new interface driver usbhid
usbhid: USBHID core driver
ALSA devicelist:
No soundcards found.
Netfiltermessages via NETLINK v0.30.
nf_conntrackversion 0.5.0 (929 buckets, 3716 max)
ctnetlinkv0.93: registering with nfnetlink.
xt_time:kernel timezone is -0000
ip_set:protocol 6
IPVS:Registered protocols (TCP, UDP, AH, ESP)
IPVS:Connection hash table configured (size=4096, memory=32Kbytes)
IPVS: Creatingnetns size=1008 id=0
IPVS: ipvsloaded.
IPVS: [rr]scheduler registered.
IPVS: [wrr]scheduler registered.
IPVS: [lc]scheduler registered.
IPVS: [wlc]scheduler registered.
IPVS: [lblc]scheduler registered.
IPVS: [lblcr]scheduler registered.
IPVS: [dh]scheduler registered.
IPVS: [sh]scheduler registered.
IPVS: [sed]scheduler registered.
IPVS: [nq]scheduler registered.
ip_tables: (C)2000-2006 Netfilter Core Team
ipt_CLUSTERIP:ClusterIP Version 0.8 loaded successfully
arp_tables:(C) 2002 David S. Miller
TCP cubicregistered
NET:Registered protocol family 17
lib80211:common routines for IEEE802.11 drivers
Registeringthe dns_resolver key type
drivers/rtc/hctosys.c:unable to open rtc device (rtc0)
RAMDISK: gzipimage found at block 0
usb 1-1: newfull speed USB device number 2 using s3c2410-ohci
usb 1-1: NewUSB device found, idVendor=05e3, idProduct=0606
usb 1-1: NewUSB device strings: Mfr=1, Product=2, SerialNumber=0
usb 1-1:Product: USB Hub 2.0
hub 1-1:1.0:USB hub found
hub 1-1:1.0: 4ports detected
VFS: Mountedroot (ext2 filesystem) on device 1:0.
Freeing initmemory: 156K
dm9000 dm9000:eth0: link down
dm9000 dm9000:eth0: link up, 100Mbps, full-duplex, lpa 0xCDE1
Copyright (C)2013 yangzheng<yz2012ww@gmail.com>
root login:root
>: ls
apps data etc info lib mnt root sys usr
bin dev haha init linuxrc proc sbin tmp var
测试一下:
>: rm -rf *
…………
-sh: ls: notfound
>: cd
>: cd dev/
重启开发板后一切恢复原样