陈巧然原创作品 转载请注明出处  
《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

使用gdb跟踪分析一个系统调用中断处理过程,分析系统调用从system_call开始到iret结束之间的整个过程。

实验过程:

登陆实验楼虚拟机http://www.shiyanlou.com/courses/195

打开shell终端,执行以下命令:

cd LinuxKernel

rm -rf menu

git clone https://github.com/mengning/menu.git

获取到MenuOS源码后修改test.c文件,加入getuid系统调用函数源码,Getuid为调用C API版本,GetuidAsm为内嵌汇编语言版本

增加命令菜单

在menu目录下执行

make rootfs

改造后的MenuOS系统会自动编译并启动运行

执行getuid和getuid-asm命令可以看到执行结果

结束qmeu,以调试方式启动,在LinuxKernel目录下执行

qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S

打开另一个shell终端,进入gdb调试工具

gdb

读入符号表

file linux-3.18.6/vmlinux

连接内核调试

target remote:1234

设置断点

b sys_getuid16

继续执行

c

列出代码

list

继续单步执行后续操作

s

实验分析:

通过上述实验过程可以分析出在Linux系统下发生一次系统调用后system_call中断处理的整个过程。

当在应用程序中调用获取当前用户uid函数getuid(),将对应的系统调用号0x18送入eax寄存器,由于没有其他参数,ebx寄存器赋值为0,执行init 0x80汇编语言指令,从用户态切换到内核态,触发系统调用中断,在system_call的最后是iret汇编语言指令,从系统调用退出,从内核态切换回用户态。

system_call()函数

首先把系统调用号和这个异常处理程序可以用到的所有CPU寄存器保存到相应的栈中,不包括由控制单元已自动保存的eflags、cs、eip、ss和esp寄存器。

pushl %eax

SAVE_ALL

movl $0xffffe000, %ebx /* or 0xfffff000 for 4-KB stacks */

andl %esp, %ebx

接下来检查thread_info结构flag字段的TIF_SYSCALL_TRACE和TIF_SYSCALL_AUDIT标志之一是否被置为1,即检查是否有某一调试程序正在跟踪执行程序对系统调用的调用。

如果系统调用号无效则把-ENOSYS值存放在栈中曾保存eax寄存器的单元中,当进程恢复在用户态的执行时会在eax中得到一个负的返回码。

cmpl $NR_syscalls, %eax

jb nobadsys

movl $(-ENOSYS), 24(%esp)

jmp resume_userspaces

最后调用与eax中所包含的系统调用号对应的特定服务例程。

call *sys_call_table(0, %eax, 4)

从系统调用退出

当系统调用服务例程结束时,system_call()函数从eax获得返回值,并保存在曾经保存用户态eax寄存器值的栈单元位置上,用户态进程将在eax中找到系统调用的返回码。

movl %eax, 24(%esp)

system_call()函数关闭本地中断并检查当前进程的thread_info结构中的标志,如果所有的标志都没有被设置函数就会跳转到restore_all标记处,恢复保存在内核栈中的寄存器的值,并执行iret汇编语言指令以重新开始执行用户态进程。

cli

movl 8(%ebp), %ecx

testw $0xffff, %cx

je restore_all

实验总结:

Linux内核在启动初始化期间会调用trap_init()函数设置向量128(十六进制0x80)对应的内核入口点。当初始化完毕后,程序需要执行系统调用时,只需执行init 0x80语句,发生一个向量128的中断即可。

系统调用本质上是发生了一次软件中断。

转载于:https://www.cnblogs.com/20135310cqr/p/5307178.html

Linux内核设计第五周学习总结 分析system_call中断处理过程相关推荐

  1. linux内核设计与实现 epub_Epoll学习服务器的简单实现-Linux内核Epoll结构

    1.Begins~ 有的人学习linux编程很久,只知道网络编程是socket,bind, listen...,然而这些都是网络通信软件最基本的接口.在某网络公司待了y,也了解到公司的基础就是网络转发 ...

  2. Linux内核设计与实现学习笔记目录

    **注:**这是别人的笔记,我只是把目录抄过来 <Linux内核设计与实现学习笔记> 1.<Linux内核设计与实现>读书笔记(一)-内核简介 2.<Linux内核设计与 ...

  3. 学习Linux内核必读的五本书

    一.<深入理解Linux内核> 推荐等级:5颗星 为了透彻理解Linux的工作机理,以及为何它在各种系统上能顺畅运行,你需要深入到内核的心脏.cPu与外部世界的所有交互活动都是由内核处理的 ...

  4. 读《Linux内核设计与实现》我想到了这些书

          从题目中可以看到,这篇文章是以我读<Linux内核设计与实现>而想到的其他我读过的书,所以,这篇文章的主要支撑点是<Linux内核>.       开始读这本书已经 ...

  5. 读 Linux内核设计与实现 我想到了这些书

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴!     ...

  6. 初探内核之《Linux内核设计与实现》笔记下

    定时器和时间管理 系统中有很多与时间相关的程序(比如定期执行的任务,某一时间执行的任务,推迟一段时间执行的任务),因此,时间的管理对于linux来说非常重要. 主要内容: 系统时间 定时器 定时器相关 ...

  7. 初探内核之《Linux内核设计与实现》笔记上

    内核简介  本篇简单介绍内核相关的基本概念. 主要内容: 单内核和微内核 内核版本号 1. 单内核和微内核   原理 优势 劣势 单内核 整个内核都在一个大内核地址空间上运行. 1. 简单. 2. 高 ...

  8. 漫谈 | 从52个思考题来看《Linux内核设计的艺术》

    本文纯属学习笔记,为个人理解,内容正确性不能保证.访问请移步至(David's Wikipedia) https://www.qingdujun.com/ ,这里有能"击穿"平行宇 ...

  9. 《linux内核设计分析》 第一周作业

    linux 基础入门 课程总结 一.linux系统简介 linux操作系统 整个计算机可以分为 硬件 内核 系统调用 应用程序 操作系统就属于内核和系统调用这两部分 操作系统历史发展 批处理操作系统 ...

最新文章

  1. alpine 编译c语言,Docker alpine中编译和测试Go RocketMQ Client
  2. Oracle备份恢复一(手动备份)
  3. ISE中使用Notepad++的关联设置以及Notepad++的护眼设置(设置背景色)
  4. Laya 位图字体制作(失败...)
  5. Android 插件技术实战总结
  6. JVM -- Java虚拟机
  7. C# 彻底搞懂async/await
  8. Android之使用AlertDialog.Builder类创建带列表的对话框和带自己所布局视图的对话框
  9. PATH和CLASSPATH
  10. Windows直接获取文件的哈希值
  11. Access denied (403) see security.limit_extensions
  12. 集成稳压电源的分类及特性
  13. Solidity函数中pure、view、constant的用法
  14. 易基因 | 表观技术:单细胞及微量细胞全基因组重亚硫酸盐甲基化测序(scWGBS)
  15. 数字电路设计之RTL编码指导原则
  16. 下载微信公众号视频文件
  17. 《Spring Cloud、Nginx高并发核心编程》读书笔记【END】
  18. Codeforces Round #401 (Div. 2) D Cloud of Hashtags —— 串
  19. 深度学习系列24:开源抠图算法
  20. 计算机一级msoffice考试操作题教程,2014年计算机一级考试MSOffice第三章考点解析 10...

热门文章

  1. 嵌入式linux内存使用和性能优化
  2. C#表达式,类型和变量
  3. 使用docker制作hexo镜像
  4. 对称加密算法AES之GCM模式简介及在OpenSSL中使用举例
  5. 概率论中均值、方差、标准差介绍及C++/OpenCV/Eigen的三种实现
  6. 【OpenCV】正确创建用于保存YUV420P格式的cv::Mat
  7. mysql分组和where条件查询_【MySQL】:分组查询where和having
  8. android studio同步代码块,Android Studio快捷键大全
  9. 怎样在表格中选出同一类_超超超超实用的年会策划执行表格模板合集!
  10. 世界上最大的超级计算机,科学网—区块链(blockchain)如何能造出世界上最大的超级计算机? - 刘进平的博文...