`
soboer
  • 浏览: 1312385 次
文章分类
社区版块
存档分类
最新评论

Linux 内核--fork()函数创建进程

 
阅读更多

本文分析基于Linux 0.11内核,转载请表明出处http://blog.csdn.net/yming0221/archive/2011/06/05/6527337.aspx

Linux在move_to_user_mode()之后,进程0通过fork()产生子进程实际就是进程1(init进程)。

其中fork()是通过内嵌汇编的形式给出

这样使用int 0x80中断,调用sys_fork系统调用来创建进程。详细过程如下:

系统在sched.c中sched_init()函数最后设置系统调用中断门

set_system_gate (0x80, &system_call);

设置系统调用的中断号。

通过int 0x80调用sys_fork()

其使用汇编实现

系统将堆栈的内容入栈,然后执行call _sys_call_table(,%eax,4)

调用地址 = _sys_call_table + %eax * 4

然后真正调用sys_fork()

然后调用find_empty_process()

该函数设置last_pid为最后可用不重复的pid号,然后返回task[]数组中空闲的项的index,存放在EAX中。

再将相应的寄存器 入栈,作为C函数的参数,调用copy_process()

这段代码的执行内容是:首先为进程分配内存,然后将新任务的指针放入上步查到的空闲task[]数组项中,然后复制父进程的内容后修改当前

进程的一部分属性和tss(任务状态段),最后设置新进程的代码段和数据段,限长,在GDT 中设置新任务的TSS 和LDT 描述符项,数据从task 结构中取。在任务切换时,任务寄存器tr 由CPU 自动加载。

set_tss_desc (gdt + (nr << 1) + FIRST_TSS_ENTRY, &(p->tss));

set_ldt_desc (gdt + (nr << 1) + FIRST_LDT_ENTRY, &(p->ldt));

p->state = TASK_RUNNING;

这样,新进程就创建完毕了。

其中复制页表函数copy_mem()待续.......

分享到:
评论

相关推荐

    Linux内核源代码情景分析 (上下册 高清非扫描 )

    丛书名: Linux内核源代码情景分析 出版社:浙江大学出版社 目录 第1章 预备知识 1.1 Linux内核简介. 1.2 Intel X86 CPU系列的寻址方式 1.3 i386的页式内存管理机制 1.4 Linux内核源代码中的C语言代码 1.5 Linux...

    linux-2.4.0内核源代码

     第一行首先通过copy_process()函数完成具体的进程创建工作,返回值类型为task_t类型。  第2行用函数 IS_ERR()分析copy_process()的返回值是否正确。如果正确则执行第3-7行代码。  这里分析一下接下来这几行代码...

    Linux内核情景分析

    1. 1 Linux内核简介 1. 2 Intel X86 CPU系列的寻址方式 1. 3 i386的页式内存管理机制 1. 4 Linux内核源代码中的C语言代码 1.5 Linux内核源代码中的汇编语言代码 第2章 存储管理 2.1 Linux内存管理的基本框架 2.2 ...

    Linux内核情景分析(非扫描版)

    1. 1 Linux内核简介 1. 2 Intel X86 CPU系列的寻址方式 1. 3 i386的页式内存管理机制 1. 4 Linux内核源代码中的C语言代码 1.5 Linux内核源代码中的汇编语言代码 第2章 存储管理 2.1 Linux内存管理的基本框架 2.2 ...

    linux 内核源代码分析

    1. 1 Linux内核简介 1. 2 Intel X86 CPU系列的寻址方式 1. 3 i386的页式内存管理机制 1. 4 Linux内核源代码中的C语言代码 1.5 Linux内核源代码中的汇编语言代码 第2章 存储管理 2.1 Linux内存管理的基本框架...

    linux内核源代码情景分析

    《linux内核源代码情景分析》(非扫描电子版本) 第1章 预备知识 1.1 Linux内核简介 1.2 Intel X86 CPU系列的寻址方式 1.3 i386的页式内存管理机制 1.4 Linux内核源代码中的C语言代码 1.5 Linux内核源代码中的...

    LINUX内核源代码情景分析

    1. 1 Linux内核简介 1. 2 Intel X86 CPU系列的寻址方式 1. 3 i386的页式内存管理机制 1. 4 Linux内核源代码中的C语言代码 1.5 Linux内核源代码中的汇编语言代码 第2章 存储管理 2.1 Linux内存管理的基本框架...

    linux内核 0.11版本源码 带中文注释

    * 我们需要下面这些内嵌语句 - 从内核空间创建进程(forking)将导致没有写时复制(COPY ON WRITE)!!! * 直到一个执行execve 调用。这对堆栈可能带来问题。处理的方法是在fork()调用之后不让main()使用 * 任何堆栈...

    Linux0.11内核main函数那些事

    本课程介绍Linux0.11版本内核如何人工设置第一个任务(task 0)以及任务0从内核态切换到用户态的详细...课程最后会介绍,任务0 fork()任务1 init进程的过程,以及在进程1中使用fork()创建登录shell及交互shell的过程。

    LINUX内核源代码情景分析(上).part1.rar

    1. 1 linux内核简介 1. 2 intel x86 cpu系列的寻址方式 1. 3 i386的页式内存管理机制 1. 4 linux内核源代码中的c语言代码 1.5 linux内核源代码中的汇编语言代码 第2章 存储管理 2.1 linux内存管理的基本框架...

    linux网络编程-宋敬彬-part3

    1.5.1 Linux内核的主要模块 7 1.5.2 Linux的文件结构 9 1.6 GNU通用公共许可证 10 1.6.1 GPL许可证的历史 10 1.6.2 GPL的自由理念 10 1.6.3 GPL的基本条款 11 1.6.4 关于GPL许可证的争议 12 1.7 Linux...

    linux网络编程-宋敬彬-part2

    1.5.1 Linux内核的主要模块 7 1.5.2 Linux的文件结构 9 1.6 GNU通用公共许可证 10 1.6.1 GPL许可证的历史 10 1.6.2 GPL的自由理念 10 1.6.3 GPL的基本条款 11 1.6.4 关于GPL许可证的争议 12 1.7 Linux...

    操作系统课程实验.rar

    (3) 若程序中调用了 linux 的内核函数,要求深入阅读相关函数源码。 实验二 linux 内核模块编程 设计目的 Linux 提供的模块机制能动态扩充 linux 功能而无需重新编译内核,已经广泛应用在 linux 内核的许多功能的...

    疯狂内核之——进程管理子系统

    1.3 进程的创建——do_fork()函数详解 19 1.4 执行进程间切换 33 1.4.1 进程切换之前的工作 33 1.4.2 进程切换实务 —— switch_to宏 37 1.4.3 __switch_to函数 39 1.5 fork与vfock系统调用的区别 42 1.6 内核线程 ...

    linux网络编程-宋敬彬-part1

    1.5.1 Linux内核的主要模块 7 1.5.2 Linux的文件结构 9 1.6 GNU通用公共许可证 10 1.6.1 GPL许可证的历史 10 1.6.2 GPL的自由理念 10 1.6.3 GPL的基本条款 11 1.6.4 关于GPL许可证的争议 12 1.7 Linux...

    清华大学Linux操作系统原理与应用

    3.5.1 创建进程 55 3.5.2 线程及其创建 56 3.6 与进程相关的系统调用及其应用 58 3.6.1 fork系统调用 58 3.6.2 exec系统调用 59 3.6.3 wait系统调用 60 3.6.4 exit系统调用 62 3.6.5 进程的一生 63 3.7 与调度相关的...

    浅谈Linux vfork与fork简单对比分析

    fork作用为创建一个子进程,在使用了fork命令后,内核会分配新的内存块和数据结构给子进程,并且将父进程的部分数据结构内容拷贝到子进程,最后再将子进程添加到系统进程列表中,添加完成后fork返回,开始调度。...

    linux系统编程之线程.zip

    实际上,无论是创建进程的fork,还是创建线程的pthread_create,底层实现都是调用同一个内核函数clone。 如果复制对方的地址空间,那么就产出一个“进程”;如果共享对方的地址空间,就产生一个“线程”。 因此:...

    drivers_实验资料\kernel课程\内核课程.chm

    Kernel:内核中最核心的部分,包括进程的调度(kernel/sched.c),以及进程的创建和撤销(kernel/fork.c和kernel/exit.c)等,和平台相关的另外一部分核心的代码在arch/*/kernel目录。 Crypto:内核本身所用的加密API...

Global site tag (gtag.js) - Google Analytics