Linux sys_exec中可执行文件映射的建立及读取(5)
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;
相关文章