Linux sys_exec中可执行文件映射的建立及读取(5)

2020-06-01 00:00:00 专区 订阅 付费 内核 构造

0号进程的手工构造过程

其是利用全局变量构造的,如下图所示:

         init_task_union 
      ---+-------------+ 
       ^ |             | 
       | |             | 
       | |             | 
      8K |             |    init_task
       | |             |   ,+------------------------+
       | |             |  / |                        |
       | |             | /  | policy:    SCHED_OTHER |
       | +-------------+/   | mm:        NULL        |
       v | task_struct |    | active_mm: init_mm ------+
      ---+-------------+\   | user:      INIT_USER   | |
                         \  | .....                  | |
                          \ |                        | |
                           '+------------------------+ |
                                                       |
                        init_mm                        |
                        +-------------------------+<---+
                        |                         |
                        | mmap:    init_mmap      |
                        | pgd:     swapper_pg_dir |
                        | .....                   |
                        |                         |
                        +-------------------------+

  • ESP刚开始的指向:在head.S中:lss stack_start,%esp设置了esp寄存器,而stack_start已经被定义为SYMBOL_NAME(init_task_union)+8192,很显然,esp在内核启动时指向init_task_union顶部;
  • current的解释:而current宏则就是按8K宏对esp取整,因此无论esp因压栈出栈导致其在栈中(init_task_union)何位值,都会得到task_struct的首指针;
  • 因此,综上,Linux内核启动后,current也就是init_task,可以理解成当前进程init_task中;
  • 注意,init_task的pid为0;

相关文章