分析system_call中断处理过程

网易云课堂《Linux内核分析》作业

实验目的:

使用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为内嵌汇编语言版本

1

增加命令菜单

2

在menu目录下执行

make rootfs

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

3

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

4

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

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

5

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

gdb

读入符号表

file linux-3.18.6/vmlinux

连接内核调试

target remote:1234

6

设置断点

b sys_getuid16

继续执行

c

7

列出代码

list

8

继续单步执行后续操作

s

9

实验分析:

通过上述实验过程可以分析出在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的中断即可。

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

部分资料参考《深入理解Linux内核》

aapu原创作品转载请注明出处《Linux内核分析》MOOC课

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容