学号375
转载请注明出处 https://github.com/mengning/linuxkernel/
实验要求
编译内核5.0
qemu -kernel linux-5.0.1/arch/x86/boot/bzImage -initrd rootfs.img
选择系统调用号后两位与您的学号后两位相同的系统调用进行跟踪分析
https://github.com/mengning/menu
内核编译
1.首先下载linux内核5.0源码
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.0.tar.xz
2.解压缩并编译
xz -d linux-5.0.tar.xz
tar -xvf linux-5.0.tar
cd linux-5.0
make menuconfig
make
内核编译
制作文件
mkdir rootfs
git clone https://github.com/mengning/menu.git
cd menu
gcc -pthread -o init linktable.c menu.c test.c -m32 -static
cd ../rootfs
cp ../menu/init ./
find . | cpio -o -Hnewc |gzip -9 > ../rootfs.img
运行menuOS
qemu -kernel /home/wxy/linux-5.0.1/arch/x86/boot/bzImage -initrd ../rootfs.img
跟踪调试内核启动
qemu -kernel /home/wxy/linux-5.0.1/arch/x86/boot/bzImage -initrd ../rootfs.img -S -s -append nokaslr
gdb
(gdb)file linux-5.0.1/vmlinux
(gdb)target remote:1234
(gdb)break start_kernel
按c后qemu继续执行
我的学号是375,后两位是75。查看可知系统调用为 __NR_setrlimit。
该函数为:
#include <sys/resource.h>
int getrlimit(int resource, struct rlimit *rlim);
int setrlimit(int resource, const struct rlimit *rlim);
功能是获取或设定资源使用限制。每种资源都有相关的软硬限制,软限制是内核强加给相应资源的限制值,硬限制是软限制的最大值。非授权调用进程只可以将其软限制指定为0~硬限制范围中的某个值,同时能不可逆转地降低其硬限制。授权进程可以任意改变其软硬限制。RLIM_INFINITY的值表示不对资源限制。
在test.c中增加下列函数,准备跟踪:
重新编译执行
成功显示出重新设置空间大小后的值。
下面调用gdb进行调试:
实验总结
总的流程就是当发生系统调用时,int 0x80触发中断,系统保存现场后进入内核态,根据调用号寻找到相应的处理程序完成中断处理,结束后再返回。
系统调用的工作机制是:当用户态进程调用一个系统调用时,CPU切换到内核态并执行对应的内核函数,内核函数由操作系统预先定义并分配了编号,调用过程中系统通过eax寄存器传递调用函数的编号,通过编号寻找相应的中断处理程序完成所需的功能,完成后通过已保存的现场返回并继续往下执行。