这里写自定义目录标题

  • 使用qumu运行armv8平台
  • 工具和代码下载
  • 编译最小文件系统
  • 编译kernel4.14内核
  • QEMU运行armv8
  • 问题汇总


使用qumu运行armv8平台

因为工作涉及到手机的bsp部分,因此后续会对uboot和kernel的内容进行系统性学习。
本章内容参考自《奔跑吧linux内核》

博主使用虚拟机进行学习,系统为:ubuntu16.04

工具和代码下载

  1. 安装如下工具
    sudo apt-get install qemu libncurses5-dev gcc-aarch64-linux-gnu build-essential
  2. 代码下载
  • git 下载kernel4.14内核代码
    我使用的码云进行下载,速度会特别快。kernel主线代码地址为:https://gitee.com/mirrors/linux
    git clone git@gitee.com:mirrors/linux.git 因为下载的是主线代码,所以需要切换到对应的版本上
    git tag //查看taggit checkout v4.14 //切换到对应的版本上
  • 下载busybox工具包
    wget https://busybox.net/downloads/busybox-1.24.0.tar.bz2

编译最小文件系统

  1. 执行命令进行编译
cd busybox
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
make menuconfig  #配置界面设置内容如下
make install

在配置界面中将busybox配置成静态编译:

Busybox Settings ---> 
		Build options --->
			[*]Build BusyBox as a static binary (no shared libs)

把编译出的busybox/下的_install目录复制到kernel4.14/下。

  1. 目录和文件添加
  • 添加etc/ dev/和mnt/目录
mkdir etc
mkdir dev
mkdir mnt
mkdir -p etc/init.d/
  • 在etc/init.d/下新建rcS文件,添加可执行权限。写入如下内容:
mkdir -p /proc
mkdir -p /tmp
mkdir -p /sys
mkdir -p /mnt
/bin/mount -a
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
  • 在etc/下新建fstab文件,写入内容:
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
debugfs /sys/kernel/debug debugfs defaults 0 0
  • 在etc/下新建inittab文件,写入内容:
::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
::askfirst:-/bin/sh
::ctrlaltdel:/bin/umount -a -r
  • 在dev/下新建设备节点
sudo mknod console c 5 1
sudo mknod null c 1 3

编译kernel4.14内核

执行以下命令:

export ARHC=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
make menuconfig #编译配置,参考下述内容
make -j4

在弹出的配置界面中,需要配置如下内容:

General setup --->
	[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support !!选中此项,下面才能修改
		(_install) Initramfs source file(s)   !!!(_install)目录是我们前面添加文件的目录
Boot options --->
	() Default kernel command string
Kernel Features -->
	Page size (4KB) --->
		Virtual address space size (48-bit) --->

QEMU运行armv8

执行命令:

qemu-system-aarch64 -machine virt -cpu cortex-a57 -machine type=virt -nographic -m 2048 -smp 2 -kernel arch/arm64/boot/Image --append "rdinit=/linuxrc console=ttyAMA0"

问题汇总

  1. 在编译kernel4.14时,出现了错误“$’\r’: command not found” ??
    原因为kernel4.14代码是从windows系统copy过来的,需要将文件格式由dos转化为unix。
    为此,下载工具dos2unix,执行以下命令:
for x in $(find .);do dos2unix $x $x;done
  1. 下载kernel代码时速度慢和报错???
    首先,使用git下载kernel代码速度会特别慢,在这我安利一下码云。可以先在码云上创建一个仓库,把原有的git仓库导入到码云上。然后再通过码云的git下载,速度会起飞的。操作如图:

    在将git仓库同步到码云之后,我使用git clone命令下载时,提示fatal: index-pack failed 百度了一下原因是ubuntu内存分区不足,下载linux内核这种仓库,需要3G以上内存。刚好我为虚拟机分配的硬盘空间太小,所以,需要修改ubuntu虚拟机分区,参考【ubuntu】ubuntu虚拟机镜像sda1分区扩容(使用Gparted)
  2. 使用git下载的kernel主线代码如何切换到指定的版本??
    下载了kernel的主线代码后,我们可以通过一下命令切换到指定版本中:
git tag #查看是否有自己需要的版本
git checkout <tag_id> #将代码切换到tag对应的分支上