使用OpenWrt开发嵌入式Linux(二):先让系统跑起来(使用initramfs)

2019-07-13 08:45发布

安装相关工具(推荐使用ubuntu 16及以上版本)

sudo apt install gcc binutils bzip2 flex python perl make diffutils unzip gawk subversion zlib1g-dev quilt

下载源码

git clone https://github.com/openwrt/openwrt.git cd openwrt

开始编译前的准备工作——更新软件包

./scripts/feeds update -a ./scripts/feeds install -a

配置 —— menuconfig

make menuconfig Target System (Samsung s3c24xx/s5pv210) ---> Subtarget (s5pv210 based boards) ---> Target Profile (TQ210) ---> Target Images ---> [*] ramdisk ---> Global build settings ---> Kernel build options ---> [*] Compile the kernel with early printk 选择TQ210硬件平台
选择ramdisk,使用内存文件系统启动
选中内核早期调试打印

配置内核 —— make kernel_menuconfig

make kernel_menuconfig Boot options ---> [*] Use appended device tree blob to zImage (EXPERIMENTAL) Kernel hacking ---> [*] Kernel low-level debugging functions (read help!) Kernel low-level debugging port (Use Samsung S3C UART 0 for low-level debug) ---> 选中将dtb追加到zImage后面
根据自己的开发板选择调试串口,TQ210使用的是UART0
在这里可以把一些暂时不需要的配置选项给去掉

编译

make -j4 编译成功,我们最终需要的内核如下 bin/targets/samsung/s5pv210/openwrt-samsung-s5pv210-tq210-initramfs-kernel.bin 这里编译出来的内核是uImage格式,如果需要zImage格式,请修改target/linux/samsung/image/Makefile,将uImage none去掉 define Device/Default PROFILES = Default KERNEL_NAME := zImage KERNEL := kernel-bin | append-dtb endef

使用tftp下载内核到设备的内存直接运行

我这里使用我自己移植的barebox(一个代码风格类似Linux的Bootloader)来运行内核 barebox 2018.04.0-00135-g476dd0f26-dirty #5 Fri Apr 13 01:21:34 CST 2018 Board: Embedsky tq210 netconsole: registered as netconsole-1 dm9000 dm90000: Found DM9000B at i/o: 0x88000000 mdio_bus: miibus0: probed nand: NAND device: Manufacturer ID: 0xec, Chip ID: 0xd3 (Samsung NAND 1GiB 3,3V 8-bit), 1024MiB, page size: 2048, OOB size: 64 Scanning device for bad blocks Bad eraseblock 1402 at 0x00000af40000 registered as fbconsole0 malloc space: 0x2bf00000 -> 0x2fefffff (size 64 MiB) refclk: 24000 kHz armclk: 1000000 kHz a2mclk: 200000 kHz hclk_dsys: 166750 kHz pclk_dsys: 83375 kHz hclk_psys: 133400 kHz pclk_psys: 66700 kHz running /env/bin/init... nv variable modified, will save nv variables on shutdown Hit m for menu or any other key to stop autoboot: 0 type exit to get to the menu barebox@Embedsky tq210:/ 使用tftp命令下载内核。Barebox支持ramfs,这里直接下载到ramfs中 barebox@Embedsky tq210:/ tftp openwrt-samsung-s5pv210-tq210-initramfs-kernel.bin WARNING: net: warning: No MAC address set. Using random address fa:09:66:1f:1a:d7 eth0: 100Mbps full duplex link detected T [#################################################################] Barebox支持将文件作为命令直接执行 barebox@Embedsky tq210:/ ./openwrt-samsung-s5pv210-tq210-initramfs-kernel.bin Image Name: ARM OpenWrt Linux-4.14.32 Created: 2018-04-13 14:09:27 UTC OS: Linux Architecture: ARM Type: Kernel Image Compression: uncompressed Data Size: 3876720 Bytes = 3.7 MiB Load Address: 20008000 Entry Point: 20008000 Loading U-Boot uImage './openwrt-samsung-s5pv210-tq210-initramfs-kernel.bin' commandline: mtdparts=nand:256k(nand0.barebox),128k(nand0.bareboxenv),4M(nand0.kernel),-(nand0.rootfs) arch_number: 0 nv variables modified, saving them Uncompressing Linux... done, booting the kernel. [ 0.000000] Booting Linux on physical CPU 0x0 [ 0.000000] Linux version 4.14.32 (zjh@zjh-GE60-2PL) (gcc version 7.3.0 (OpenWrt GCC 7.3.0 r6740-31293c675c)) #0 PREEMPT Fri Apr 13 14:09:27 2018 [ 0.000000] CPU: ARMv7 Processor [412fc082] revision 2 (ARMv7), cr=10c5387d [ 0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache [ 0.000000] OF: fdt: Machine model: Embedsky TQ210 based on S5PV210 [ 0.000000] Memory policy: Data cache writeback [ 0.000000] CPU: All CPU(s) started in SVC mode. [ 0.000000] random: get_random_bytes called from start_kernel+0x84/0x3c4 with crng_init=0 ...... BusyBox v1.28.3 () built-in shell (ash) _______ ________ __ | |.-----.-----.-----.| | | |.----.| |_ | - || _ | -__| || | | || _|| _| |_______|| __|_____|__|__||________||__| |____| |__| W I R E L E S S F R E E D O M ----------------------------------------------------- OpenWrt SNAPSHOT, r6742-c71b8121ef ----------------------------------------------------- === WARNING! ===================================== There is no root password defined on this device! Use the "passwd" command to set up a new password in order to prevent unauthorized SSH logins. -------------------------------------------------- root@OpenWrt:/#