【笔记】构建Linux 0.1.1(BeagleBone Black)

这篇笔记详细记录了如何在BeagleBone Black上构建Linux 0.1.1的过程,包括准备SD卡、理解文件系统目录结构以及编译所需的软件栈,如U-Boot、Linux内核、glibc等,最终实现了一个能够编译软件的系统。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注意这里的文章自动换行了。
与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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值