使用qumu运行armv8平台
因为工作涉及到手机的bsp部分,因此后续会对uboot和kernel的内容进行系统性学习。 本章内容参考自《奔跑吧linux内核》
博主使用虚拟机进行学习,系统为:ubuntu16.04
工具和代码下载
- 安装如下工具
sudo apt-get install qemu libncurses5-dev gcc-aarch64-linux-gnu build-essential - 代码下载
- git 下载kernel4.14内核代码
我使用的码云进行下载,速度会特别快。kernel主线代码地址为:https://gitee.com/mirrors/linux git clone git@gitee.com:mirrors/linux.git 因为下载的是主线代码,所以需要切换到对应的版本上 git tag //查看tag git checkout v4.14 //切换到对应的版本上 - 下载busybox工具包
wget https://busybox.net/downloads/busybox-1.24.0.tar.bz2
编译最小文件系统
-
执行命令进行编译 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/下。 -
目录和文件添加
- 添加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"
问题汇总
- 在编译kernel4.14时,出现了错误“$’\r’: command not found” ??
原因为kernel4.14代码是从windows系统copy过来的,需要将文件格式由dos转化为unix。 为此,下载工具dos2unix,执行以下命令:for x in $(find .);do dos2unix $x $x;done
- 下载kernel代码时速度慢和报错???
首先,使用git下载kernel代码速度会特别慢,在这我安利一下码云。可以先在码云上创建一个仓库,把原有的git仓库导入到码云上。然后再通过码云的git下载,速度会起飞的。操作如图: 在将git仓库同步到码云之后,我使用git clone 命令下载时,提示fatal: index-pack failed 百度了一下原因是ubuntu内存分区不足,下载linux内核这种仓库,需要3G以上内存。刚好我为虚拟机分配的硬盘空间太小,所以,需要修改ubuntu虚拟机分区,参考【ubuntu】ubuntu虚拟机镜像sda1分区扩容(使用Gparted) - 使用git下载的kernel主线代码如何切换到指定的版本??
下载了kernel的主线代码后,我们可以通过一下命令切换到指定版本中:git tag
git checkout <tag_id>
|