0%

操作系统lab1

1711029383714

本科生实验报告

实验课程: 操作系统

实验名称: lab1 编译内核/利用已有内核构建OS

  1. 实验要求

独立完成实验5个部分 环境配置编译****Linux内核Qemu启动内核并开启远程调试制作Initramfs编译并启动Busybox**** 。

1.搭建OS内核开发环境包括:代码编辑环境、编译环境、运行环境、调试环境等。

2.下载并编译i386(32位)内核,并利用qemu启动内核。

3.熟悉制作initramfs的方法。

4.编写简单应用程序随内核启动运行。

5.编译i386版本的Busybox,随内核启动,构建简单的OS。

6.开启远程调试功能,进行调试跟踪代码运行。

7.撰写实验报告。

  1. 实验过程

2.1环境配置:

安装Linux环境,使用VMware启动虚拟机。

安装Ubuntu 18.04桌面版并更换下载源为清华源。

安装所需工具和软件,如binutils、gcc、nasm、qemu、cmake等。

在VSCode中安装汇编和C/C++插件。

2.2编译Linux内核:

下载Linux内核并解压。

配置内核编译环境并编译为32位版本。

生成Linux压缩镜像和符号表。

2.3启动内核并调试:

使用qemu启动内核并开启远程调试。

在另一个终端启动gdb,加载符号表并连接qemu进行调试。

在gdb中设置断点并运行内核。

2.4制作Initramfs:

编写一个简单的Hello World程序,并编译为32位可执行文件。

使用cpio将程序打包成initramfs。

启动内核并加载initramfs。

gdb调试,观察结果

2.5编译并启动Busybox:

下载、解压并编译Busybox。

在编译配置中选择生成静态二进制文件并指定32位和i386架构。

打包mybusybox内容为cpio文件作为initramfs供linux内核启动执行。

加载busybox启动QEMU通过ls命令查看文件夹内容

  1. 关键代码:

qemu-system-i386 -kernel linux-5.10.19/arch/x86/boot/bzImage -initrd hwinitramfs -s -S -append “console=ttyS0 rdinit=helloworld” -nographic

qemu-system-i386 -kernel linux-5.10.19/arch/x86/boot/bzImage -initrd initramfs-busybox-x86.cpio.gz -nographic -append “console=ttyS0”

kernel linux-5.10.19/arch/x86/boot/bzImage指定了内核映像文件的路径。在这里,它指定了 Linux 内核 的位置。-initrd hwinitramfs:这个选项指定了 initramfs 文件的路径。initramfs 是一个临时文件系统,用于在系统引导过程中加载必要的驱动程序和文件。

-s 和 -S:这两个选项用于 GDB 调试。-s 启用了 GDB 服务器,而 -S 则在启动时暂停了虚拟机,以便您可以附加 GDB 调试器。

-append “console=ttyS0 rdinit=helloworld”:这个选项指定了内核启动参数。具体来说:

console=ttyS0:将控制台输出重定向到串口终端。

rdinit=helloworld:指定了 initramfs 中的初始进程或脚本。在这里,它是一个名为 “helloworld” 的脚本。

-nographic:这个选项禁用了图形界面.

这段代码启动了一个基于 Linux 内核 的虚拟机,并在 GDB 调试模式下运行,同时使用 initramfs 作为初始文件系统。

  1. 实验结果

4.1环境配置:

换源:

配置c,c++环境

4.2****编译Linux内核:

命令行输入menuconfig会打开一个图形界面,在打开的图像界面中依次选择Kernel hackingCompile-time checks and compiler options,最后在**[ ] Compile the kernel with debug info输入Y**勾选,保存退出。

命令行输入make -j8编译内核

Linux压缩镜像linux-5.10.19/arch/x86/boot/bzImage和符号表linux-5.10.19/vmlinux已经生成。

4.3启动内核并调试:

4.4制作Initramfs:

重复gdb的调试过程,可以看到qemu中输出了lab1: Hello World\n

4.5编译并启动Busybox:

在编译配置中选择生成静态二进制文件并指定32位和i386架构。

进入settings,然后在Build static binary(no shared libs)处输入Y勾选,然后ENTER选中**() Additional CFLAGS并键入-m32 -march=i386**,

Linux内核做initramfs启动执行后使用ls命令查看当前文件夹

  1. 总结

在这次实验中,我了解了Linux内核的编译、启动和调试过程,并通过制作和加载initramfs实现了自定义的启动流程。通过这些实践,我加深了对Linux操作系统的理解,掌握了一些关于linux命令的基本技能和概念,并为进一步的实验奠定了基础。

具体地说:

环境配置:成功配置了Linux开发环境,包括安装虚拟机、选择合适的Linux版本、安装必要的工具和软件等。

内核编译:通过下载、配置和编译Linux内核,获得了32位内核。掌握内核编译的过程对于理解Linux内核的构建和定制具有重要意义。

内核启动和调试:使用qemu启动内核,并通过gdb进行远程调试,可以在内核的启动过程中设置断点、查看变量和调试代码。

制作和加载initramfs:通过编写简单的程序和脚本,并使用cpio打包为initramfs,我们能够在内核启动时加载并运行自定义的用户空间程序。