sf
1 | dfsf |
本科生实验报告
实验课程: 操作系统
实验名称: lab1 编译内核/利用已有内核构建OS
- 实验要求
独立完成实验5个部分 环境配置 、 编译****Linux内核、 Qemu启动内核并开启远程调试 、制作Initramfs和 编译并启动Busybox**** 。
1.搭建OS内核开发环境包括:代码编辑环境、编译环境、运行环境、调试环境等。
2.下载并编译i386(32位)内核,并利用qemu启动内核。
3.熟悉制作initramfs的方法。
4.编写简单应用程序随内核启动运行。
5.编译i386版本的Busybox,随内核启动,构建简单的OS。
6.开启远程调试功能,进行调试跟踪代码运行。
7.撰写实验报告。
- 实验过程
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命令查看文件夹内容
- 关键代码:
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 作为初始文件系统。
- 实验结果
4.1环境配置:
换源:
配置c,c++环境
4.2****编译Linux内核:
命令行输入menuconfig会打开一个图形界面,在打开的图像界面中依次选择Kernel hacking、Compile-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命令查看当前文件夹
- 总结
在这次实验中,我了解了Linux内核的编译、启动和调试过程,并通过制作和加载initramfs实现了自定义的启动流程。通过这些实践,我加深了对Linux操作系统的理解,掌握了一些关于linux命令的基本技能和概念,并为进一步的实验奠定了基础。
具体地说:
环境配置:成功配置了Linux开发环境,包括安装虚拟机、选择合适的Linux版本、安装必要的工具和软件等。
内核编译:通过下载、配置和编译Linux内核,获得了32位内核。掌握内核编译的过程对于理解Linux内核的构建和定制具有重要意义。
内核启动和调试:使用qemu启动内核,并通过gdb进行远程调试,可以在内核的启动过程中设置断点、查看变量和调试代码。
制作和加载initramfs:通过编写简单的程序和脚本,并使用cpio打包为initramfs,我们能够在内核启动时加载并运行自定义的用户空间程序。