Linux第五周学习总结——扒开系统调用的三层皮(下)

作者:刘浩晨

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

一、给MenuOS增加time和time-asm命令

1. 克隆并自动编译MenuOS

2. test.c中main函数里,增加MenuConfig

3. 增加函数:

对应的两个函数:Time和TimeAsm。在下图中可以看到有了这两个调用

4.make rootfs

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

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

gdb命令:

• file linux-3.18.6/vmlinux:加载符号表
• target remote:1234:连接到需要调试的menuos里
• b sys_time:在系统调用time的位置设置断点
• c:在MenuOs里使用time,停在断点处
• s:如果但单步执行就会进入schedule函数
• finish:执行完整个函数

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

执行完int 0x80后从system_call开始:

另外还有:

• SAVE_ALL:保存现场
• call *sys_call_table(,%eax,4)调用了系统调度处理函数,eax存系统调用号,是实际的系统调度程序。
• sys_call_table:系统调用分派表
• syscall_after_all:保存返回值
• sys_exit_work里有进程调度时机,若无sys_exit_work,就执行restore_all恢复,返回用户态。
• work_pending -> work_notifysig,用来处理信号
• call schedule:进程调度代码
• restore_all:恢复现场。
• INTERRUPT_RETURN(iret):结束。

注意:在系统调用返回之前,可能会发生进程调度,当前进程间可能有信号需要处理。

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

继续使用上次实验选择的getuid,代码:

int Getuid(int argc ,char *argv)
{
pid_t uu;
uu=getuid();
printf("uu = %d \n", uu);
return 0;
} int GetuidAsm(int argc ,char *argv)
{
pid_t uu;
uu = getuid();
asm volatile(
"mov $0x24,%%eax\n\t"
"int $0x80\n\t"
"mov %%eax,%0\n\t"
:"=m"(uu)
);
printf("uu = %d \n",uu);
return 0;
}

步骤:

1.先rm menu -rf强制删除原有的menu文件夹,使用git命令更新menu代码至最新版。

2.在test.c中增加Getuid()和GetuidAsm()函数

3.make rootfs自动编译生成根文件系统

4.调试:

5.设置断点:

6.单步运行直至finish运行到最后

从system_call开始到iret结束过程流程图

Linux第五周学习总结——扒开系统调用的三层皮(下的更多相关文章

  1. 20135337朱荟潼 Linux第五周学习总结——扒开系统调用的三层皮(下)

    朱荟潼 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课http://mooc.study.163.com/course/USTC 1000029000 一.学习内容 (一 ...

  2. LINUX内核分析第五周学习总结——扒开系统调用的“三层皮”(下)

    LINUX内核分析第五周学习总结--扒开系统调用的"三层皮"(下) 标签(空格分隔): 20135321余佳源 余佳源 原创作品转载请注明出处 <Linux内核分析>M ...

  3. 《Linux内核分析》第五周学习总结 扒开系统调用的三层皮(下)

    扒开系统调用的三层皮(下) 郝智宇 无转载 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.给Men ...

  4. #Linux第四周学习总结——扒开系统调用的三层皮(上)

    Linux第四周学习总结--扒开系统调用的三层皮(上) 一.用户态.内核态和中断 系统调用通过库函数. 1.用户态和内核态 区分(不同的指令执行级别): 用户态:在相应的低执行状态下,代码的掌控范围受 ...

  5. LINUX内核分析第四周学习总结——扒开系统调用的“三层皮”

    LINUX内核分析第四周学习总结--扒开系统调用的"三层皮" 标签(空格分隔): 20135321余佳源 余佳源 原创作品转载请注明出处 <Linux内核分析>MOOC ...

  6. 《Linux内核分析》第四周 扒开系统调用的“三层皮”

    [刘蔚然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] WEEK FOUR( ...

  7. Linux内核及分析 第四周 扒开系统调用的三层皮(上)

    实验过程 选择20号系统调用getpid(取得进程识别码) 在网上查询getpid函数的C语言代码以及其嵌入式汇编语句 C语言代码: #include <stdio.h> #include ...

  8. 20135337朱荟潼 Linux第四周学习总结——扒开系统调用的三层皮(上)

    朱荟潼 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课http://mooc.study.163.com/course/USTC 1000029000 知识点梳理 一.用 ...

  9. LINUX内核分析第五周学习总结——扒开应用系统的三层皮(下)

    LINUX内核分析第五周学习总结——扒开应用系统的三层皮(下) 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/cou ...

随机推荐

  1. SDN2017 第五次实验作业

    实验目的 1.搭建如下拓扑并连接控制器 2.下发相关流表和组表实现负载均衡 3.抓包分析验证负载均衡 实验步骤 建立以下拓扑,并连接上ODL控制器. 利用ODL下发组表.流表,实现建议负载均衡 s1组 ...

  2. Beyond Compare使用

    1.通过过滤功能设置要比较的文件: 2.all,diff功能适用于文件本身的差异以及目录的差异 其它问题: 1.Beyond Compare比较文件时,相同的文件也显示为红色(有差异) http:// ...

  3. MyBatis insert操作插入,返回主键from官方

    下面就是 insert,update 和 delete 语句的示例: <insert id="insertAuthor" parameterType="domain ...

  4. 11.C++和C的区别,什么是面向对象

    c++封装更好,调用接口,c调用子函数 1.首先C和C++在基础语句上没有太大区别,c++在c基础上改进,兼容大部分c的语法结构.c++面向对象,c面向过程. 2.新增new和delete的语法,引用 ...

  5. 谈谈HTTP

    HTTP又称超文本传输协议,在互联网上广为流传和应用. 今天主要讲这么几个? a.针对HTTP下细分为: HTTP概念.Request和Response详解.Request中GET和POST的区别.说 ...

  6. vSphere虚拟化管理平台的功能

    VMware vSphere® 提供全球领先的虚拟化平台,用于构建云计算基础架构. vSphere 有哪些功能 强大的计算能力 虚拟化 x86 服务器资源并将其聚合成逻辑池,用于分配多个工作负载. 网 ...

  7. 第4章 初识STM32

    第4章     初识STM32 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/firege ...

  8. 关于C#中async/await中的异常处理(上)-(转载)

    在同步编程中,一旦出现错误就会抛出异常,我们可以使用try…catch来捕捉异常,而未被捕获的异常则会不断向上传递,形成一个简单而统一的错误处理机制.不过对于异步编程来说,异常处理一直是件麻烦的事情, ...

  9. 【H5】复制粘贴

    源文案地址 使用案例 案例1:复制分享链接 function copyTextToClipboard(text) { var textArea = document.createElement(&qu ...

  10. android环境的搭配

    android环境一般采用的是adt bundle 下载地址如下: http://tools.android-studio.org/index.php/adt-bundle-plugin 根据自己jd ...