注意这里的文章自动换行了。
与0.1相比,我重新编译了,整理了下。
既然可以连HDMI显示器,那我研究下Wayland。以后再研究网络。
===============================================================================
我构建的目标平台为BeagleBone Black,
'http://beagleboard.org/'。
交叉编译工具为Sourcery CodeBench Lite,
'http://www.mentor.com/'。
要构建Linux,很简单,只有3个部分,
1,bootloader,即启动引导程序,我选择U-Boot。
2,Linux内核。
3,应用程序。
这里构建的目标是可编译C程序。
我还没研究是什么决定了32位和64位。
我主要的资料,
Running Linux
介绍Linux的书,这才叫入门级,了解下Linux的思想即可,书的内容可能有些过时,
这本书不是介绍怎么使用Linux的。如果想知道怎么使用Linux,
可看看Linux Pocket Guide,很薄。
鸟哥的书也不错,感觉挺详细的,好于大部分书,我没看。
我连shell脚本都不会写呢,很多命令没用过,这与构建Linux关系不大。
Building Embedded Linux Systems
教构建嵌入式Linux的,了解下思想即可。
http://www.linuxfromscratch.org/
教构建各种Linux的网站,最关键的是网站给出了Linux由哪些应用程序构成。
我没有用网站中的方式,sed那种命令不会。也是了解下思想即可。
If you can’t explain it simply, you don’t understand it well enough.
--Albert Einstein
===============================================================================
BeagleBone Black有4种启动方式,我选择用SD卡。
将SD卡插到电脑中,在我的系统中被识别为/dev/sdb。
分区:
# fdisk /dev/sdb
用法很简单,输入'm',就可得到帮助。
第一个分区64M,类型为FAT32 (LBA),加上启动标记。
第二个分区为余下的全部,类型默认为Linux,不必改。
参考过程是这样的,
输入'o',新建一个空DOS分区表,这会清除所有分区。
输入'p',会列出分区列表,此时应该没有。
输入'n'来添加新分区,直接'enter',接受默认为主分区,'enter'接受默认为第一分区,
'enter'接受默认的开始扇区,输入'+64M',设置分区大小为64M。
输入't',来改变分区类型,自动选择了第一个分区,输入l可列出所有分区列表的代码,
输入'c'选择W95 FAT32(LBA)。
输入'a',在第一分区设置可启动标记。
输入'n','enter'主分区,'enter'第二个,'enter'起始扇区,'enter'结束扇区。
输入'w',将改动写入分区表。
格式化:
# mkfs.vfat -F 32 /dev/sdb1
# mkfs.ext4 /dev/sdb2
第一个分区用来放U-Boot。
第二个分区用来放Linux系统。
sdb2被格式化后,里面自动有个lost+found,文件系统的结构中正好有一条:
/lost+found: Filesystem-specific recoverable data
===============================================================================
/
/data/ ;存放数据,看看下面的软链接就知道了。
/lost+found
/mount/ ;挂载点,就是传统的mnt。
/program/ ;存放程序,Linux内核也在里面。
/user/ ;用户,就是传统的home。
/dev/
dev本来应该是下面那样的软链接,但那样的话不能在ttyO0登陆,
不过倒是可以在tty1登陆,也就是通过HDMI连接显示器的时候。
为了兼容,以下是一些额外的软链接,也许以后不必有,注意并没有dev。
/bin -> /data/index/bin ;index中的都是软连接,指向program中相应位置。
/dev -> /data/device
/etc -> /data/configuration ;有些程序要在这里找配置文件。
/lib -> /data/index/lib
/proc -> /data/process
/run -> /data/run
/sbin -> /data/index/bin
/sys -> /data/system
/tmp -> /data/temporary
/var -> /data/variable
/usr/
/usr/include -> /data/index/include
/usr/lib -> /data/index/lib
/usr/share/
/usr/share/info -> /data/index/info
/usr/share/man -> /data/index/man
===============================================================================
export PATH=$PATH:/home/spy/Software/arm-2013.11/bin
export PKG_CONFIG_LIBDIR=/home/spy/Work/data/index/lib/pkgconfig
export PKG_CONFIG_SYSROOT_DIR=/home/spy/Work
--prefix=/program/
--oldincludedir=/program//oldinclude
--build=x86_64-unknown-linux-gnu
--host=arm-none-linux-gnueabi
DESTDIR=/home/spy/Work
chown -R 0:0
chgrp -v tty /program/util-linux/bin/wall
chown -R spy:users
以可读写重新挂载根文件系统
mount -n -o remount,rw /
放到交叉编译器搜索库中的程序库
linux-pam,ncurses,libcap,gdbm
coreutils与util-linux重复的命令。
kill
shadow与util-linux重复的命令。
{login,nologin,su}
shadow与coreutils重复的命令。
groups
===============================================================================
$ export PATH=$PATH:/home/spy/Software/arm-2013.11/bin
$ export CROSS_COMPILE=arm-none-linux-gnueabi-
$ cd /home/spy/Work/sources/u-boot/u-boot-2014.04
$ make O=/home/spy/Work/program/u-boot distclean
$ make O=/home/spy/Work/program/u-boot am335x_boneblack_config
$ make O=/home/spy/Work/program/u-boot all
--------------------------------------------------------------------------------
源码中正好有am335x_boneblack这个配置文件,对应我的开发板,想知道可用的配置文件
看README吧,它会告诉你到另一个文件boards.cfg中找。
/*------------------------------------------------------------------------------
http://processors.wiki.ti.com/index.php/AM335x_U-Boot_User%27s_Guide
Two stage U-Boot design
TI的wiki,让你了解MLO和u-boot.img是什么。
大概是AM335X芯片中的程序较小,只为了4种启动方式初始化,
然后找到MLO,运行MLO进一步初始化,如DDR3内存。
MLO最后找到u-boot.img,运行之。u-boot.img这个名字应该是在MLO的代码中指定的。
提示:TI的StarterWare中的2个文件叫MLO和app。
------------------------------------------------------------------------------*/
编译完后,现在就可以找找成就感了,
将MLO和u-boot.img复制到SD卡的第一个分区里;
将串口调试用的线与计算机相连,启动串口调试程序,如Putty。
将SD卡插入开发板,保持按下板子上的启动选择键,插上电源,板子会从SD卡启动,
可以松开启动选择键了。
Putty的窗口上会打印一些信息,你会看到一个1秒的倒计时,然后U-Boot会运行环境变量中
已经设置好的一些列命令,比如将Linux内核载入内存,但此时还没有内核文件,U-Boot会
停留在它自己的命令行中,你可以输入命令,如reset,这会让板子重启,倒计时的时候
按下计算机上的任意键,U-Boot就不会运行环境变量中的命令了,可玩一玩下面的演示。
给出U-Boot中的一些演示,输入help可显示所有命令。
help后接命令,可显示该命令的帮助。如"help help"。
U-Boot# mmc rescan
U-Boot# mmc list
OMAP SD/MMC: 0
OMAP SD/MMC: 1
U-Boot# mmc dev
mmc0 is current device
U-Boot# mmc part
Partition Map for MMC device 0 -- Partition Type: DOS
Part Start Sector Num Sectors UUID Type
1 2048 131072 29942d7e-01 0c Boot
2 133120 15390720 29942d7e-02 83
U-Boot# ls mmc 0:1
100688 mlo
308232 u-boot.img
510 uenv.txt
3 file(s), 0 dir(s)
U-Boot# ls mmc 0:2
<DIR> 4096 .
<DIR> 4096 ..
<SYM> 7 bin
<DIR> 4096 boot
<DIR> 4096 dev
<DIR> 4096 etc
<DIR> 4096 home
<SYM> 7 lib
<DIR> 4096 lost+found
<DIR> 4096 mnt
<DIR> 4096 proc
<DIR> 4096 run
<SYM> 7 sbin
<DIR> 4096 sys
<DIR> 4096 tmp
<DIR> 4096 usr
<DIR> 4096 var
U-Boot# mmcinfo
Device: OMAP SD/MMC
Manufacturer ID: 3
OEM: 5344
Name: SU08G
Tran Speed: 50000000
Rd Block Len: 512
SD version 3.0
High Capacity: Yes
Capacity: 7.4 GiB
Bus Width: 4-bit
U-Boot# mmc dev 1
mmc1(part 0) is current device
U-Boot# mmcinfo
Device: OMAP SD/MMC
Manufacturer ID: fe
OEM: 14e
Name: MMC02
Tran Speed: 52000000
Rd Block Len: 512
MMC version 4.41
High Capacity: No
Capacity: 1.8 GiB
Bus Width: 4-bit
U-Boot# mmc dev 0
mmc0 is current device
U-Boot#
fatls,ext4ls也可以显示文件,但对应某种文件系统。
内核配置文件我在'https://github.com/beagleboard/kernel/tree/3.14/configs'找的,
复制一份名字改'.config'放到O指定的目录中。
这样就可以用'make oldconfig'了。
如果要修改的话,要注意systemd对内核的配置是有要求的,我并没有改。
编译Linux内核的时候,提示我的系统中缺少bc,用你的包管理器安上就好了。
$ export PATH=$PATH:/home/spy/Software/arm-2013.11/bin
$ export CROSS_COMPILE=arm-none-linux-gnueabi-
$ export PATH=$PATH:/home/spy/Work/program/u-boot/tools
$ cd /home/spy/Work/sources/linux/linux-3.14.4
$ make O=/home/spy/Work/program/linux ARCH=arm help
$ make O=/home/spy/Work/program/linux ARCH=arm oldconfig
$ make O=/home/spy/Work/program/linux ARCH=arm LOADADDR=0x80008000 uImage
$ make O=/home/spy/Work/program/linux ARCH=arm LOADADDR=0x80008000 dtbs
$ make O=/home/spy/Work/program/linux ARCH=arm LOADADDR=0x80008000 modules
$ make O=/home/spy/Work/program/linux ARCH=arm LOADADDR=0x80008000 INSTALL_MOD_PATH=/home/spy/Work/root/program/linux/modules modules_install
$ make O=/home/spy/Work/program/linux ARCH=arm LOADADDR=0x80008000 INSTALL_FW_PATH=/home/spy/Work/root/program/linux/firmware firmware_install
$ make O=/home/spy/Work/program/linux ARCH=arm LOADADDR=0x80008000 INSTALL_HDR_PATH=/home/spy/Work/root/program/linux/headers headers_install
--------------------------------------------------------------------------------
'make help'是否指定ARCH,输出内容是不同的。
uImage就是Linux内核,编译时需要mkimage这个工具,编译U-Boot的时候会生成那个工具,
所以我编译内核之前将该目录加到了PATH环境变量中。
需要指定“LOADADDR”,否则会有下面的问题。
Kernel: arch/arm/boot/zImage is ready
multiple (or no) load addresses:
This is incompatible with uImages
Specify LOADADDR on the commandline to build an uImage
-dts --> device t
与0.1相比,我重新编译了,整理了下。
既然可以连HDMI显示器,那我研究下Wayland。以后再研究网络。
===============================================================================
说明
我构建的目标平台为BeagleBone Black,
'http://beagleboard.org/'。
交叉编译工具为Sourcery CodeBench Lite,
'http://www.mentor.com/'。
要构建Linux,很简单,只有3个部分,
1,bootloader,即启动引导程序,我选择U-Boot。
2,Linux内核。
3,应用程序。
这里构建的目标是可编译C程序。
我还没研究是什么决定了32位和64位。
我主要的资料,
Running Linux
介绍Linux的书,这才叫入门级,了解下Linux的思想即可,书的内容可能有些过时,
这本书不是介绍怎么使用Linux的。如果想知道怎么使用Linux,
可看看Linux Pocket Guide,很薄。
鸟哥的书也不错,感觉挺详细的,好于大部分书,我没看。
我连shell脚本都不会写呢,很多命令没用过,这与构建Linux关系不大。
Building Embedded Linux Systems
教构建嵌入式Linux的,了解下思想即可。
http://www.linuxfromscratch.org/
教构建各种Linux的网站,最关键的是网站给出了Linux由哪些应用程序构成。
我没有用网站中的方式,sed那种命令不会。也是了解下思想即可。
If you can’t explain it simply, you don’t understand it well enough.
--Albert Einstein
===============================================================================
准备SD卡
BeagleBone Black有4种启动方式,我选择用SD卡。
将SD卡插到电脑中,在我的系统中被识别为/dev/sdb。
分区:
# fdisk /dev/sdb
用法很简单,输入'm',就可得到帮助。
第一个分区64M,类型为FAT32 (LBA),加上启动标记。
第二个分区为余下的全部,类型默认为Linux,不必改。
参考过程是这样的,
输入'o',新建一个空DOS分区表,这会清除所有分区。
输入'p',会列出分区列表,此时应该没有。
输入'n'来添加新分区,直接'enter',接受默认为主分区,'enter'接受默认为第一分区,
'enter'接受默认的开始扇区,输入'+64M',设置分区大小为64M。
输入't',来改变分区类型,自动选择了第一个分区,输入l可列出所有分区列表的代码,
输入'c'选择W95 FAT32(LBA)。
输入'a',在第一分区设置可启动标记。
输入'n','enter'主分区,'enter'第二个,'enter'起始扇区,'enter'结束扇区。
输入'w',将改动写入分区表。
格式化:
# mkfs.vfat -F 32 /dev/sdb1
# mkfs.ext4 /dev/sdb2
第一个分区用来放U-Boot。
第二个分区用来放Linux系统。
sdb2被格式化后,里面自动有个lost+found,文件系统的结构中正好有一条:
/lost+found: Filesystem-specific recoverable data
===============================================================================
文件系统目录结构
/
/data/ ;存放数据,看看下面的软链接就知道了。
/lost+found
/mount/ ;挂载点,就是传统的mnt。
/program/ ;存放程序,Linux内核也在里面。
/user/ ;用户,就是传统的home。
/dev/
dev本来应该是下面那样的软链接,但那样的话不能在ttyO0登陆,
不过倒是可以在tty1登陆,也就是通过HDMI连接显示器的时候。
为了兼容,以下是一些额外的软链接,也许以后不必有,注意并没有dev。
/bin -> /data/index/bin ;index中的都是软连接,指向program中相应位置。
/dev -> /data/device
/etc -> /data/configuration ;有些程序要在这里找配置文件。
/lib -> /data/index/lib
/proc -> /data/process
/run -> /data/run
/sbin -> /data/index/bin
/sys -> /data/system
/tmp -> /data/temporary
/var -> /data/variable
/usr/
/usr/include -> /data/index/include
/usr/lib -> /data/index/lib
/usr/share/
/usr/share/info -> /data/index/info
/usr/share/man -> /data/index/man
===============================================================================
便签
export PATH=$PATH:/home/spy/Software/arm-2013.11/bin
export PKG_CONFIG_LIBDIR=/home/spy/Work/data/index/lib/pkgconfig
export PKG_CONFIG_SYSROOT_DIR=/home/spy/Work
--prefix=/program/
--oldincludedir=/program//oldinclude
--build=x86_64-unknown-linux-gnu
--host=arm-none-linux-gnueabi
DESTDIR=/home/spy/Work
chown -R 0:0
chgrp -v tty /program/util-linux/bin/wall
chown -R spy:users
以可读写重新挂载根文件系统
mount -n -o remount,rw /
放到交叉编译器搜索库中的程序库
linux-pam,ncurses,libcap,gdbm
coreutils与util-linux重复的命令。
kill
shadow与util-linux重复的命令。
{login,nologin,su}
shadow与coreutils重复的命令。
groups
===============================================================================
编译软件
U-Boot 2分钟 CPU 1.86GHz;内存2G,DDR2,单条1G。
============ http://www.denx.de/wiki/U-Boot/WebHome$ export PATH=$PATH:/home/spy/Software/arm-2013.11/bin
$ export CROSS_COMPILE=arm-none-linux-gnueabi-
$ cd /home/spy/Work/sources/u-boot/u-boot-2014.04
$ make O=/home/spy/Work/program/u-boot distclean
$ make O=/home/spy/Work/program/u-boot am335x_boneblack_config
$ make O=/home/spy/Work/program/u-boot all
--------------------------------------------------------------------------------
源码中正好有am335x_boneblack这个配置文件,对应我的开发板,想知道可用的配置文件
看README吧,它会告诉你到另一个文件boards.cfg中找。
/*------------------------------------------------------------------------------
http://processors.wiki.ti.com/index.php/AM335x_U-Boot_User%27s_Guide
Two stage U-Boot design
TI的wiki,让你了解MLO和u-boot.img是什么。
大概是AM335X芯片中的程序较小,只为了4种启动方式初始化,
然后找到MLO,运行MLO进一步初始化,如DDR3内存。
MLO最后找到u-boot.img,运行之。u-boot.img这个名字应该是在MLO的代码中指定的。
提示:TI的StarterWare中的2个文件叫MLO和app。
------------------------------------------------------------------------------*/
编译完后,现在就可以找找成就感了,
将MLO和u-boot.img复制到SD卡的第一个分区里;
将串口调试用的线与计算机相连,启动串口调试程序,如Putty。
将SD卡插入开发板,保持按下板子上的启动选择键,插上电源,板子会从SD卡启动,
可以松开启动选择键了。
Putty的窗口上会打印一些信息,你会看到一个1秒的倒计时,然后U-Boot会运行环境变量中
已经设置好的一些列命令,比如将Linux内核载入内存,但此时还没有内核文件,U-Boot会
停留在它自己的命令行中,你可以输入命令,如reset,这会让板子重启,倒计时的时候
按下计算机上的任意键,U-Boot就不会运行环境变量中的命令了,可玩一玩下面的演示。
给出U-Boot中的一些演示,输入help可显示所有命令。
help后接命令,可显示该命令的帮助。如"help help"。
U-Boot# mmc rescan
U-Boot# mmc list
OMAP SD/MMC: 0
OMAP SD/MMC: 1
U-Boot# mmc dev
mmc0 is current device
U-Boot# mmc part
Partition Map for MMC device 0 -- Partition Type: DOS
Part Start Sector Num Sectors UUID Type
1 2048 131072 29942d7e-01 0c Boot
2 133120 15390720 29942d7e-02 83
U-Boot# ls mmc 0:1
100688 mlo
308232 u-boot.img
510 uenv.txt
3 file(s), 0 dir(s)
U-Boot# ls mmc 0:2
<DIR> 4096 .
<DIR> 4096 ..
<SYM> 7 bin
<DIR> 4096 boot
<DIR> 4096 dev
<DIR> 4096 etc
<DIR> 4096 home
<SYM> 7 lib
<DIR> 4096 lost+found
<DIR> 4096 mnt
<DIR> 4096 proc
<DIR> 4096 run
<SYM> 7 sbin
<DIR> 4096 sys
<DIR> 4096 tmp
<DIR> 4096 usr
<DIR> 4096 var
U-Boot# mmcinfo
Device: OMAP SD/MMC
Manufacturer ID: 3
OEM: 5344
Name: SU08G
Tran Speed: 50000000
Rd Block Len: 512
SD version 3.0
High Capacity: Yes
Capacity: 7.4 GiB
Bus Width: 4-bit
U-Boot# mmc dev 1
mmc1(part 0) is current device
U-Boot# mmcinfo
Device: OMAP SD/MMC
Manufacturer ID: fe
OEM: 14e
Name: MMC02
Tran Speed: 52000000
Rd Block Len: 512
MMC version 4.41
High Capacity: No
Capacity: 1.8 GiB
Bus Width: 4-bit
U-Boot# mmc dev 0
mmc0 is current device
U-Boot#
fatls,ext4ls也可以显示文件,但对应某种文件系统。
Linux 26 + 53
============ http://www.kernel.org/内核配置文件我在'https://github.com/beagleboard/kernel/tree/3.14/configs'找的,
复制一份名字改'.config'放到O指定的目录中。
这样就可以用'make oldconfig'了。
如果要修改的话,要注意systemd对内核的配置是有要求的,我并没有改。
编译Linux内核的时候,提示我的系统中缺少bc,用你的包管理器安上就好了。
$ export PATH=$PATH:/home/spy/Software/arm-2013.11/bin
$ export CROSS_COMPILE=arm-none-linux-gnueabi-
$ export PATH=$PATH:/home/spy/Work/program/u-boot/tools
$ cd /home/spy/Work/sources/linux/linux-3.14.4
$ make O=/home/spy/Work/program/linux ARCH=arm help
$ make O=/home/spy/Work/program/linux ARCH=arm oldconfig
$ make O=/home/spy/Work/program/linux ARCH=arm LOADADDR=0x80008000 uImage
$ make O=/home/spy/Work/program/linux ARCH=arm LOADADDR=0x80008000 dtbs
$ make O=/home/spy/Work/program/linux ARCH=arm LOADADDR=0x80008000 modules
$ make O=/home/spy/Work/program/linux ARCH=arm LOADADDR=0x80008000 INSTALL_MOD_PATH=/home/spy/Work/root/program/linux/modules modules_install
$ make O=/home/spy/Work/program/linux ARCH=arm LOADADDR=0x80008000 INSTALL_FW_PATH=/home/spy/Work/root/program/linux/firmware firmware_install
$ make O=/home/spy/Work/program/linux ARCH=arm LOADADDR=0x80008000 INSTALL_HDR_PATH=/home/spy/Work/root/program/linux/headers headers_install
--------------------------------------------------------------------------------
'make help'是否指定ARCH,输出内容是不同的。
uImage就是Linux内核,编译时需要mkimage这个工具,编译U-Boot的时候会生成那个工具,
所以我编译内核之前将该目录加到了PATH环境变量中。
需要指定“LOADADDR”,否则会有下面的问题。
Kernel: arch/arm/boot/zImage is ready
multiple (or no) load addresses:
This is incompatible with uImages
Specify LOADADDR on the commandline to build an uImage
-dts --> device t