- 论坛徽章:
- 0
|
本帖最后由 wswfc 于 2012-07-18 10:37 编辑
最近看linux 0.11的代码,其中的sys_fork的操作中有一些不明白的地方,还请各位帮忙解答:
sys_fork会调用copy_process函数,进行一些初始化工作,而其中有为新进程的管理结构申请空间的操作:-
- 68 int copy_process(int nr,long ebp,long edi,long esi,long gs,long none,
- 69 long ebx,long ecx,long edx,
- 70 long fs,long es,long ds,
- 71 long eip,long cs,long eflags,long esp,long ss)
- 72 {
- 73 struct task_struct *p;
- 74 int i;
- 75 struct file *f;
- 76
- 77 p = (struct task_struct *) get_free_page();
- 78 if (!p)
- 79 return -EAGAIN;
- 80 task[nr] = p;
- 81 *p = *current; /* NOTE! this doesn't copy the supervisor stack */
- 82 p->state = TASK_UNINTERRUPTIBLE;
- 83 p->pid = last_pid;
- 84 p->father = current->pid;
复制代码 其中的- p = (struct task_struct *) get_free_page();
复制代码 获得一个空闲页面,但是返回值应该是绝对的物理地址- 59 /*
- 60 * Get physical address of first (actually last :-) free page, and mark it
- 61 * used. If no free pages left, return 0.
- 62 */
- 63 unsigned long get_free_page(void)
- 64 {
- ……
复制代码 后续直接在这个物理地址上操作了!有点费解啊!
按理说目前代码应该运行在父进程的内核空间中,父进程有自己的页表和页目录项,但这里却直接操作一个物理地址,这是怎么可能的呢?
update:
看了一些资料,似乎内核态时,使用的页表不是用户态时使用的页表,而是开机最开始初始化时(head.s文件)初始化的页表,该页表是直接1:1映射到物理地址的,所以在内核态时,线性地址==物理地址。不知我的理解对不对…… |
|