深入理解系统调用
作者:互联网
一、实验要求
- 找一个系统调用,系统调用号为学号最后2位相同的系统调用
- 通过汇编指令触发该系统调用
- 通过gdb跟踪该系统调用的内核处理过程
- 重点阅读分析系统调用入口的保存现场、恢复现场和系统调用返回,以及重点关注系统调用过程中内核堆栈状态的变化
笔者学号最后2位为43,查阅得知为accept()函数。
二、实验环境搭建
1. 配置内核选项并编译
sudo apt install axel axel -n 20 https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.4.34.tar.xz xz -d linux-5.4.34.tar.xz tar -xvf linux-5.4.34.tar cd linux-5.4.34 make defconfig # Default configuration is based on 'x86_64_defconfig' make menuconfig make -j4 qemu-system-x86_64 -kernel arch/x86/boot/bzImage
2. 构造根文件并提供可执行程序
axel -n 20 https://busybox.net/downloads/busybox-1.31.1.tar.bz2 tar -jxvf busybox-1.31.1.tar.bz2 cd busybox-1.31.1 make menuconfig make -j4 && make install mkdir rootfs cd rootfs cp ../busybox-1.31.1/_install/* ./ -rf mkdir dev proc sys home sudo cp -a /dev/{null,console,tty,tty1,tty2,tty3,tty4} dev/
给init脚本添加权限
#!/bin/sh mount -t proc none /proc mount -t sysfs none /sys echo "Wellcome MengningOS!" echo "--------------------" cd home /bin/sh chmod +x init
打包根文件并测试
find . -print0 | cpio --null -ov --format=newc | gzip -9 > ../rootfs.cpio.gz qemu-system-x86_64 -kernel linux-5.4.34/arch/x86/boot/bzImage-initrd rootfs.cpio.gz
三、编写系统调用程序
编写程序 accept_43.c,代码如下:
int main() { asm volatile( "movl $0x2B,%eax\n\t" "syscall\n\t" ); printf("Hello accept"); return 0; }
用gcc静态编译,生成可执行文件,重新执行
gcc -o test_mincore test_mincore.c -static
find . -print0 | cpio --null -ov --format=newc | gzip -9 > ../rootfs.cpio.gz qemu-system-x86_64 -kernel linux-5.4.34/arch/x86/boot/bzImage -initrd rootfs.cpio.gz
启动qemu观察结果。
标签:调用,x86,tar,cpio,34,理解,深入,linux 来源: https://www.cnblogs.com/geekshawn/p/12973386.html