代码编织梦想

参考文章:
https://www.bilibili.com/read/cv11271232?spm_id_from=333.999.0.0
https://blog.csdn.net/scarecrow_sun/article/details/124246273
https://www.jianshu.com/p/e1a4b5b808e0

linux内核的编译和qemu的安装过程基本上都是一样的,区别只在于cpu架构不同采取不同的编译方式。
关键在于文件系统的构建和busybox的安装上。

从磁盘镜像的制作开始

制作磁盘镜像并挂载

使用 qemu-img 创建一个 512M 的磁盘镜像文件:
qemu-img create -f raw disk.raw 512M
现在 disk.raw 文件就相当于一块磁盘,为了在里面存储文件,需要先进行格式化,创建文件系统。比如在 Linux 系统中使用 ext4 文件系统

进行格式化:
mkfs -t ext4 ./disk.raw

挂载磁盘镜像文件
格式化完成之后,可以在 Linux 系统中以 loop 方式将磁盘镜像文件挂载到一个目录上,这样就可以操作磁盘镜像文件中的内容了。
下面的命令将磁盘镜像文件挂载到 rootfs目录上,这个目录需要自己创建:
sudo mount -o loop ./disk.raw ./rootfs

安装内核模块
注意,下边的命令要在linux内核文件的路径下边执行,指定的安装路径是刚刚挂载的磁盘文件的路径
现在可以将之前编译好的内核模块安装到磁盘镜像中了。命令如下:

sudo make modules_install \ # 安装内核模块 
INSTALL_MOD_PATH=~home/rootfs # 指定安装路径

内核模块安装完成会在rootfs文件夹下边出现lib文件夹,lib文件夹里边有modules文件,其中就是内核模块

准备 init 程序

因为linux内核的启动需要init的引导,所以需要使用busybox来制作的init程序
busybox的编译过程基本一致,安装的时候需要

make install CONFIG_PREFIX=<path_to_disk_img_mount_point> 

路径就是刚刚挂载磁盘的路径,之后要配置一些其他文件夹,可以在rootfs文件下边创建一个脚本文件,并执行

#!/bin/bash
mkdir etc dev mnt
mkdir -p proc sys tmp mnt
mkdir -p etc/init.d/
touch etc/fstab
echo 'proc        /proc           proc         defaults        0        0
tmpfs       /tmp            tmpfs      defaults        0        0
sysfs       /sys            sysfs        defaults        0        0' > etc/fstab

touch etc/init.d/rcS
echo 'echo -e "Welcome to tinyLinux"
/bin/mount -a
echo -e "Remounting the root filesystem"
mount  -o  remount,rw  /
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s' > etc/init.d/rcS
chmod 755 etc/init.d/rcS

touch etc/inittab
echo '::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
::askfirst:-/bin/sh
::ctrlaltdel:/bin/umount -a -r' > etc/inittab
chmod 755 etc/inittab
cd dev
mknod console c 5 1
mknod null c 1 3
mknod tty1 c 4 1

至此准备工作完成

启动

emu-system-x86_64 -m 512M -kernel /home/zsz/zsz/linux-4.9.229/arch/x86_64/boot/bzImage -append "root=/dev/sda init=/linuxrc" -drive format=raw,file=./disk.raw -serial file:output.txt

其中
/home/zsz/zsz/linux-4.9.229/arch/x86_64/boot/bzImage:是内核编译之后的文件位置
./disk.raw:是磁盘映像的位置
在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_42370809/article/details/127152092

linux内核入门(一):交叉编译linux内核并使用qemu仿真硬件运行linux系统_ginger-zone的博客-爱代码爱编程

转载说明 这篇文章借鉴了来自Linux博客教程的相关内容,因此文章类型设置为转载。 原因与目的 最近需要对Linux进行修改和测试,因此需要搭建内核的编译和测试平台。 我的方案是: 在Ubuntu16.04系统下对L

奔跑吧linux内核-使用qemu运行linux系统-爱代码爱编程

安装linux主机相关工具 sudo apt-get install qemu-system-arm libncurses5-dev gcc-aarch64-linux-gnu build-essential git bison flex libssl-dev 上面执行后,默认安装 的arm64 gcc 版本是:并检查是否如下 aarch64-li

qemu调试linux内核,使用QEMU调试Linux内核代码-爱代码爱编程

Linux内核代码的调试非常麻烦,一般都是加printk, 或者用JTAG调试。这里的方法是用QEMU来调试Linux内核。因为QEMU自己实现了一个gdb server, 所以可以非常方便的使用gdb来调内核。 这对内核的学习也非常有帮助。 为了尽量不多花时间在QEMU设置上,这里直接使用以下的内核image: 1.  QEMU的安装 这个可

linux内核编译busybox,[原创]QEMU + Busybox模拟Linux 内核环境-爱代码爱编程

前言 最近转Linux平台,开始深入Linux内核相关,总结一下进行Linux内核环境模拟流程。结合Linux的内核源码一起,效果会比较好。 准备环境 主机环境 Ubuntu 18.04 Linux ubuntu 5.4.0-58-generic #64~18.04.1-Ubuntu SMP Wed Dec 9 17:11:11 UTC 20

qemu 运行linux内核,无法在QEMU上运行Linux内核映像-爱代码爱编程

我已经从树上编译了Linux内核(稳定),并获得了initrd和bzImage.我尝试在qemu模拟器上运行它,但是在指定根文件系统分区时遇到问题. (我知道这是从中运行initrd加载的分区). 我的系统是Windows上通过Wubi安装的Ubuntu 12.04. 我一直在使用的命令是 qemu-system-x86_64 -kernel b

编译并运行Linux内核-爱代码爱编程

目录 0、环境 1、编译内核 2、创建根文件系统 3、安装qemu并执行 4、参考 0、环境         系统:Linux Mint 19.1 Tessa          内核版本:4.15.0-96-generic(该版本是笔者开发机的版本,不是要编译的版本)         虚拟机:qemu 2.11.1        

QEMU+GDB调试Linux内核总结(全)-爱代码爱编程

写在最前面 昨天更新了一篇名为《QEMU+GDB调试linux内核全过程》[link][https://blog.csdn.net/weixin_37867857/article/details/88138432]的博客,发现排版比较混乱,而且思维也比较混乱。咋一看下来简直是惨不忍睹,而且会给读者在安装过程中一种云里雾里的感觉,加上将近一个半月没有更新博客

使用qemu-kvm搭建linux内核调试环境-爱代码爱编程

使用qemu搭建内核调试环境 编译内核安装qemu-kvm制作根文件系统启动虚拟机 编译内核 内核源码很多地方都有,可以去阿里云、网易、中科大、清华等等的开源镜像站点找。 下载之后需要在电脑上安装编译内核的各种依赖项: sudo apt-get build-dep linux linux-image-$(uname -r) sudo apt

Qemu 调试 Linux 内核-爱代码爱编程

1. 开启 Linux 内核调试编译选项 make menuconfig 2. 设置 qemu 启动脚本参数 增加 -S -s 命令: sudo qemu-system-x86_64 \ -S -s \ -m 1024M \ -kernel ../linux/arch/x86/boot/bzImage

如何制作文件系统并用qemu运行linux内核-爱代码爱编程

上一文我们介绍了如何编译内核和busybox:如何编译Linux内核源码? 本文介绍如何制作一个简版的文件系统、制作fs镜像文件并最终通过qemu将linux内核运行起来! 文章目录 制作一个简版文件系统制作根文件系统镜像文件qemu运行linux内核 制作一个简版文件系统 编译完成后的busybox就安装在源码根目录下的_install

qemu+gdb调试linux内核-爱代码爱编程

文章目录 编译内核下载qemu构建initramfs根文件系统1.编译Busybox2.生成initrd3.测试根文件系统gdb调试内核参考文献 编译内核 # make menuconfig // 调整编译选项 在内核编译选项中,开启如下"Compile the kernel with debug info" Kernel hackin

在QEMU虚拟机中将Linux内核编译为EFI可执行文件并启动-爱代码爱编程

声明: 1. 本文中的步骤,目前只在QEMU Ubuntu 18.04虚拟机中测试过,但推测也适用于其他常见的Linux发行版QEMU虚拟机。 2. 本文假定读者已经安装好QEMU虚拟机,具备qemu.sh文件。 3. 本文假定读者的虚拟机支持UEFI启动,并且已经完成必要配置,使得开机后能够进入UEFI Shell。 4. 本文除步骤1在宿主机中

【qemu】qemu运行linux内核总结-爱代码爱编程

【效果走一波】 【设备平台】 操作系统:ubuntu系统版本:lts 18.4架构:x86_64一、qemu的安装 在ubuntu终端下输入以下命令进行安装: sudo apt-get install qemu 安装完成后,键入qemu后按三次tab键将弹出命令提示,如下图所示: 添加--version可查看对应的命令的版本的信息,如下图

QEMU调试Linux内核环境搭建-爱代码爱编程

一个最小可运行Linux操作系统需要内核镜像bzImage和rootfs,本文整理了其制作、安装过程,调试命令,以及如何添加共享磁盘。 编译内核源码 从 The Linux Kernel Archives 网站下载内核源码,本文下载的版本为4.14.191,4.14.191源码下载。 使用wget获取源码。 wget https://mirr

利用QEMU+GDB搭建Linux内核调试环境-爱代码爱编程

前言 对用户态进程,利用gdb调试代码是很方便的手段。而对于内核态的问题,可以利用crash等工具基于coredump文件进行调试。 其实我们也可以利用一些手段对Linux内核代码进行gdb调试,qemu就是一种。 qemu是一款完全软件模拟(Binary translation)的虚拟化软件,在虚拟化的实现中性能相对较差。但利用它在测试环境中gdb

linux内核编程-qemu环境搭建-爱代码爱编程

linux内核编程-qemu环境搭建 1.背景 最近想学习linux内核和驱动开发,但是不想买开发板,其实我觉得买了也买时间玩耍。以前读书的时候买过2440,后面到杭州买了6410和4412,买的时候兴致勃勃,买了之后新鲜了两天,由于各种原因还是放弃了,现在看到有虚拟环境,工作之余希望可以学习一下。 2.目的 深入学习linux内核和驱动。

Linux内核编译以及qemu运行-爱代码爱编程

1.本文所使用的环境 Windows 笔记,基于WSL2 搭建的 Ubuntu 18.04.2 LTS Linux  5.10.16.3-microsoft-standard-WSL2 #1 SMP Fri Apr 2 22:23:49 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux 因编译和运行都在x86上,所以不用

学内核之二:基于qemu搭建linux内核运行调试环境_龙城赤子的博客-爱代码爱编程

在上一篇文章中,我们展示了通过QEMU仿真软件来运行Linux内核的过程。因为是仿真,所以我们可以构建不同架构平台的环境来进行调试,这对开发者学习内核非常友好。当然,为了简化过程且能够有一定代表性,平台选择了ARM。 学内核之一:基于QEMU搭建Linux内核启动调试环境_龙城赤子的博客-CSDN博客 显然,基于上文的环境,我们只能调试内核的启动过程。

一起撸linux内核29-爱代码爱编程

关注囧囧妹微信公众号了解更多内容。 一、开篇 最近在看qemu,所以尝试使用qemu来运行一个内核。 关于介绍就不多说了,可以直接网上搜索,这里记录下运行起来的过程。 二、编译内核 使用指令apt install gcc-arm-linux-gnueabi来安装交叉编译工具 apt install gcc-arm-linux-gnueabi