美文网首页
从0开始运行主线Linux内核

从0开始运行主线Linux内核

作者: techping | 来源:发表于2017-03-31 20:49 被阅读0次

本博客以Xunlong Orangepi Zero为例,运行最新Linux 4.11.0-rc4内核。

[Mainline U-Boot & Mainline Kernel & Rootfs Howto]

Mainline U-Boot

# 克隆u-boot仓库
git clone git://git.denx.de/u-boot.git

# 编译配置
make orangepi_zero_defconfig

# 交叉编译
make V=s -j8 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-

编译完成在源码根目录出现目标文件:

  • u-boot-sunxi-with-spl.bin

Mainline Kernel

# 克隆kernel仓库
git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git

# 编译配置
make ARCH=arm sunxi_defconfig

# 交叉编译
make V=s -j8 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-

编译完成在源码目录出现目标文件:

  • zImage (arch/arm/boot/zImage)
  • sun8i-h2-plus-orangepi-zero.dtb (arch/arm/boot/dts/sun8i-h2-plus-orangepi-zero.dtb)

Rootfs

1\ busybox

# 克隆busybox仓库
git clone git://git.busybox.net/busybox

# 编译配置
make menuconfig

[*] Build busybox as a static binary

(arm-linux-gnueabihf-) Cross Compiler prefix

(./_install) Busybox Installation prefix

# 编译
make

cd _install/

chmod 4755 bin/busybox

接下来的步骤都基于这个_install文件夹。

2\ etc/inittab

创建etc/inittab文件:

# /etc/inittab
::sysinit:/etc/init.d/rcS
ttyS0::sysinit:/bin/ash
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r

3\ etc/fstab

创建etc/fstab文件:

# device        mount-point     type    options dump    fsck    order
proc    /proc   proc    defaults        0       0
tmpfs   /tmp    tmpfs   defaults        0       0

4\ etc/init.d/rcS

创建etc/init.d/rcS文件:

#!/bin/sh
mount -a

5\ 创建设备节点

在dev目录下创建基本的设备节点:

mknod -m 0666 console c 5 1
mknod -m 0666 null c 1 3
mknod ttyS0 c 4 64

Install

将sd卡分区,第一个分区放zImage和dtb文件,第二个分区作为rootfs挂载:

#!/bin/sh

card=/dev/mmcblk0
cardroot=${card}${p}2

# sd卡格式化
dd if=/dev/zero of=${card} bs=1M count=1

# sd卡分区
blockdev --rereadpt ${card}
cat <<EOT | sfdisk ${card}
1M,16M,c
,,L
EOT

# 格式化分区
mkfs.vfat ${card}${p}1
mkfs.ext4 ${card}${p}2

# 刷入U-Boot
dd if=u-boot-sunxi-with-spl.bin of=${card} bs=1024 seek=8

# 写入zImage和dtb文件
mount ${card}${p}1 /mnt/
cp zImage /mnt/
cp sun8i-h2-plus-orangepi-zero.dtb /mnt/
umount /mnt/

# 写入rootfs
mount ${cardroot} /mnt/
cp -r /myrootfs /mnt/
umount /mnt

Boot

在U-Boot命令行中执行:

=> setenv bootargs 'console=ttyS0,115200n8 earlyprintk root=/dev/mmcblk0p1 rootwait panic=10'
=> fatload mmc 0 0x46000000 zImage
reading zImage
3657840 bytes read in 226 ms (15.4 MiB/s)
=> fatload mmc 0 0x49000000 sun8i-h2-plus-orangepi-zero.dtb
reading sun8i-h2-plus-orangepi-zero.dtb
14025 bytes read in 30 ms (456.1 KiB/s)
=> bootz 0x46000000 - 0x49000000

Boot Success

成功进入Linux系统,重新挂载可读写文件系统,挂载proc,sys,debug目录:

/ # mount -o remount,rw /
[   58.970790] EXT4-fs (mmcblk0p2): re-mounted. Opts: data=ordered
/ # mount -t proc proc /proc
/ # mount -t sysfs sysfs /sys
/ # mount -t debugfs debugfs /sys/kernel/debug

/ # cat /proc/version 
Linux version 4.11.0-rc4-00064-g89970a0 (chenziping@techping-pc) (gcc version 6.2.1 20161016 (Linaro GCC 6.2-2016.11) ) #1 SMP Thu Mar 30 18:55:45 CST 2017
/ # 

相关文章

  • 从0开始运行主线Linux内核

    本博客以Xunlong Orangepi Zero为例,运行最新Linux 4.11.0-rc4内核。 [Main...

  • [Boot]Kernel启动

    概述 Uboot最后阶段通过do_bootm_linux跳转到内核,此时内核开始运行,uboot任务完成。之后内核...

  • 如何编译和更换Linux系统内核

    如何编译和更换Linux系统内核 step0 — 完成编译和安装Linux需要的基本条件 内核源代码从http:/...

  • KVM原理

    Linux内核模型: 单内核 单内核单内核指整个内核从整体上作为一个过程实现,运行在一个单独的地址空间内 ,内核之...

  • Linux重置root密码

    e进入内核编辑页面; linux16 参数这行追加rd.break console=tty0, Crtl+X运行,...

  • 关于Linux编译优化几个必须掌握的姿势

    首先我们都知道,Linux内核如果用O0编译,是无法编译过的,Linux的内核编译,要么是O2,要么是Os,这点从...

  • Linux内核技术该如何从0 开始?

    前言 你是不是也在研究关于Linux内核的学习,始终找不到合适的入口~~~ 比如看书:《Linux内核设计与实现》...

  • Android启动

    Linux 三个特殊进程: PID 0 idle进程 特点:1、系统自建的首个进程 2、创建运行内核空间 3、系统...

  • 编写Linux驱动程序 - 1 简单内核模块

    大多数的Linux驱动程序,都以内核模块的形式,运行在Linux内核中。 内核模块可以通过insmod/rmmod...

  • 从Kafka到NIO

    [TOC]在谈NIO之前,简单回顾下内核态和用户态 内核空间是Linux内核运行的空间,而用户空间是用户程序的运行...

网友评论

      本文标题:从0开始运行主线Linux内核

      本文链接:https://www.haomeiwen.com/subject/boavottx.html