20135332武西垚

  1. 在MenuOS中通过添加代码增加自定义的系统调用命令
  2. 使用gdb跟踪调试内核
  3. 简单分析system_call代码了解系统调用在内核代码中的处理过程

由于本周实验是在Kali虚拟机上进行操作的,具体实现过程中的代码和实验楼里的环境有一定的差异,在解决了各种报错之后终于完成了实验,在这次的实验报告中将较为详细的记录实验过程中遇到的问题以及解决方案,以便以后更加熟练地理解与掌握Kali的操作原理和步骤。

实验——分析system_call中断处理过程

给MenuOS增加time和time-asm命令

  • 在源代码中增加getpid和getpid-asm的代码

    Kali虚拟机中menu文件夹存放的目录为/home/YL/menu,打开目录即可看到内核相关代码,通过vim test.c指令打开并编辑源代码,在其中加入自定义添加的函数代码

  • 在main函数中增加MenuConfig

    在main函数中添加对应的函数调用代码,格式与代码中原有的函数调用格式保持一致。

  • make rootfs(将分步编译的过程编写在脚本当中自动生成)

    进行这一步的时候无论是使用make rootfs脚本编译还是make all都会出现错误:Nothing to be done,make clean指令也无效。其原因是该文件目录下有一个名为rootfs的文件夹,导致编译失败,删除该文件夹后即可成功编译,结果如下图所示。

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

  • 启动内核到调试状态

    qemu-system-x86_64 -kernel bzImage -initrd /home/YL/rootfs.img -S -s
  • 重新启动一个终端进行调试

    在内核中加载符号表:

    file /usr/src/linux-source-4.4/vmlinux

    由于Kali是64位机所以要进行设置否则会报错"Remote 'g'packet reply is too long"。

    set arch i386:x86-64

    之后使用1234端口连接并开始调试。运行结果如下图所示。

  • 设置断点并单步跟踪调试

    注意不能在start _ kernel处设置断点因为此时还没有完整设置好64位的运行环境,因此无法设置断点进行调试。

    s单步执行,sys _ getpid 函数返回之后进入汇编代码处理,gdb无法继续跟踪,在sys _ call处设置断点也无法停下来调试。

系统调用在内核代码中的处理过程

系统调用在内核代码中的工作机制和初始化

系统调用的工作机制

系统调用机制的初始化

\init\main.c start _ kernel中调用了trap _ init()函数。

\arch\x86\kernel\traps.c代码中定义了系统调用的初始化。

#ifdef CONFIG_X86_32
set_system_trap_gate(SYSCALL_VECTOR, &system_call);
//系统调用的中断向量和system_call的入口。一旦执行0x80,系统就自动跳转到system _call执行
set_bit(SYSCALL_VECTOR, used_vectors);
#endif
分析system_call伪代码
ENTRY(system_call)          #0x80的下一条 指令
RING0_INT_FRAME # can't unwind into user space anyway
ASM_CLAC
pushl_cfi %eax # save orig_eax
SAVE_ALL # 保存系统寄存器信息
GET_THREAD_INFO(%ebp) # 获取thread_info结构的信息
# system call tracing in operation / emulation
testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%ebp) # 测试是否有系统跟踪
jnz syscall_trace_entry # 如果有系统跟踪,先执行,然后再回来
cmpl $(NR_syscalls), %eax # 比较eax中的系统调用号和最大syscall,超过则无效
jae syscall_badsys # 无效的系统调用 直接返回
syscall_call:
call *sys_call_table(,%eax,4) # 调用实际的系统调用程序
syscall_after_call:
movl %eax,PT_EAX(%esp) # 将系统调用的返回值eax存储在栈中
syscall_exit:
LOCKDEP_SYS_EXIT
DISABLE_INTERRUPTS(CLBR_ANY) # make sure we don't miss an interrupt TRACE_IRQS_OFF
movl TI_flags(%ebp), %ecx
testl $_TIF_ALLWORK_MASK, %ecx # 判断当前的任务是否需要进程调度
jne syscall_exit_work # 未完成,则去执行这些任务
restore_all:
TRACE_IRQS_IRET # iret 从系统调用返回
系统调用流程分析

Linux内核第五节 20135332武西垚的更多相关文章

  1. Linux内核第四节 20135332武西垚

    实验目的: 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 实验过程: 查看系统调用列表 get pid 函数 #include <stdio.h> #include & ...

  2. Linux内核第六节 20135332武西垚

    如何描述一个进程:进程描述符的数据结构: 如何创建一个进程:内核是如何执行的,以及新创建的进程从哪里开始执行: 使用gdb跟踪新进程的创建过程. 进程的描述 操作系统三大功能: 进程管理(最核心最基础 ...

  3. Linux内核第七节 20135332武西垚

    预处理.编译.链接和目标文件的格式 可执行程序是怎么得来的 以C语言为例,c代码经过编译器的预处理,编译成汇编代码,由汇编器编译成目标代码,再链接成可执行文件,由操作系统加载到cpu里来执行. (截图 ...

  4. Linux内核总结博客 20135332武西垚

    http://www.cnblogs.com/wuxiyao/p/5220677.htmlhttp://www.cnblogs.com/wuxiyao/p/5247571.htmlhttp://www ...

  5. Linux内核第三节 20135332武西垚

    总结部分: Linux内核源代码: Arch 支持不同cpu的源代码:主要关注x86 Init   内核启动的相关代码:主要关注main.c,整个Linux内核启动代码start_kernel函数 K ...

  6. Linux内核第八节 20135332武西垚

    第一种分类: I/O-bound:频繁进行I/O,并且需要花费很多时间等待I/O完成 CPU-bound:计算密集,需要大量的CPU时间进行运算 第二种分类: 批处理进程:不必与用户交互,常在后台进行 ...

  7. 【内核】嵌入式linux内核的五个子系统

    Perface Linux内核主要由进程调度(SCHED).内存管理(MM).虚拟文件系统(VFS).网络接口(NET)和进程间通信(IPC)5个子系统组成,如图1所示. 图1 Linux内核的组成部 ...

  8. linux内核(五)虚拟文件系统

    虚拟文件系统(VFS)是linux内核和具体I/O设备之间的封装的一层共通访问接口,通过这层接口,linux内核可以以同一的方式访问各种I/O设备. 虚拟文件系统本身是linux内核的一部分,是纯软件 ...

  9. (笔记)Linux内核学习(五)之中断推后处理机制

    一 中断 硬件通过中断与操作系统进行通信,通过对硬件驱动程序处注册中断处理程序,快速响应硬件的中断. 硬件中断优先级很高,打断当前正在执行的程序.有两种情况: 硬件中断在中断处理程序中处理 硬件中断延 ...

随机推荐

  1. SAP SD模块功能构成

  2. 软件工程实践_结对Task2_ student_department_matching

    1. 给出结对成员的学号及姓名. 结对成员 031502506 陈龙江 031502529 王国超 click 2.首页给出项目的Github链接. github:传送门 3. 贴出你们生成的一组最& ...

  3. 类的反射_reflex

    JAVA反射机制 JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为j ...

  4. SQL Server2008 4064错误

    无法打开用户默认数据库,登录失败,其原因是登录帐户的默认数据库被删除.    解决办法是使用管理员帐户修改此登录帐户的默认数据库.   1.使用管理员帐号登入企业管理器,在"对象资源管理器& ...

  5. PostgreSQL9.6+PostGIS2.3学习笔记(一)导入shp文件

    一. 建库以及准备工作:(使用pgAdmin4直接建库) 打开pgAdmin4,如下图所示create–>Database 输入database的名字,如下图,输入完成即可选择save进行保存. ...

  6. ArcEngine中加载ArcGIS Server地图服务

    代码如下: private void addMapServerLayer(object sender, EventArgs e)  {             IActiveView pActiveV ...

  7. 【剑指offer】推断二叉树平衡

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/mmc_maodun/article/details/27242575 转载请注明出处:http:// ...

  8. BZOJ1041:[HAOI2008]圆上的整点(数论)

    Description 求一个给定的圆(x^2+y^2=r^2),在圆周上有多少个点的坐标是整数. Input 只有一个正整数n,n<=2000 000 000 Output 整点个数 Samp ...

  9. QT 14 线程使用

    1 线程基础 QThread 是对本地平台线程的一个非常好的跨平台抽象.启动一个线程非常简单.让我们看一段代码,它产生另一个线程,该线程打印hello,然后退出. // hellothread/hel ...

  10. go标准库的学习-net/rpc/jsonrpc

    参考:https://studygolang.com/pkgdoc 导入方式: import "net/rpc/jsonrpc" jsonrpc包实现了JSON-RPC的Clien ...