LINUX0.11内核do_execve之chang_ldt()函数

        在学习chang_ldt()之前,我们先回过头来看一看进程的复制中的copy_mem(nr,p)这个函数,它在fork.c中,两个参数的含义是:nr是新任务号,p是新任务数据结构指针。这个函数的前面几行: code_limit = get_limit(0x0f);

                                data_limit = get_limit(0x17);

                    old_code_base = get(current->ldt[1]);

old_data_base = get(current->ldt[2]);

if(old_data_base != old_code_base);

panic("we don't support separate I&D");

data_limit < code_limit)

panic("Bad data_limit");

       是用来检查代码段和数据段的长度,基地址是否正确。我认为关键在后面,就是新进程在线性地址空间中的基地址:new_data_base = new_code_base = nr * TASK_SIZE;因为这是第二个进程,所以线性地址是:128M。之后将新的线性地址设置到子进程的局部描述符表中:set_base(p->ldt[1],new_code_base);也就是说,我们在复制进程的时候,就设置了新进程的线性地址空间。接下来我们看看copy_page_tables()这个函数:from_dir = (unsigned long *)((from>>20)&0xffc)在这里我们一定要记住页目录表在内存的起始位置,也就是内存物理地址0~4kb是页目录表。这里form的线性地址是64M,先右移22位,得到页目录表的索引值,因为from_dir 是偏移量,所以要再乘以每一项的长度4字节。to_dir也是一样,size = ((unisgned) size + 0x3fffff) >> 22;,这样写是因为比如说size是8.3M,除以4M之后,除数得2,这样0.3M在以后的内存分配当中就没有了,所以加上0x3fffff,这样除数就是3(内存块占用的目录项数)。之后进入循环,取源目录项中页表地址:from_page_table = (unsigned long *) (0xfffff000& *from_dir);,然后给目的页表分配一个空闲页面:to_page_table = (unsigned long *)get_free_page(),然后将刚设置好的目的页表地址附给目的目录项: *to_dir = ((unsigned long ) to_page_table) | 7;,之后通过循环,我们将源页表项复制到目的页表项。从这里我们可以看出分页机制和线性地址是相辅相成的,若没有分页机制,就不存在线性地址。下面我们切入正题,看一下chang_ldt,首先将code_limit和data_limit设置为64M,然后取当前进程的局部代码描述符线性基址给code_base。data_base+data_limit - LIBRARY_SIZE中data_base为128M,加上段限长64M,减去4M的库文件代码,将这个线性地址放到data_base中,这里就是参数和环境变量空间页面将要放置的地方。put_dirty_page(page[i] , data_base)把一物理内存页面映射到线性地址空间指定处,对它来说就是把page[i]的物理地址映射到线性地址data_base处,具体的映射方法是:将线性地址的高12位,也就是页目录项偏移地址给page_table,然后*page_table取其高20位,得到页表基址,然后将其加上页表项的偏移得到页表项,再将page | 7附值给它:page_table[(address>>12)&0x3ff] = page | 7;。这样我们的线性地址就可以访问物理地址为page的页面了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值