修改LINUX内核报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统实验一
一、基本信息:
实验题目:向Linux内核新增一个系统调用
完成人姓名:袁昌铃学号:71115138 报告日期:2017.3.18 二、实验目的:
通过实验,熟悉Linux操作系统的使用,掌握构建与启动Linux内核的方法;掌握用户程序如何利用系统调用与操作系统内核实现通信的方法,加深对系统调用机制的理解;进一步掌握如何向操作系统内核增加新的系统调用的方法,以扩展操作系统的功能。
三、实验内容:
1. Linux环境下的C或C++编译和调试工具的使用。
2. 向Linux内核增加新的系统调用,系统调用名称和功能自行定义,但必须实现如下输出功能:“My Student No. is ×××,and My Name is ×××”。
3. Linux新内核的编译、安装和配置。
4. 编写应用程序以测试新的系统调用并输出测试结果。
四、实验步骤:
准备
源码下载
内核源码下载
下载合适内核, 我选择的是目前最新的linux-4.10。
Busybox 源码下载
下载Busybox, 我选择的是目前最新的 busybox-1.26.2。
目录设置
上面两个源码压缩包下载后解压到下面对应目录。
o $KERNEL 内核工作目录
o
$LINUX Linux 内核源码目录 o $BUSYBOX Busybox
源码目录 PS: $KERNEL 目录是另外两个目录的父目录。
编译
kernel 编译 1 2 3 4 5 6 7 8 9 cd $LINUX # 此处应为你的 linux 源码根目录
make x86_64_defconfig
cat <
CONFIG_DEBUG_INFO=y
CONFIG_GDB_SCRIPTS=y
EOF
./scripts/kconfig/merge_config.sh .config .config-fragment
# -j? 可加快编译速度。若报错取消该选项方便查看报错信息
make bzImage -j4
若遇到编译报错
1 s cripts/sign-file.c:25:30: fatal error: openssl/opensslv.h: 没有那个文件或目录
安装 Openssl 即可
1 s udo apt-get install libssl-dev
Busybox 编译
设置编译选项
因为Linux 运行环境当中是不带动态库的,所以必须以静态方式来编译BusyBox 。
执行 1 2 cd $BUSYBOX
make menuconfig
选中 o Busybox Settings —>
o Build Options —>
o [*] Build BusyBox as a static binary(no shared libs)
正式编译
1 2 make
make install
qemu 安装
也可源码安装,这里我是 Ubuntu 直接用仓库装了。
1 s udo apt-get install qemu 通过 Qemu 模拟 Linux
在这里,我们将选择 busybox 中的 init 作为Linux 启动之后第一个执行的进程,而 init 所使用的启动将脚本便是etc/init.d/rcS 。
编写 initrd 启动脚本
1 2 3 cd $BUSYBOX /_install
mkdir -p proc sys dev etc etc/init.d
vim ./etc/init.d/rcS
rcS 中写入 1 2 3 4 5 6 #!/bin/sh
#将 proc 文件系统挂载到 /proc 目录中
mount -t proc proc /proc
#将 sys 文件系统挂载到 /sys 的目录上
mount -t sysfs sysfs /sys
#mdev 是 busybox 自带的一个 udev ,它是用于系统启动和
7 8 9 #热插拔或是动态加载驱动程序的时候,而自动产生设别节点的,
#这句话如果不加上的话,
这需要手动的 mknod 来挂载设备节点 /sbin/mdev -s
为 rcS 添加执行权限
1 c hmod +x ./etc/init.d/rcS 编写构建 initrd 镜像脚本
qemu 既然是模拟cpu 来产生指令,那么对于一个虚拟机而言必须要有一个磁盘才能够保证系统能够运行的起来。
所以在这里,我们将要制作的就是小的浓缩了 linux 文件系统的镜像文件,用来作为加载内核文件 bzImage 的一个载体。
创建一个可以生成名为 rootfs.img 的脚本文件 build-initrd.sh 。
1 2 cd $KERNEL
vim build-initrd.sh
写入 1 2 3 4 5 6 7 8 9 10 11 #!/bin/sh
#定义变量
KERNEL=$(pwd )
BUSYBOX=$(find busybox* -maxdepth 0)
LINUX=$(find linux* -maxdepth 0)
#通过cpio 创建镜像
cd $BUSYBOX /_install
find . | cpio -o --format=newc >$KERNEL /rootfs.img
cd $KERNEL
#通过gzip 创建zip 镜像
gzip -c rootfs.img > rootfs.img.gz
添加执行权限同上。
编写快速运行脚本
编写运行 qemu 将编译生成的内核文件 bzImage 加载到刚刚生成的 rootfs.img 文件中的脚本。
1 2 cd $KERNEL
vim run.sh