系统移植完整步骤

了解系统启动的流程

系统移植完整步骤_第1张图片

bootloader:是硬件启动的引导程序,是运行操作系统的前提。
在操作系统内核或用户应用程序运行之前的一小段代码,对软硬件进行相应的初始化和设定,为最终的操作系统准备好环境。
​
在嵌入式系统中,整个系统的启动加载任务通常由bootloader来完成。
​
注:(这里使用的bootloader为u-boot)

基本步骤

*准备工作: 提前准备kernel(uImage)、dtb(exynos4412-fs4412.dtb)、*

*rootfs(ramdisk.img) 放置到Ubuntu中*

系统移植完整步骤_第2张图片

*基本内容:通过网络传输到开发板,然后在开发板启动系统*

系统移植完整步骤_第3张图片

一.tftp工具

概念:用于下载远程文件的最简单网络协议,基于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服务器软件支持

目标机同样需要支持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

1.u-boot 交互启动

程序员手动输入控制, 能够判断每一条指令是否成功, 方便更改

操作麻烦, 系统调试阶段

tftp  41000000   uImage
tftp  42000000   ramdisk.img 
tftp  43000000   exynos4412-fs4412.dtb  
bootm  41000000  42000000    43000000  

2.u-boot 自启动

利用自启动环境变量 bootcmd, 操作方便

没办法保留文件, 如果出错, 向上多看一些打印信息

set  bootcmd  "tftp  41000000  uImage;  tftp  42000000  ramdisk.img;  tftp 43000000  exynos4412-fs4412.dtb;  bootm  41000000  42000000  43000000"
​
set  bootdelay    1
​
save

3.nfs挂载启动

和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移植

首先要有u-boot源码(最好找稳定的版本,不是最新的最好)

如何找源码?
1.在公司找上级领导,主管
2.找开发板厂家
3.找芯片厂家
4.百度自己去找源码
1.添加编译工具
在Ubuntu内解压u-boot源码, 简单看一下文件内容
tar -xvf u-boot-2013.01.tar.bz2
阅读README了解基本信息(一般的不懂基本上都是看百度哈哈哈哈)
打开Makefile文件, 找到编译工具的预定义变量,改成↓
ifeq(arm,$(ARCH))
CROSS_COMPILE ?= arm-linux-
2.抄板
这里提一下为什么要抄板。 根据你要进行移植系统的板子(这里选的是samsung的板子)将和你板子兼容的文件复制一份文件 ,抄板的目的是为了在移植的开发板上复制一份兼容文件并围绕兼容文件上移植新的系统。
找一个最类似的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
​
(第一次编译)u-boot
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没有移植成功?所以有下面步骤↓)
3.添加点灯代码
由于之前生成的u-boot.bin在开发板上运行没有任何效果,因此先通过点灯法尝试找到错误原因,目的是为了证明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到开发板并观察结果
​
现象:灯亮,隔几秒灭,又亮,反复复位
重启原因:可能是看门狗?
    解决办法:电源管理模块控制重启信号,将电源管理模块禁用
4.电源管理设置
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启动 --> 现象: 灯常亮 --> 正常运行 --> 没有打印信息
问题: 串口出问题了? -> 初始化   
5.串口初始化设置
由于u.bin串口模块还有问题,导致上电后串口没有信息,也无法通过串口与之进行交互。通过检查串口初始化发现是由于缺少时钟初始化导致。因此需要添加对应的时钟初始化。
在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启动 --> 现象: 看到打印信息, 通用命令能用, 网络相关命令不能用
6.网络配置
查看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 配置代码
7.增加SROM设置
SROM控制器,其实就是由SoC提供的、对外的、总线式连接外部SRAM/ROM的一种接口。
在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 之后也能重启

内核kernel移植

内核
•   解压内核
将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
设备树网卡设置
通过上面的实验我们能够获得一个内核,但是这个内核只是一个最基本的配置,很多的功能并没有包含。
网卡是嵌入式产品最常用的设备,这里我们需要完成网卡驱动的移植。FS4412使用的是DM9000网卡,我们通过这个实验能够了解如何在内核中添加网卡驱动及网络功能的基本配置。
•设备树文件修改:
$ 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
​
文件系统:一种管理和访问磁盘的软件机制,不同文件系统管理和访问磁盘的机制不同。
根文件系统 -制作工具:busybox
busybox 特点
短小精悍,版本更新较快,但是版本之间差异不大。
根文件系统-各目录介绍
各文件的功能解析
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
制作ramdisk文件系统
如果根文件系统需要烧写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
制作完 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

你可能感兴趣的:(c#,linux,系统架构)