Linux系统在嵌入式硬件上的移植

=========================        基本常识       =========================linux

 

1、 Linux系统的基本构成:shell

一、 loaderbash

二、 kernel工具

三、 filesystemui

 

2、 启动步骤:spa

一、 CPUROM(若是有的话)的0x0地址开始读取代码,执行loader调试

二、 Loader初始化ram,并从rom中拷贝ubootkernel的镜像到ram的指定地址,执行镜像;开发

三、 若是有uboot,则uboot执行启动前的设置,能够初始化部分硬件,能够手动进入uboot环境,等等,最后拷贝kernel的镜像到ram的指定地址;若是没有uboot,那么跳过这一步;get

四、 前面的步骤称为loader部分。Kernel被加载到ram后,kernelbootargs会被覆盖,kernel启动;编译器

五、 加载驱动程序;

六、 加载文件系统,读取并执行/etc/inittab.

 

3、 交叉编译器:

arm-linux-gnueabihf-gcc

 

4、 Makefile文件和make的使用

(太容易了,,,,另行说明)

 

=========================        移植系统       =========================

 

1、 交叉编译器的配置:

修改 ~/.bashrc

export PATH=/home/hexh/toolchain/hfcctool/bin:$PATH  #shell任意目录下都可执行gcc

export CROSS_COMPILE=arm-linux-gnueabihf-   # 编译loaderkernel所须要的一个变量

重启下shell,或者source ~/.bashrc

 

2、 编译loader和内核:

一、 公司通常基于开发板修改获得本身的产品,所以第一次编译要严格参照官方资料(这个资料都没有,或者编不过,那就是扯蛋了),熟悉后可自行修改源码;

二、 内核配置命令:make ARCH=arm menuconfig

 

3、 最简易的文件系统:

一、 编译busybox

执行 make menuconfig

(1) 修改Build Options --> Cross Compiler prefix

(2) 菜鸟必须选中Build Options --> no shared libs

(3) 修改 Installation Options ("make install" behavior) à BusyBox installation prefix ../target,将会在工程目录的target下生成最小根文件系统;

make && make install

 

进入target目录,补齐文件系统的文件夹,标黄的部分必须确保存在:

bin  etc   lib      mnt  proc  run   sys  usr

dev  home  linuxrc  opt  root  sbin  tmp  var

 

/bin  /sbin  /usr, 这几个文件夹已经被busybox配置过了,不须要自行添加东西,/etc目录须要包含全部的配置信息,busybox没有对这个文件夹进行处理,须要自行定制。

 

二、 /etc/inittab

该文件配置系统启动的默认动做,若是该文件没法读取,会致使kernel panic

busybox中,和PC机略有不一样,文件格式:

输出设备::运行等级:命令

经常使用运行等级:sysinit(开机自启动项)   respawn(保持运行)

例:

# 初始化根文件系统

null::sysinit:/bin/mkdir -p /dev/pts

null::sysinit:/bin/mkdir -p /dev/shm

null::sysinit:/bin/mount –a

# 初始化hostname(须要在/etc/hostname文件中存入机器名称)

null::sysinit:/bin/hostname -F /etc/hostname

# 执行启动脚本(可自由订制)

::sysinit:/etc/init.d/rcS

# 在串口0开放登陆,并自动登陆root(无密码的状况下)

ttyS0::respawn:/bin/login -f root

 

三、 /etc/fstab

命令 mount –a 须要使用的文件,在init初始化工做结束前,须要在/proc /tmp /sys /dev 建立对应的文件系统

内容:

proc    /proc   proc    defaults                0       0

tmpfs   /tmp    tmpfs   defaults                0       0

sysfs   /sys    sysfs   defaults                0       0

tmpfs   /dev    tmpfs   defaults                0       0

 

四、 /etc/passwd /etc/shadow

这两个文件为帐户数据,对inittab中的工做不重要,但登入用户环境有利于调试工做,设置密码也能有效阻止外部破解产品的途径。

这两个文件每行的第二段数据决定

例:Root用户无密码的配置

[root@A5 /etc]# cat passwd

root:x:0:0:root:/mnt/root:/bin/sh

[root@A5 /etc]# cat shadow

root::10933:0:99999:7:::

 

五、 /etc/profile

Profile这个脚本会在用户登陆的时候自动执行,对inittab阶段不会产生影响。

内容:

# 初始化shell

USER="$(id -un)"

LOGNAME=$USER

PS1='[\u@\h \w]# '

PATH=$PATH:/mnt/bin:/mnt/usr/bin:/mnt/sbin:/mnt/usr/sbin

HOSTNAME='/bin/hostname'

export USER LOGNAME PS1 PATH LD_LIBRARY_PATH

 

4、 文件系统镜像的制做:

在此会介绍4种文件系统镜像的制做方法:fat   ext4   cramfs   ubifs

一、 格式化工具 fdisk

例:格式化U--> fdisk /dev/sdb

经常使用命令:

m:帮助;

p:打印分区列表;

n:新建分区;

t:修改分区格式(但不格式化);

a:设置可启动分区;

二、 Fat格式制做方法(在sd卡上运行系统)

例:格式化uà mkfs.vfat /dev/sdb1

三、 Ext4格式制做方法(在sd卡上运行系统)

例:格式化uà mkfs.ext4 /dev/sdb1

四、 Cramfs制做方法(启动镜像)

例:mkfs.cramfs -b 4096 -N little ${SOURCE} ${IMAGE}

五、 Ubifs制做方法

须要使用两个工具:mkfs.ubifs  ubinize

先用mkfs.ubifs将根文件目录制做成ubifs文件系统,再用ubinizeubifs文件系统制做成ubi镜像;

例:

mkfs.ubifs -r ${SRC} -e 0x1f000 -c 2048 -m 0x800 -o rootfs.ubifs

ubinize -o rootfs.ubi -m 0x800 -p 0x20000 -s 2048 ubinize.cfg

ubinize.cfg的内容:

[ubifs]

mode=ubi

image=rootfs.ubifs

vol_id=0

vol_type=dynamic

vol_name=rootfs

vol_alignment=1

vol_flags=autoresize