Linux-0.11内核分析03:进程1的创建及执行

进程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前半部分被填充

猜你喜欢

转载自blog.csdn.net/egean/article/details/81000758