2023-2024-1 20232828《Linux内核原理与分析》第六周作业

第六周
阅读学习教材「庖丁解牛Linux 分析 」第6章,有问题优先使用chatgpt等AI工具。或者到蓝墨云班课中提问,24小时内回复,鼓励解答别人问题,提问前请阅读「如何提问」。

教材深入学习关注豆列「Linux内核及安全」。

学习蓝墨云班课中第六周视频「扒开系统调用的三层皮?(下)」,并完成实验楼上配套实验五。,注意从下往上看。基于树莓派或其他平台完成ARM相关内容。

在本周日晚12:00前发学习博客(标题 学号《Linux内核原理与分析》第六周作业),重点是遇到的问题和解决方案内容涵盖教材学习和视频,格式用Markdown。不按时交作业会扣分。































































系统调用

首先进入内核
cd ~/LinuxKernel
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img

在这里插入图片描述

另起一个shell,修改test.c文件
cd menu
vim test.c

在这里插入图片描述
在test.c中添加mypid和mypid_asm函数:

在这里插入图片描述

int mypid(int argc, const char *argv[])
{
    pid_t zlrx;
    zlrx = getpid();
    printf("%u\n", zlrx);
    return 0;
}
int mypid_asm(int argc, const char *argv[])
{
    pid_t zlrx;
    asm volatile(
            "mov $0x14, %%eax\n\t"
            "int $0x80\n\t"
            "mov %%eax, %0\n\t"
            :"=m" (zlrx)
    		);
    printf("%u\n", zlrx);
    return 0;
}

同时需要在主函数中main添加对应的调用命令(与第四周的上课测验同样的步骤):
在这里插入图片描述

保存文件,然后重新编译并生成新的文件系统

make rootfs

可以看到已经成功增加自定义功能
在这里插入图片描述

使用gdb跟踪系统调用内核函数

start_kernel处设置断点

cd ~/LinuxKernel
gdb
file linux-3.18.6/vmlinux
target remote:1234
b start_kernel
c
b sys_time
c

在这里插入图片描述
由下图可知,接下来应该在sys_getpid处下断点
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
使用list打印sys_time对应的代码,并单步执行
在这里插入图片描述

流程解释:

开始时,用户程序发起系统调用。
系统调用之前,需要保存用户程序的寄存器状态。
切换到内核模式,以便在内核空间执行。
检查系统调用的参数是否合法。
找到对应的系统调用处理程序。
执行系统调用处理程序,完成相应的操作。
执行完系统调用后,切换回用户模式。
恢复之前保存的用户程序的寄存器状态。
返回到用户程序继续执行。

在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值