========================= 基本常識 =========================linux
1、 Linux系統的基本構成:shell
一、 loaderbash
二、 kernel工具
三、 filesystemui
2、 啓動步驟:spa
一、 CPU從ROM(若是有的話)的0x0地址開始讀取代碼,執行loader;調試
二、 Loader初始化ram,並從rom中拷貝uboot或kernel的鏡像到ram的指定地址,執行鏡像;開發
三、 若是有uboot,則uboot執行啓動前的設置,能夠初始化部分硬件,能夠手動進入uboot環境,等等,最後拷貝kernel的鏡像到ram的指定地址;若是沒有uboot,那麼跳過這一步;get
四、 前面的步驟稱爲loader部分。Kernel被加載到ram後,kernel的bootargs會被覆蓋,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- # 編譯loader、kernel所須要的一個變量
重啓下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文件系統,再用ubinize將ubifs文件系統製做成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