fork.c ( File view )

  • By 2010-08-31
  • View(s):24
  • Download(s):2
  • Point(s): 1
			/*
* 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').
* Fork is rather simple, once you get the hang of it, but the memory
* management can be a bitch. See 'mm/mm.c': 'copy_page_tables()'
*/
/*
* 'fork.c'кϵͳ'fork'ĸӳ򣨲μsystem_call.sԼһЩ
* ('verify_area')һ˽forkͻᷢǷdz򵥵ģڴȴЩѶȡ
* μ'mm/mm.c'е'copy_page_tables()'
*/
#include 		// ͷļϵͳиֳš(Linus minix )

#include 	// ȳͷļṹtask_structʼ0 ݣ
// һЩйúͻȡǶʽຯ䡣
#include 	// ںͷļһЩں˳úԭζ塣
#include 	// βͷļйضμĴǶʽຯ
#include 		// ϵͳͷļû޸/жŵȵǶʽꡣ

extern void write_verify (unsigned long address);

long last_pid = 0;

//// ̿ռдǰ֤
// Եǰ̵ĵַaddr addr+size һν̿ռҳΪλִдǰļ
// ҳֻģִй͸ҳдʱƣ
void
verify_area (void *addr, int size)
{

  unsigned long start;

  start = (unsigned long) addr;
// ʼַstart Ϊҳ߽翪ʼλãͬʱӦص֤С
// ʱstart ǵǰ̿ռеԵַ
  size += start & 0xfff;
  start &= 0xfffff000;
  start += get_base (current->ldt[2]);	// ʱstart ϵͳԿռеĵַλá
  while (size > 0)
    {

      size -= 4096;
// дҳ֤ҳ治дҳ档mm/memory.c261 У
      write_verify (start);
      start += 4096;
    
}

}

// Ĵݶλַ޳ҳ
// nr Ϊţp ݽṹָ롣
int
copy_mem (int nr, struct task_struct *p)
{

  unsigned long old_data_base, new_data_base, data_limit;
  unsigned long old_code_base, new_code_base, code_limit;

  code_limit = get_limit (0x0f);	// ȡֲдж޳
  data_limit = get_limit (0x17);	// ȡֲݶж޳
  old_code_base = get_base (current->ldt[1]);	// ȡԭλַ
  old_data_base = get_base (current->ldt[2]);	// ȡԭݶλַ
  if (old_data_base != old_code_base)	// 0.11 治ִ֧ݶη
    panic ("We don't support separate I&D");
  if (data_limit < code_limit)	// ݶγ < γҲԡ
    panic ("Bad data_limit");
  new_data_base = new_code_base = nr * 0x4000000;	// »ַ=*64Mb(С)
  p->start_code = new_code_base;
  set_base (p->ldt[1], new_code_base);	// ôлַ
  set_base (p->ldt[2], new_data_base);	// ݶлַ
  if (copy_page_tables (old_data_base, new_data_base, data_limit))
    {
				// ƴݶΡ
      free_page_tables (new_data_base, data_limit);	// ͷڴ档
      return -ENOMEM;
    
}
  return 0;

}

/*
* Ok, this is the main fork-routine. It copies the system process
* information (task[nr]) and sets up the necessary registers. It
* also copies the data segment in it's entirety.
*/
/*
* OKҪfork ӳϵͳϢ(task[n])ñҪļĴ
* ظݶΡ
*/
// ƽ̡
int
copy_process (int nr, long ebp, long edi, long esi, long gs, long none,
	      long ebx, long ecx, long edx,
	      long fs, long es, long ds,
	      long eip, long cs, long eflags, long esp, long ss)
{

  struct task_struct *p;
  int i;
  struct file *f;

  p = (struct task_struct *) get_free_page ();	// Ϊݽṹڴ档
  if (!p)			// ڴ򷵻س벢˳
    return -EAGAIN;
  task[nr] = p;			// ṹָС
// nr Ϊţǰfind_empty_process()ء
  *p = *current;		/* NOTE! this doesn't copy the supervisor stack */
/* ע⣡ḴƳûĶջ */ ֻƵǰݣ
    p->state = TASK_UNINTERRUPTIBLE;	// ½̵״̬Ϊжϵȴ״̬
  p->pid = last_pid;		// ½̺šǰfind_empty_process()õ
  p->father = current->pid;	// ø̺š
  p->counter = p->priority;
  p->signal = 0;		// źλͼ0
  p->alarm = 0;
  p->leader = 0;		/* process leadership doesn't inherit */
/* ̵쵼ȨDzܼ̳е */
  p->utime = p->stime = 0;	// ʼû̬ʱͺ̬ʱ䡣
  p->cutime = p->cstime = 0;	// ʼӽû̬ͺ̬ʱ䡣
  p->start_time = jiffies;	// ǰδʱ䡣
// ״̬TSS ݣμб˵
  p->tss.back_link = 0;
  p->tss.esp0 = PAGE_SIZE + (long) p;	// ջָ루Ǹṹp 1 ҳ
// ڴ棬Դʱesp0 ָҳˣ
  p->tss.ss0 = 0x10;		// ջѡںݶΣ[??]
  p->tss.eip = eip;		// ָָ롣
  p->tss.eflags = eflags;	// ־Ĵ
  p->tss.eax = 0;
  p->tss.ecx = ecx;
  p->tss.edx = edx;
  p->tss.ebx = ebx;
  p->tss.esp = esp;
  p->tss.ebp = ebp;
  p->tss.esi = esi;
  p->tss.edi = edi;
  p->tss.es = es & 0xffff;	// μĴ16 λЧ
  p->tss.cs = cs & 0xffff;
  p->tss.ss = ss & 0xffff;
  p->tss.ds = ds & 0xffff;
  p->tss.fs = fs & 0xffff;
  p->tss.gs = gs & 0xffff;
  p->tss.ldt = _LDT (nr);	// nr ľֲѡLDT GDT У
  p->tss.trace_bitmap = 0x80000000;
  16  Ч
// ǰʹЭͱġ
    if (last_task_used_math == current)
    __asm__ ("clts ; fnsave %0"::"m" (p->tss.i387));
// Ĵݶλַ޳ҳֵ0λ
// ӦͷΪڴҳ
  if (copy_mem (nr, p))
    {
				// زΪ0 ʾ
      task[nr] = NULL;
      free_page ((long) p);
      return -EAGAIN;
    
}
// ļǴ򿪵ģ򽫶ӦļĴ򿪴1
  for (i = 0; i < NR_OPEN; i++)
    if (f = p->filp[i])
      f->f_count++;
// ǰ̣̣pwd, root executable ô1
  if (current->pwd)
    current->pwd->i_count++;
  if (current->root)
    current->root->i_count++;
  if (current->executable)
    current->executable->i_count++;
// 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;	/* do this last, just in case */
/* ٽóɿ״̬Էһ */
  return last_pid;		// ½̺ţDzͬģ

}

// Ϊ½ȡòظĽ̺last_pidе(index)
int
find_empty_process (void)
{

  int i;

repeat:
  if ((++last_pid) < 0)
    last_pid = 1;
  for (i = 0; i < NR_TASKS; i++)
    if (task[i] && task[i]->pid == last_pid)
      goto repeat;
  for (i = 1; i < NR_TASKS; i++)	// 0 ų⡣
    if (!task[i])
      return i;
  return -EAGAIN;

}
			
...
Expand> <Close

Want complete source code? Download it here

Point(s): 1

Download
0 lines left, continue to read
Sponsored links

File list

Tips: You can preview the content of files by clicking file names^_^
Name Size Date
linux0.00 B0% 04-10-07
<boot>0.00 B04-10-07 15:01
bootsect.s12.49 kB08-01-04 21:38
head.s13.22 kB08-01-04 21:38
setup.s12.42 kB08-01-04 21:38
<fs>0.00 B04-10-07 15:01
bitmap.c8.46 kB02-09-04 13:12
block_dev.c3.95 kB02-09-04 13:12
buffer.c17.71 kB02-09-04 13:12
char_dev.c4.09 kB02-09-04 13:12
exec.c18.90 kB02-09-04 13:12
fcntl.c3.33 kB02-09-04 13:12
file_dev.c4.82 kB02-09-04 13:12
file_table.c209.00 B02-09-04 13:12
inode.c14.92 kB02-09-04 13:12
ioctl.c1.94 kB02-09-04 13:12
Makefile6.80 kB08-01-04 21:45
namei.c37.20 kB02-09-04 13:12
open.c10.00 kB02-09-04 13:12
pipe.c5.42 kB02-09-04 13:12
read_write.c5.86 kB02-09-04 13:12
stat.c2.69 kB02-09-04 13:12
super.c13.57 kB02-09-04 13:12
truncate.c2.46 kB02-09-04 13:12
<include>0.00 B04-10-07 15:01
a.out.h8.22 kB02-09-04 13:14
<asm>0.00 B04-10-07 15:01
io.h772.00 B02-09-04 13:14
memory.h1.03 kB08-01-04 22:13
segment.h2.50 kB02-09-04 13:14
system.h4.08 kB02-09-04 13:14
const.h589.00 B02-09-04 13:14
ctype.h1.68 kB02-09-04 13:14
errno.h2.30 kB02-09-04 13:14
fcntl.h3.30 kB02-09-04 13:14
<linux>0.00 B04-10-07 15:01
config.h2.16 kB02-09-04 13:14
fs.h9.72 kB02-09-04 13:14
hdreg.h2.94 kB02-09-04 13:14
head.h760.00 B02-09-04 13:14
kernel.h1.44 kB02-09-04 13:14
mm.h473.00 B02-09-04 13:14
sched.h13.25 kB02-09-04 13:14
sys.h5.41 kB02-09-04 13:14
tty.h3.93 kB02-09-04 13:14
signal.h4.01 kB02-09-04 13:14
stdarg.h1.77 kB02-09-04 13:14
stddef.h378.00 B02-09-04 13:14
string.h21.75 kB02-09-04 13:14
<sys>0.00 B04-10-07 15:01
stat.h2.37 kB02-09-04 13:14
times.h377.00 B02-09-04 13:14
types.h1.10 kB02-09-04 13:14
utsname.h423.00 B02-09-04 13:14
wait.h1.48 kB02-09-04 13:14
termios.h13.58 kB02-09-04 13:14
time.h1.81 kB02-09-04 13:14
unistd.h9.21 kB02-09-04 13:14
utime.h392.00 B02-09-04 13:14
<init>0.00 B04-10-07 15:01
main.c12.52 kB02-09-04 13:12
<kernel>0.00 B04-10-07 15:01
asm.s5.10 kB08-01-04 22:48
<blk_drv>0.00 B04-10-07 15:01
blk.h5.69 kB02-09-04 13:14
floppy.c23.49 kB02-09-04 13:12
hd.c17.14 kB02-09-04 13:12
ll_rw_blk.c7.59 kB02-09-04 13:12
Makefile4.25 kB08-01-04 22:53
ramdisk.c6.13 kB02-09-04 13:12
<chr_drv>0.00 B04-10-07 15:01
console.c30.91 kB02-09-04 13:12
keyboard.S21.04 kB08-01-04 22:59
Makefile4.81 kB08-01-04 22:59
rs_io.s5.75 kB08-01-04 22:59
serial.c2.91 kB02-09-04 13:12
tty_io.c18.40 kB02-09-04 13:12
tty_ioctl.c10.70 kB02-09-04 13:12
exit.c8.08 kB02-09-04 13:12
fork.c6.78 kB15-07-07 22:10
<math>0.00 B04-10-07 15:01
Makefile3.21 kB08-01-04 23:01
math_emulate.c2.08 kB02-09-04 13:12
mktime.c2.72 kB02-09-04 13:12
panic.c952.00 B02-09-04 13:12
printk.c1.75 kB02-09-04 13:12
sched.c18.57 kB16-07-07 21:23
signal.c5.61 kB02-09-04 13:12
sys.c7.62 kB02-09-04 13:12
system_call.s12.53 kB08-01-04 22:48
traps.c8.29 kB04-10-07 14:57
vsprintf.c9.96 kB02-09-04 13:12
<lib>0.00 B04-10-07 15:01
close.c397.00 B02-09-04 13:12
ctype.c1.72 kB02-09-04 13:12
dup.c401.00 B02-09-04 13:12
errno.c66.00 B02-09-04 13:12
execve.c607.00 B02-09-04 13:12
Makefile4.83 kB08-01-04 22:30
malloc.c13.50 kB02-09-04 13:12
open.c1.22 kB02-09-04 13:12
setsid.c382.00 B02-09-04 13:12
string.c199.00 B02-09-04 13:12
wait.c774.00 B02-09-04 13:12
write.c545.00 B02-09-04 13:12
_exit.c616.00 B02-09-04 13:12
Makefile8.58 kB08-01-04 22:21
<mm>0.00 B04-10-07 15:01
Makefile2.91 kB08-01-04 22:34
memory.c25.10 kB02-09-04 13:12
page.s842.00 B08-01-04 22:34
<tools>0.00 B04-10-07 15:01
build.c8.12 kB02-09-04 13:12
...
Sponsored links

fork.c (286.77 kB)

Need 1 point
Your Point(s)

Your Point isn't enough.

Get point immediately by PayPal

More(Debit card / Credit card / PayPal Credit / Online Banking)

Submit your source codes. Get more point

LOGIN

Don't have an account? Register now
Need any help?
Mail to: support@codeforge.com

切换到中文版?

CodeForge Chinese Version
CodeForge English Version

Where are you going?

^_^"Oops ...

Sorry!This guy is mysterious, its blog hasn't been opened, try another, please!
OK

Warm tip!

CodeForge to FavoriteFavorite by Ctrl+D