本问分析基于Linux 0.11内核,转载请标明出处http://blog.csdn.net/yming0221/archive/2011/06/06/6528490.aspx
copy_mem(int nr, struct task_struct *p)函数是为进程设置段基址,限长,并复制页表。下面是其代码
其中get_limit()函数是利用内嵌汇编取特定段描述符中段限长,其中用到指令lsll
将指定描述符段的段限长返回,其中由于段限长是从0开始,所以在lsll之后需要增一。
至于ldt数据段描述符为什么是0x17,而ldt中代码段描述符是0x0f原因是段选择子的格式,一共16位,高13位表示描述符在描述符表的索引
[2]位表示这项是GDT还是LDT,0表示LDT;[1][0]表示RPL权限位。所以,0x17=0B0000 0000 0001 0111,其中10表示第二
项,0x0f=0B0000 0000 0000 1111,表示位于描述符表中的第一项。基地址在LDTR寄存器中。
get_base(addr)取描述符的中指向段的及地址,其宏定义如下:
下图表示描述符格式:
copy_page_tables()函数复制页表,据说是内存管理中最复杂函数之一,以后研究,待续........
分享到:
相关推荐
创建新进程:fork函数:fork函数干什么? fork函数与vfork函数的区别在哪里?为何在一个fork的子进程分支中使用_exit函数而不使用exit函数?
linux内核 do_fork 函数源代码浅析。 经典讲解!
linux_fork函数
赠送jar包:eclipse-collections-forkjoin-7.1.2.jar; 赠送原API文档:eclipse-collections-forkjoin-7.1.2-javadoc.jar; 赠送源代码:eclipse-collections-forkjoin-7.1.2-sources.jar; 赠送Maven依赖信息文件:...
第一行首先通过copy_process()函数完成具体的进程创建工作,返回值类型为task_t类型。 第2行用函数 IS_ERR()分析copy_process()的返回值是否正确。如果正确则执行第3-7行代码。 这里分析一下接下来这几行代码...
Linux进程控制编程-fork子进程创建实例.pdf 学习资料 复习资料 教学资源
* 我们需要下面这些内嵌语句 - 从内核空间创建进程(forking)将导致没有写时复制(COPY ON WRITE)!!! * 直到一个执行execve 调用。这对堆栈可能带来问题。处理的方法是在fork()调用之后不让main()使用 * 任何堆栈...
* linux/init/main.c * * (C) 1991 Linus Torvalds */ #define __LIBRARY__ #include #include /* * we need this inline - forking from kernel space will result * in NO COPY ON WRITE (!!!), until ...
赠送jar包:eclipse-collections-forkjoin-7.1.2.jar; 赠送原API文档:eclipse-collections-forkjoin-7.1.2-javadoc.jar; 赠送源代码:eclipse-collections-forkjoin-7.1.2-sources.jar; 赠送Maven依赖信息文件:...
fork一个进程,fork()函数fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,这个新产生的进程称为子进程。一个进程调用fork()函数后,系统先给新的进程...
Linux内核源代码情景分析.pdf---linux-2.4.0.tar.bz2--Source Insight 3
该事例程序属多进程调用小程序,采用了系统调用函数fork()进行子进程的调用。在该文档中介绍了fork()调用的相关细节及注意点以及父子进程段的关系。并将程序运行后输出到屏幕结果与输出重定向到文件后的结果进行比较...
前端开源库-swint-forkswint fork、swint的进程行为(fork、代码块的公共/单独执行等)管理器
fork函数创建子进程和孙子进程 fork函数创建两个子进程 exec函数族应用
使用非递归算法遍历二叉树,在屏幕上打印出二叉树中序遍历序列。
linux下的fork函数机理说明和用法。非常详细和生动。
babylonjs_agv_seer_fork_oa.pngbabylonjs_agv_seer_fork_oa.pngbabylonjs_agv_seer_fork_oa.png
linux 多进程编程 forklinux 多进程编程 forklinux 多进程编程 forklinux 多进程编程 forklinux 多进程编程 forklinux 多进程编程 forklinux 多进程编程 forklinux 多进程编程 forklinux 多进程编程 forklinux 多...
* linux/kernel/fork.c * * (C) 1991 Linus Torvalds */ /* * 'fork.c' contains the help-routines for the 'fork' system call * (see also system_call.s), and some misc functions ('verify_area'). *...
在Linux中创建一个新进程的唯一方法是使用fork()函数。fork()函数是Linux中一个非常重要的函数,和以往遇到的函数有一些区别,因为fork()函数看起来执行一次却返回两个值。 fork()函数用于从已存在的进程中创建一个...