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

相關文章
相關標籤/搜索