Linux 启动优化
启动流程
Linux 系统当前的启动流程如下:
1 | brom --> boot0 --> (monitor/secure os) --> uboot --> rootfs --> app |
brom 固化在 IC 内部,芯片出厂后就无法更改。后续将从 boot0 开始分阶段介绍启动优化的方法。
对于某些方案,会存在 monitor 或 secure os,这两者耗时很短,略过。
Linux 系统当前的启动流程如下:
1 | brom --> boot0 --> (monitor/secure os) --> uboot --> rootfs --> app |
brom 固化在 IC 内部,芯片出厂后就无法更改。后续将从 boot0 开始分阶段介绍启动优化的方法。
对于某些方案,会存在 monitor 或 secure os,这两者耗时很短,略过。
固件中通常包含 boot0、 uboot、 kernel、 rootfs 等镜像。基于经验,各个镜像尺寸的量级如下表所示:
Image | size |
---|---|
boot0 | < 100k |
uboot | < 1M |
kernel | 3-15M |
rootfs | > 4M |
可以看到 boot0、 uboot、 kernel、 rootfs 的尺寸是依次增大的。对于大尺寸的裁剪效果往往比小尺寸的裁剪效果明显,比如 rootfs 裁剪 1M 可能很容易,对于 uboot 来说,则非常困难。因此,后续主要介绍 kernel 以及 rootfs 的裁剪。
1 | #include <execinfo.h> |
硬件上 DDR 确定之后, DRAM 大小就已经确定。
uboot 会根据 DRAM 驱动提供的接口获取 DRAM 的大小,然后修改 dts 中的 memory 节点,Linux 启动时解析 dts 获取 DRAM 的大小。 uboot 启动 log 中会打印 dram 的大小。比如 R329 方案 uboot 启动时会有如下 log:
1 | [01.300]DRAM: 128 MiB |
执行:
1 | root@TinaLinux:/# hexdump -C /sys/firmware/devicetree/base/memory@40000000/reg |
也可以获取 dram 的起始地址与大小。如下面 R329 例子所示,其中 0x40000000 为起始地址, 0x08000000 为 dram 的 size.
1 | procps-ng-top -H -p 899 -w 120 |
shift+p 按照 cpu 使用率对线程排序。如下是一个实例:
LeakTracer 是在检查 C++ 程序内存泄漏时编写的一个小工具。我无法让 dmalloc 显示我想要的内容,我只看到了提到的 __builtin_return_address gcc-extension。
要使用 LeakTracer,请使用提供的 LeakCheck 脚本运行您的程序。它使用 LD_PRELOAD 特性在你的函数之上“覆盖”一些函数(不需要重新编译)。如果您的平台不支持 LD_PRELOAD,您可以将 LeakTracer.o 对象文件添加到 Makefile 中的对象并运行您的应用程序。
LeakTracer 利用 gdb 去输出发生内存泄露所发生的位置,它是通过 override operator new, operator delete, operator malloc, operator free 来实现检测。
设置 sources.list:
1 | sudo sh -c 'echo "deb <http://packages.ros.org/ros/ubuntu> $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' |
设置 keys:
1 | sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 |
安装:
1 | sudo apt-get update |
设置环境:
1 | echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc |
安装依赖:
1 | sudo apt install python-rosdep python-rosinstall python-rosinstall-generator python-wstool build-essential |
初始化 rosdep:
1 | sudo apt install python-rosdep |