进程1的创建及执行
1. 函数调用关系
--- init --- main.c --- sched_init()
| |- hd_init()
| |- fork() --- int 0x80
| |- init() --- setup() --- int 0x80
| |- pause() --- int 0x80
|
|- kernel --- sched.c --- sched_init() --- set_system_gate(0x80,&system_call)
| | |- sys_pause() --- schedule()
| | |- schedule() --- switch_to()
| | |- sleep_on() --- *p = current//p=&bh->b_wait
| | | |- schedule()
| | |- wake_up() --- (**p).state=0//p=&bh->b_wait,进程1就绪
| |
| |- sched.h --- switch_to()//进程1切换到进程0后在sys_pause中循环
| |
| |- system_call.s --- system_call() --- sys_call_table(,%eax,4)
| | |- sys_fork() --- find_empty_process()
| | | |- copy_process()
| | |- hd_interrupt() --- do_hd()
| |
| |- fork.c --- find_empty_process()
| | |- copy_process() --- p=get_free_page()
| | | |- *p=*current//复制task_struct给子进程
| | | |- p->tss赋值
| | | |- copy_mem(p)
| | | |- f->f_count++
| | | |- set_tss_desc()
| | | |- set_ldt_desc()
| | | |- p->state = TASK_RUNNING
| | |- copy_mem() --- set_base(p->ldt[1]...)//p->ldt赋值
| | |- set_base(p->ldt[2]...)
| | |- copy_page_tables()
| |
| |- blk_drv --- hd.c --- sys_setup() --- hd_info[2]赋值
| | | |- hd[0]和hd[5]赋值
| | | |- bh=bread()
| | | |- 判断硬盘信息有效
| | | |- 根据硬盘中的分区信息设置hd[1]~hd[4]
| | | |- brelse(bh)
| | | |- rd_load()//用软盘格式化虚拟盘
| | | |- mount_root()//加载根文件系统
| | |- hd_init() --- blk_dev[3].request_fn = do_hd_request
| | | |- set_intr_gate(0x2E,&hd_interrupt);
| | |- do_hd_request() --- INIT_REQUEST//CURRENT==NULL时返回
| | | |- hd_out(...,&read_intr) --- 控制硬盘开始读写,
| | | | 完成后引发中断
| | | |- do_hd=read
| | |- read_intr() --- port_read(...CURRENT->buffer)
| | | //CURRENT=blk_dev[3].current_request
| | | //CURRENT->buffer=bh->b_data
| | |- end_request(1)//读取完成后执行到这里
| | |- do_hd_request()
| |
| |- ll_rw_block.c --- ll_rw_block() --- major=MAJOR(bh->b_dev)
| | | |- make_request(major,bh)
| | |- make_request() --- lock_buffer(bh)
| | | |- 找到空闲请求req
| | | |- req->buffer=bh->b_data
| | | |- req->next=NULL
| | | |- add_request(blk_dev[major],req)
| | |- add_request() --- blk_dev[3]->current_request=req
| | |- blk_dev[3]->request_fn
| |
| |- blk.h --- end_request() --- CURRENT->bh->b_uptodate = 1
| | | |- unlock_buffer(CURRENT->bh)
| | | |- CURRENT = CURRENT->next//CURRENT=NULL
| | |- unlock_buffer() --- bh->b_lock=0
| | |- wake_up(&bh->b_wait)
| |
| |- ramdisk.c --- rd_load() --- bh=breada()
| |- 拷贝bh->b_data到s//s为超级块
| |- brelse(bh)
| |- 计算虚拟块数
| |- 将软盘文件系统复制到虚拟盘
| |- ROOT_DEV=0x0101//虚拟盘设置为根设备
|
|- include --- linux --- sys_call_table[] --- sys_fork()
| |- sys_pause()
| |- sys_setup()
|
|- mm --- memery.c --- copy_page_tables() --- invalidate()
| |- invalidate()//刷新CR3页高速缓存
|
|- fs --- buffer.c --- bread() --- bh=getblk()
| | |- ll_rw_block(bh)
| | |- wait_on_buffer(bh)
| | |- if(bh->b_uptodate)//返回bh
| |- getblk() --- get_hash_table()
| | |- 遍历free_list,找到空闲bh
| | |- remove_from_queues(bh)
| | |- bh->b_dev=dev
| | | bh->b_blocknr=block
| | |- insert_into_queues(bh)
| |- get_hash_table() --- find_buffer()
| |- find_buffer()
| |- remove_from_queues(bh)
| |- insert_into_queues(bh) --- hash(...) = bh
| |- wait_on_buffer() --- sleep_on(&bh->b_wait)
| //等待读盘完成b_wait=NULL
|
|- super.c --- mount_root() --- 初始化super_block[8]
| |- p=read_super(ROOT_DEV)//读取超级块
| |- mi=iget(ROOT_DEV,ROOT_INO)//读取根节点
| |- p->s_isup = p->s_imount = mi//挂接i节点
| |- current->pwd = mi
| |- current->root = mi
|- read_super() --- 从super_block[8]中申请一项
| |- s->s_dev = dev
| |- lock_super(s)
| |- bh = bread(dev,1)
| |- 拷贝bh->b_data到s//s前半部分被填充
| |- s->s_imap[i]=bread()
| |- s->s_zmap[i]=bread()
|- iget() --- empty = get_empty_inode()
| |- inode=empty
| |- inode->i_dev = dev
| |- inode->i_num = nr
| |- read_inode(inode)
|- read_inode() --- sb=get_super(inode->i_dev)
|- bh=bread(inode->i_dev,block)
|- 拷贝bh->b_data到inode//inode前半部分被填充