在操作系统内核或用户应用程序运行之前的一小段代码,对软硬件进行相应的初始化和设定,为最终的操作系统准备好环境。 在嵌入式系统中,整个系统的启动加载任务通常由bootloader来完成。 注:(这里使用的bootloader为u-boot)
*准备工作: 提前准备kernel(uImage)、dtb(exynos4412-fs4412.dtb)、*
*rootfs(ramdisk.img) 放置到Ubuntu中*
*基本内容:通过网络传输到开发板,然后在开发板启动系统*
概念:用于下载远程文件的最简单网络协议,基于udp协议而实现。
使用条件:
需要网络连接
主机端需要安装tftp服务器软件
目标机需要实现tftp客户端
优点:
传输速度快
可以将编译好的内核下载到目标机,提高开发效率
下载tftp服务器: sudo apt-get install tftpd-hpa tftp-hpa 在 家目录/用户目录(/home/hqyj) 下面创建一个专用文件夹: mkdir mytftp chmod 777 mytftp 修改tftp配置文档: sudo vi /etc/default/tftpd-hpa 1 # /etc/default/tftpd-hpa 2 3 TFTP_USERNAME="tftp" 4 TFTP_DIRECTORY="/home/hqyj/mytftp" //专用文件夹路径 5 TFTP_ADDRESS=":69" 6 TFTP_OPTIONS="-l -c -s" //-c是可以上传文件的参数,-s是指定tftpd-hpa服务目录 将 要下载的文件 放在专用文件夹下 hqyj@ubuntu:~/mytftp$ ls exynos4412-fs4412.dtb ramdisk.img uImage 启动tftp服务, 关机后需要重启 sudo service tftpd-hpa restart
概念:nfs服务主要任务是把本地一个目录通过网络导出,其他计算机可以远程访问该目录。nfs有自己的协议和端口,在文件传输或者其他相关信息传递的时候,nfs使用远程过程调用协议。
使用条件:
需要网络连接
主机端需要nfs服务器软件支持
目标机同样需要支持nfs
优点:
根文件系统和ap等都不需要写入到目标机,提高开发效率。
1.nfs安装,要有外网 $ sudo apt-get install nfs-kernel-server 2.准备好一个即将被共享出去的文件夹 $ sudo mkdir nfs $ sudo chmod 0777 nfs 3.将 文件系统 放入 nfs 文件夹, 解压文件系统 解压 rootfs.tar.xz $ tar -xvf rootfs.tar.xz 4.解压后进入到rootfs目录,使用pwd确定所对应的绝对路径 $ cd rootfs $ pwd --> /home/hqyj/nfs/rootfs 就是用来挂载的共享路径; 5.在nfs服务器的配置文件中说明 /home/hqyj/nfs/rootfs 需要共享出去 $ sudo vim /etc/exports 尾部加入: /home/hqyj/nfs/rootfs *(rw,sync,no_root_squash,no_subtree_check) 解释: *:允许所有的网段访问,也可以使用具体的IP rw:挂接此目录的客户端对该共享目录具有读写权限 sync:资料同步写入内存和硬盘 no_root_squash:root用户具有对根目录的完全管理访问权限 no_subtree_check:不检查父目录的权限 6.重启nfs共享 $ sudo service nfs-kernel-server restart 7.检查是否开成功 $ showmount -e Export list for ubuntu: /nfs/my_rootfs * //共享成功
u-sd.bin uImage exynos4412-fs4412.dtb ramdisk.img
程序员手动输入控制, 能够判断每一条指令是否成功, 方便更改
操作麻烦, 系统调试阶段
tftp 41000000 uImage tftp 42000000 ramdisk.img tftp 43000000 exynos4412-fs4412.dtb bootm 41000000 42000000 43000000
利用自启动环境变量 bootcmd, 操作方便
没办法保留文件, 如果出错, 向上多看一些打印信息
set bootcmd "tftp 41000000 uImage; tftp 42000000 ramdisk.img; tftp 43000000 exynos4412-fs4412.dtb; bootm 41000000 42000000 43000000" set bootdelay 1 save
和Ubuntu共享文件, 调试更方便
一来就要用网络
修改u-boot配置信息 set bootargs "root=/dev/nfs nfsroot=192.168.6.94:/home/hqyj/nfs/rootfs,v3 rw console=ttySAC2,115200 clk_ignore_unused init=/linuxrc ip=192.168.6.222" 注意更改: nfsroot=192.168.6.94:/home/hqyj/nfs/rootfs //Ubuntu的ip地址, 要挂载的文件路径 ip=192.168.6.222 //操作系统运行后的开发板ip地址 set bootcmd "tftp 41000000 uImage; tftp 43000000 exynos4412-fs4412.dtb; bootm 41000000 - 43000000" save
首先要有u-boot源码(最好找稳定的版本,不是最新的最好)
1.在公司找上级领导,主管 2.找开发板厂家 3.找芯片厂家 4.百度自己去找源码
在Ubuntu内解压u-boot源码, 简单看一下文件内容 tar -xvf u-boot-2013.01.tar.bz2 阅读README了解基本信息(一般的不懂基本上都是看百度哈哈哈哈) 打开Makefile文件, 找到编译工具的预定义变量,改成↓ ifeq(arm,$(ARCH)) CROSS_COMPILE ?= arm-linux-
找一个最类似的board配置修改, 这里我们参考的是board/samsung/origen/ $cp -rf board/samsung/origen /board/samsung/fs4412 $mv board/samsung/fs4412/origen.c board/samsung/fs4412/fs4412.c $vim board/samsung/fs4412/Makefile 修改origen.o 为 fs4412.o $ cp include/configs/origen.h include/configs/fs4412.h $ vim include/configs/fs4412.h 修改 #define CONFIG_SYS_PROMPT "ORIGEN #" 为 #define CONFIG_SYS_PROMPT "fs4412 #" 修改 #define CONFIG_IDENT_STRING for ORIGEN 为 #define CONFIG_IDENT_STRING for fs4412 vi boards.cfg 复制 284 origen arm armv7 origen samsung exynos 更改 285 fs4412 arm armv7 fs4412 samsung exynos
make distclean (换开发板时用,一般来说第一次都要用) make fs4412_config make fs4412
编译好后可以选择: 1.将生成的u-boot.bin烧写到SD卡 2.SD卡启动u-boot tftp 41000000 u-boot.bin movi write u-boot 41000000(固化到emmc里) 断电,切换到emmc启动....(emmc是指由闪存和集成在同一硅片上的闪存控制器组成的封装。) 现象:启动后没有任何反应,开发板变板砖了? (思考:会不会u-boot没有移植成功?所以有下面步骤↓)
在arch/arm/cpu/armv7/start.S 134 行后添加点灯程序 ldr r0, =0x11000C20 /* 点亮LED3 GPX1_0 */ ldr r1, [r0] bic r1, r1, #0xf orr r1, r1, #0x1 /* GPX1_0 配置为输出模式 */ str r1, [r0] ldr r0, =0x11000C24 orr r1,#0x01 /* GPX1_0 输出高电平 */ str r1, [r0] 重新编译后下载到开发板,无效果。。。。 查看芯片手册后,找到问题,需要添加BL1+BL2(Secure_Booting) 才能执行到我们的u-boot,拷贝CodeSign4SecureBoot.zip到uboot源码目录下 $ cp CodeSign4SecureBoot.zip u-boot-2013.01/ 解压 $ unzip CodeSign4SecureBoot.zip 进入目录CodeSign4SecureBoot,给build.sh添加执行权限 $ chmod +x build.sh 修改build.sh,将最终生成的u.bin拷贝到自己的tftp共享目录 $ cp u.bin /home/hqyj/mytftp 执行脚本build.sh将重新编译u-boot.bin并添加BL1+BL2生成u.bin文件,并拷贝至tftp共享目录 $ ./build.sh 下载u.bin到开发板并观察结果 现象:灯亮,隔几秒灭,又亮,反复复位 重启原因:可能是看门狗? 解决办法:电源管理模块控制重启信号,将电源管理模块禁用
beq wakeup_reset 后添加 /* Clear MASK_WDT_RESET_REQUEST */ ldr r0, =0x1002040c ldr r1, =0x00 str r1, [r0] /* ONO-Hold high */ ldr r0, =0x11000C00 ldr r1, [r0] bic r1, r1, #0xf00 orr r1, r1, #0x100 str r1, [r0] ldr r0, =0x11000C04 orr r1,#0x04 str r1, [r0] ./build.sh --> 生成u.bin文件 SD卡启动u-boot tftp 41000000 u.bin movi write u-boot 41000000 断电, 换到EMMC启动 --> 现象: 灯常亮 --> 正常运行 --> 没有打印信息 问题: 串口出问题了? -> 初始化
在board/samsung/fs4412/lowlevel_init.S 添加串口时钟初始化 在uart_asm_init: 中添加 ldr r0, =EXYNOS4_CLOCK_BASE /* UART[0:4] */ ldr r1, =CLK_SRC_PERIL0_VAL ldr r2, =CLK_SRC_PERIL0_OFFSET str r1, [r0, r2] / * CLK_DIV_PERIL0: UART Clock Divisors */ ldr r1, =CLK_DIV_PERIL0_VAL ldr r2, =CLK_DIV_PERIL0_OFFSET str r1, [r0, r2] str r1, [r0, r2] 注意需要屏蔽 tzpc_init 禁用trustzone技术 @ bl tzpc_init ./build.sh --> 生成u.bin文件 SD卡启动u-boot tftp 41000000 u.bin movi write u-boot 41000000 断电, 换到EMMC启动 --> 现象: 看到打印信息, 通用命令能用, 网络相关命令不能用
查看common/cmd_net.c文件, 发现需要定义相关宏, 网络命令才能用 include/configs/fs4412.h 中未定义网络命令 更改 #undef CONFIG_CMD_PING 为 #define CONFIG_CMD_PING 更改 #undef CONFIG_CMD_NET 为 #define CONFIG_CMD_NET 更改 #undef CONFIG_CMD_NFS 为 #define CONFIG_CMD_NFS ./build.sh --> 生成u.bin文件 SD卡启动u-boot tftp 41000000 u.bin movi write u-boot 41000000 断电, 换到EMMC启动 --> 现象: ping后卡死, 打印信息: Net: Net Initialization Skipped start.S --> bl _main (arch/arm/lib/crt0.S) _main: 栈空间设置, 环境变量配置, 进入 board_init (board/samsung/fs4412/fs4412.c 或 origen.c) 发现没有网络相关的初始化信息, 找网络设备(drivers/net/dm9000x.c -> dm9000_initialize函数 仿照别的板子的调用方式: 在 board/samsung/fs4412/fs4412.c 或 origen.c 文件中添加: #ifdef CONFIG_DRIVER_DM9000 int board_eth_init(bd_t *bis) { return dm9000_initialize(bis); } #endif 在 include/configs/fs4412.h 添加 CONFIG_DRIVER_DM9000 宏 /* Ethernet */ #ifdef CONFIG_CMD_NET #define CONFIG_DRIVER_DM9000 1 #define CONFIG_DM9000_BASE 0x05000000 #define DM9000_IO CONFIG_DM9000_BASE #define DM9000_DATA (CONFIG_DM9000_BASE + 4) #define CONFIG_ETHADDR 11:22:33:44:55:66 #define CONFIG_IPADDR 192.168.6.22 #define CONFIG_SERVERIP 192.168.6.94 #define CONFIG_GATEWAYIP 192.168.6.1 #define CONFIG_NETMASK 255.255.255.0 #endif ./build.sh --> 生成u.bin文件 SD卡启动u-boot tftp 41000000 u.bin movi write u-boot 41000000 断电, 换到EMMC启动 --> 现象:SROM地址找不到 -> 添加 SROM 配置代码
在fs4412/origen.c 或 fs4412.c 增加 中的board_init中增加: 在gd->bd->bi_boot_params = (PHYS_SDRAM_1 + 0x100UL); 后添加以下内容 #ifdef CONFIG_DRIVER_DM9000 dm9000aep_pre_init(); #endif 在fs4412/origen.c 或 fs4412.c 增加: 在struct exynos4_gpio_part2 *gpio2; 后添加以下内容: #ifdef CONFIG_DRIVER_DM9000 #define EXYNOS4412_SROMC_BASE 0X12570000 #define DM9000_Tacs (0x1) #define DM9000_Tcos (0x1) #define DM9000_Tacc (0x5) #define DM9000_Tcoh (0x1) #define DM9000_Tah (0xC) #define DM9000_Tacp (0x9) #define DM9000_PMC (0x1) struct exynos_sromc { unsigned int bw; unsigned int bc[6]; }; /* * s5p_config_sromc() - select the proper SROMC Bank and configure the * band width control and bank control registers * srom_bank - SROM * srom_bw_conf - SMC Band witdh reg configuration value * srom_bc_conf - SMC Bank Control reg configuration value */ void exynos_config_sromc(u32 srom_bank, u32 srom_bw_conf, u32 srom_bc_conf) { unsigned int tmp; struct exynos_sromc *srom = (struct exynos_sromc *) (EXYNOS4412_SROMC_BASE); /* Configure SMC_BW register to handle proper SROMC bank */ tmp = srom->bw; tmp&= ~(0xF << (srom_bank * 4)); tmp |= srom_bw_conf; srom->bw = tmp; /* Configure SMC_BC register */ srom->bc[srom_bank] = srom_bc_conf; } static void dm9000aep_pre_init(void) { unsigned int tmp; unsigned char smc_bank_num = 1; unsigned int smc_bw_conf=0; unsigned int smc_bc_conf=0; /* gpio configuration */ writel(0x00220020, 0x11000000 + 0x120); writel(0x00002222, 0x11000000 + 0x140); /* 16 Bit bus width */ writel(0x22222222, 0x11000000 + 0x180); writel(0x0000FFFF, 0x11000000 + 0x188); writel(0x22222222, 0x11000000 + 0x1C0); writel(0x0000FFFF, 0x11000000 + 0x1C8); writel(0x22222222, 0x11000000 + 0x1E0); writel(0x0000FFFF, 0x11000000 + 0x1E8); smc_bw_conf &= ~(0xf<<4); smc_bw_conf |= (1<<7) | (1<<6) | (1<<5) | (1<<4); smc_bc_conf = ((DM9000_Tacs << 28) | (DM9000_Tcos << 24) | (DM9000_Tacc << 16) | (DM9000_Tcoh << 12) | (DM9000_Tah << 8) | (DM9000_Tacp << 4) | (DM9000_PMC)); exynos_config_sromc(smc_bank_num,smc_bw_conf,smc_bc_conf); } #endif ./build.sh --> 生成u.bin文件 SD卡启动u-boot tftp 41000000 u.bin movi write u-boot 41000000 断电, 换到EMMC启动 --> 现象: 能ping通, tftp下载uImage dts ramdisk.img , bootm 启动,系统能正常启动 但有个现象:不能save Saving Environment to MMC... Writing to MMC(0)... failed emmc 设备不对 -> 更改EMMC设备相关代码 不能movi Unknown command 'movi' 指令中没有movi -> 自己添加movi指令 u.bin 放到 EMMC --> EMMC启动 u.bin 烧写到 SD --> SD卡启动 现象: 灯不亮, 串口无输出 -> 原因: 没进u-boot -> 看数据手册 SD卡的u-boot前有512B的保留位 利用 tool_bin_SD/mk_uboot.sh 在bin文件前加上512B的空字节, 并将bin 文件改成SD卡更适应的img格式 将 myuboot_sd.img 烧写到 SD 卡 --> save能使用 现象: save 之后重启又没反应了 -> save成功了, 重启, 无法再次进入u- boot u-boot被破坏了 -> 环境变量存放在SD卡, 破坏了原来的u-boot 在 fs4412.h 文件内, 更改 CONFIG_ENV_OFFSET -> 更改 BL1_SIZE 为516k (myuboot_sd.img 大概是516k) 现象: save 之后也能重启
• 解压内核 将linux-3.14.tar.xz拷贝到/home/hqyj下并解压 $tar xvf linux-3.14.tar.xz $ cd linux-3.14 •修改内核顶层目录下的Makefile $ vim Makefile 修改: ARCH ?= $(SUBARCH) CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%) 为: ARCH ?= arm CROSS_COMPILE ?= arm-linux- •导入默认配置 $ make exynos_defconfig --> 先生成默认配置, 会有一些被选择 •配置内核 $ make menuconfig 注意:如果make menuconfig报错,可能是缺少ncurses库,需要安装libncurses5-dev,建议通过apt安装,sudo apt install libncurses5-dev。 第一次进入内核选配菜单,可以不进行选配,直接保存退出即可。 打不开菜单可能原因:(Your display is too small to run Menuconfig! --> 字体调小/全屏运行终端) •编译内核 $ make -j4 uImage 通过上述操作我们能够在arch/arm/boot目录下生成一个uImage文件,这就是经过压缩的内核镜像。 如果编译过程中提示缺少mkimage工具,则需要安装该工具,建议通过apt安装,sudo apt install u-boot-tools。 •编译设备树文件,编译成功会在arch/arm/boot/dts目录得到设备树文件exynos4412-origen.dtb $ make exynos4412-origen.dtb 或者 $ make dtbs •拷贝内核和设备树文件到自己的tftp共享目录下 $ cp arm/arm/boot/uImage /home/hqyj/mytftp $ cp arch/arm/boot/dts/exynos4412-origen.dtb /home/hqyj/mytftp
•设备树文件修改: $ vim arch/arm/boot/dts/exynos4412-origen.dts 添加如下内容: srom-cs1@5000000 { compatible = "simple-bus"; #address-cells = <1>; #size-cells = <1>; reg = <0x5000000 0x1000000>; ranges; ethernet@5000000 { compatible = "davicom,dm9000"; reg = <0x5000000 0x2 0x5000004 0x2>; interrupt-parent = <&gpx0>; interrupts = <6 4>; davicom,no-eeprom; mac-address = [00 0a 2d a6 55 a2]; }; }; 注:由于树形结构 所添加内容应包括在整个结点里面
•配置内核: make menuconfig [*] Networking support ---> Networking options ---> <*> Packet socket <*>Unix domain sockets [*] TCP/IP networking [*] IP: kernel level autoconfiguration Device Drivers ---> [*] Network device support ---> [*] Ethernet driver support (NEW) ---> <*> DM9000 support File systems ---> [*] Network File Systems (NEW) ---> <*> NFS client support [*] NFS client support for NFS version 3 [ ] NFS client support for the NFSv3 ACL protocol extension [*] Root file system on NFS •编译内核和设备树 $ make uImage $ make exynos4412-origen.dtb #if 0 这里多提一下: dtc是设备树的编译器,它们之间的关系就像.c文件经过gcc编译生成可执行文件一样,dts也是经过dtc编译生成了.dtb文件 dtc工具包中重要的调试功能 :反汇编 首先,要下载device-tree-compiler sudo apt-get install device-tree-compiler 然后使用命令: make dtbs 报错 可以 dtc -I dts -O dtb -o tmp.dtb arch/arm/boot/dts/xxx.dts 来检查错误信息 #endif •测试: 拷贝内核和设备树文件到/home/hqyj/mytftp目录下 $ cp arm/arm/boot/uImage /home/hqyj/mytftp $ cp arch/arm/boot/dts/exynos4412-origen.dtb /home/hqyj/mytftp 启动开发板,修改内核启动参数,通过NFS方式挂载根文件系统
根文件系统(root filesystem)是存放运行、维护系统所必须的各种工具软件、库文件、脚本、配置文件和其他特殊文件的地方,也可以安装各种软件包。 根文件系统镜像:将根文件系统按照某种格式进行打包压缩后,生成ramdisk.img 文件系统:一种管理和访问磁盘的软件机制,不同文件系统管理和访问磁盘的机制不同。
bin: 命令文件 (通过busybox工具制作) dev:设备文件(被操作系统识别的设备才有对应的文件) etc:配置文件(配置内核的相关信息) lib:库文件,比如C的标准库(从交叉编译工具链中复制的) linuxrc:根文件系统被挂载后运行的第一个程序(通过busybox工具制作) mnt:共享目录(非必要)比如挂载SD卡等时将SD卡挂载在该目录 proc:与进程相关的文件(当进程运行时才会有文件) root:用户权限(板子本身就是以root用户运行) sbin:超级用户命令、一般用户不可用(板子本身是超级用户 通过busybox工具制作) sys:系统文件(系统运行时,系统加载才会有文件) tmp:临时文件(比如插入新的设备时会产生临时文件) usr:用户文件(通过busybox制作) var:存放下载的文件和软件(可有可无) 常用的目录文件: mkdir lib mnt proc root sys tmp var
1、 源码下载 我们选择的版本是busybox-1.22.1.tar.bz2下载路径为: http://busybox.net/downloads/ 2、解压源码 $ tar xvf busybox-1.22.1.tar.bz2 3、进入源码目录 $ cd busybox-1.22.1 4、配置源码 $ make menuconfig Busybox Settings ---> Build Options ---> [*] Build BusyBox as a static binary (no shared libs) [ ] Force NOMMU build [ ] Build with Large File Support (for accessing files > 2 GB) (arm-linux-) Cross Compiler prefix () Additional CFLAGS 5、编译 $ make 6、安装 busybox默认安装路径为源码目录下的_install $ make install 7、进入安装目录下 $ cd _install $ ls bin linuxrc sbin usr 8、创建其他需要的目录 $ mkdir etc dev tmp mnt proc sys var lib 9、添加库 将工具链中的库拷贝到_install中的lib目录 $cp /home/farsight/gcc-4.6.4/arm-arm1176jzfssf-linux-gnueabi/lib/* ./lib 删除静态库和共享库文件中的符号表 -以确保rootfs足以小于8M $ rm lib/*.a $ arm-linux-strip lib/* //如果权限不足 切换到root (用strip处理过后,将去掉其中的调试信息,执行文件大小也将小很多) 删除不需要的库,确保所有库大小不超过8M $ du -sh lib/ 10、添加系统启动文件 在etc下添加文件inittab,文件内容如下: #this is run first except when booting in single-user mode. ::sysinit:/etc/init.d/rcS # /bin/sh invocations on selected ttys # start an "askfirst" shell on the console (whatever that may be) ::askfirst:-/bin/sh # stuff to do when restarting the init process ::restart:/sbin/init # stuff to do before rebooting ::ctrlaltdel:/sbin/reboot 在etc下添加文件fstab,文件内容如下: #device mount-point type options dump fsck order proc /proc proc defaults 0 0 tmpfs /tmp tmpfs defaults 0 0 sysfs /sys sysfs defaults 0 0 tmpfs /dev tmpfs defaults 0 0 这里我们挂载的文件系统有三个proc、sysfs和tmpfs。在内核中proc和sysfs默认都支持,而tmpfs是没有支持的,我们需要添加tmpfs的支持 修改内核配置: $ make menuconfig File systems ---> Pseudo filesystems ---> [*] Virtual memory file system support (former shm fs) [*] Tmpfs POSIX Access Control Lists 重新编译内核 在etc下创建init.d目录,并在init.d下创建rcS文件,rcS文件内容为: #!/bin/sh # This is the first script called by init process /bin/mount -a echo /sbin/mdev > /proc/sys/kernel/hotplug /sbin/mdev -s 为rcS添加可执行权限: $ chmod +x init.d/rcS 在etc下添加profile文件,文件内容为: LD_LIBRARY_PATH=/lib:/usr/lib export LD_LIBRARY_PAHT PATH=/bin:/sbin:/usr/bin:/usr:/sbin export PATH export HOSTNAME=fs4412 export USER=root export HOME=/root export PS1="[$USER@$HOSTNAME:\W]\# " 注意:新制作的文件系统不能超过8M
如果根文件系统需要烧写flash里面,需要去制作镜像文件; 在通过NFS测试以后,再制作 ramdisk.img $ cd ~ $ dd if=/dev/zero of=ramdisk bs=1k count=8192 //创建一个8M的空磁盘(ramdisk) $ mkfs.ext2 -F ramdisk //把ramdisk制作成ext2格式的文件 $ mkdir mymnt //创建mymnt目录作为挂载点 $ sudo mount -t ext2 ramdisk mymnt/ //把ramdisk挂载到mymnt/ $ sudo cp -a busybox2.2.1/_install/* mymnt/ //将测试好 的文件系统里的内容全部拷贝到 mymnt/ 目录下面 $ sudo umount mymnt/ //取消挂载 $ gzip --best -c ramdisk > ramdisk.gz //压缩ramdisk为ramdisk.gz $ mkimage -n "ramdisk" -A arm -O linux -T ramdisk -C gzip -d ramdisk.gz ramdisk.img //格式化为uboot识别的格式 $ cp ramdisk.img /home/hqyj/mytftp //拷贝到/tftpboot下,方便下载
制作完 ramdisk.img后,需要配置内核支持RAMDISK作为启动文件系统 make menuconfig File systems ---> <*> Second extended fs support Device Drivers SCSI device support ---> <*> SCSI disk support Block devices ---> <*>RAM block device support (16)Default number of RAM disks (8192) Default RAM disk size (kbytes) (默认为8M) General setup ---> [*] Initial RAM filesystem and RAM disk (initramfs/initrd) support 重新编译内核,复制到/home/farsight/mytftp