总结一句话:系统调用的本质,通过sc指令触发异常,完成用户态到内核的转换。

展开一些:应用程序调用fork(),fork()是一个glibc函数,该函数的最底层调用sc指令,触发cpu异常,从而完成从用户态到内核态的切换,

内核:在异常处理中完成fork()的内核态处理,然后通过rfi指令返回到用户态。

一、用户态代码分析(glibc代码库)

1、fork()定义:

文件:fork.c (sysdeps\nptl)

可见,fork 是一个别名,其函数原本是__libc_fork(),看这个函数的定义,

2、__libc_fork()定义:

  文件:同上

。。。。。。 (函数较长)

经过分析,不同cpu进入内核态的软中断指令是不一样的,所以,一定会有和cpu有关的定义。果然,如下,

从源码上可以看出,如果没定义ARCH_FORK宏,系统会报错的。

3、powerpc的ARCH_FORK()宏定义

  文件:arch-fork.h (sysdeps\unix\sysv\linux\powerpc)

此文件中就只有一行代码。竟然是包含x86的源码文件。

  x86的源码如下:

  文件:arch-fork.h (sysdeps\unix\sysv\linux\i386)

  

4、INLINE_SYSCALL的定义:

  文件:sysdep.h (sysdeps\unix\sysv\linux\powerpc\powerpc32)

  

5、INTERNAL_SYSCALL的定义:

  文件:同上

  

__NR_##name 是一种编程技巧,两个#表示把前后粘贴在一起,其实这个宏就是 __NR_clone

6、__NR_clone宏定义

  文件:clone.S (sysdeps\unix\sysv\linux\i386)

  

7、INTERNAL_SYSCALL_NCS 宏定义

  文件:sysdep.h (sysdeps\unix\sysv\linux\powerpc\powerpc32)

  

8、准备参数 LOADARGS_5

  文件:sysdep.h (sysdeps\unix\sysv\linux\powerpc\powerpc32)

  

  从这个代码看,核心思想是,将120这个数字填入r0,这个是系统调用号,后面的r3,r4,r5,r6,r7就是参数

9、软中断汇编指令sc,触发系统异常

  芯片资料上的描述如下:

二、内核处理:(Linux 2.6.32源码)

1、ppc_clone()异常处理入口:

  文件:entry_32.S (arch\powerpc\kernel)

  内容:

  

2、sys_clone的定义:

  文件:process.c (arch\powerpc\kernel)

  内容:

  

3、do_fork()函数实现:

  文件:fork.c (kernel)

  内容:

  

  。。。。。。(内容较长)

4、从异常处理中返回 RFI

文件:ppc_asm.h (arch\powerpc\include\asm)

  内容:

  

系统调用fork()在powerpc上的源码分析的更多相关文章

  1. Spring5.x源码分析 | 从踩坑到放弃之环境搭建

    Spring5.x源码分析--从踩坑到放弃之环境搭建 前言 自从Spring发行4.x后,很久没去好好看过Spring源码了,加上最近半年工作都是偏管理和参与设计为主,在技术细节上或多或少有点疏忽,最 ...

  2. java使用websocket,并且获取HttpSession,源码分析

    转载请在页首注明作者与出处 http://www.cnblogs.com/zhuxiaojie/p/6238826.html 一:本文使用范围 此文不仅仅局限于spring boot,普通的sprin ...

  3. Android源码分析—深入认识AsyncTask内部机制

    本文转载http://blog.csdn.net/singwhatiwanna/article/details/17596225该博主博文,谢谢该博主提供的好文章! 前言 什么是AsyncTask,相 ...

  4. 死磕 java集合之SynchronousQueue源码分析

    问题 (1)SynchronousQueue的实现方式? (2)SynchronousQueue真的是无缓冲的吗? (3)SynchronousQueue在高并发情景下会有什么问题? 简介 Synch ...

  5. ranch 源码分析(完)

    接上 ranch 源码分析(三) 在上一次,根据ranch源码把大概流程理了一遍,下面我们将一些细节解释一下. ranch只是一个服务的框架,它提供了传输层协议代码(ranch_tcp 和ranch_ ...

  6. ranch 源码分析(三)

    接上ranch 源码分析(二) 上次讲到了ranch_conns_sup和ranch_acceptors_sup这2个ranch的核心模块,我们接着分析 首先查看ranch_conns_sup.erl ...

  7. ranch 源码分析(二)

    接上ranch 源码分析(一) 上次讲到了ranch.erl的start_listener函数,下面我们详细分析下这个函数 -module(ranch). %...... 省略若干行 -spec st ...

  8. 【异常及源码分析】org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping

    一.异常出现的场景 1)异常出现的SQL @Select("SELECT\n" + " id,discount_type ,min_charge, ${cardFee} ...

  9. Spring IOC 容器源码分析 - 填充属性到 bean 原始对象

    1. 简介 本篇文章,我们来一起了解一下 Spring 是如何将配置文件中的属性值填充到 bean 对象中的.我在前面几篇文章中介绍过 Spring 创建 bean 的流程,即 Spring 先通过反 ...

随机推荐

  1. Linux的用户管理(基础篇)

    用户相关 临时切换用户: su 用户名 完全切换用户: su – 用户名 查看当前登入的用户名: whoami 查看当前用户下的一切环境变量: env 登出当前登入的用户: logout 查看系统的用 ...

  2. 使用C语言实现一个自动刷弹幕的程序

    本文使用两种方式来进行刷弹幕操作 1 模拟键盘输入,自动输入文字,然后点击回车. 2 操作剪切板,直接将剪切板的文字粘贴到输入框,然后回车. 模拟键盘输入 如果要输入"弹幕"这两个 ...

  3. 【WebAPI】从零开始学会使用.NET Core WebAPI

    介绍 以后会慢慢总结在项目使用中或者学习到的webAPI相关的知识,在这里做记录. 我会从最开始的如何创建WebAPI项目到项目的后续知识一点一点的开始讲述记录. 通过简单有效的方式,让我们能够快速的 ...

  4. 纸上谈兵: 堆 (heap)

    纸上谈兵: 堆 (heap)   作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 堆(heap)又被为优先队列(priority ...

  5. Java-jsoup-解析HTML

    /**  * jsoup 是一款 Java 的HTML 解析器,可直接解析某个URL地址.HTML文本内容.它提供了一套非常省力的API,可通过DOM,CSS以及类似于JQuery的操作方法来取出和操 ...

  6. Ansible批量更新远程主机用户密码 (包括Ansible批量做ssh互信)

    按照集团运维信息安全制度, 需要每个一段时间对线上服务器密码进行一次变更,通过shell脚本部署比较繁琐,所以决定采用ansible脚本对远程主机root密码进行批量重置,该脚本已经在稳定运行在正式环 ...

  7. shell高效处理文本(1):xargs并行处理

    xargs具有并行处理的能力,在处理大文件时,如果应用得当,将大幅提升效率. xargs详细内容(全网最详细):https://www.cnblogs.com/f-ck-need-u/p/592592 ...

  8. C# 反射Reflection Assembly

    反射反射程序员的快乐 一:什么叫反射 反射:是.net framework提供的一个访问metadata的帮助类,可以获取信息并且使用 反射的优点:动态 反射的缺点:1:稍微麻烦  2:能避开编译器的 ...

  9. 一个简单的Code First建立

    1]从VS中建立一个mvc程序 记得添加NuGet包 然后在web.config中添加链接数据库的语句 <connectionStrings> <add name="Ent ...

  10. 去重分页sql语句

    ---恢复内容开始--- SELECT [TAGNAME] FROM ( SELECT tagname,ROW_NUMBER() OVER(order by tagname) AS RowNumber ...