免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123
最近访问板块 发新帖
楼主: frank_seng

Linux sys_exec中可执行文件映射的建立及读取 [复制链接]

论坛徽章:
0
发表于 2008-05-08 17:52 |显示全部楼层
原帖由 frank_seng 于 2008-5-8 17:01 发表

Ascii Picture Designer



It's a very good tool!

从网上下了一个v3.0的, 确实好用.

多谢!

论坛徽章:
0
发表于 2008-05-11 12:54 |显示全部楼层
没了?????????????

论坛徽章:
0
发表于 2008-06-23 10:55 |显示全部楼层
原帖由 frank_seng 于 2008-5-7 14:57 发表


如果此时A又创建了子进程C,则该address所在的页面又被设置为写保护,拥有进程为A和C,同时其他的页面例如PAGEX依然维持写保护,只是拥有进程为A、B和C。如果此时A访问PAGEX,则异常处理会创建一个新页面并将PAGEX中的内容复制到该页面,同时将A相应的pte指向该新页面。如果此时C也访问PAGEX,也会复制新页面并且让C对应的pte指向新页面。如果B再访问PAGEX,则由于此时PAGEX只有一个拥有进程B,故不再复制新页面,而是直接取消该页面的写保护,由于B的pte本来就直接指向该页面,所以无需再做其他工作了。


这里说得不太严谨吧?
是不是应该把“访问”改成“写”呢?

论坛徽章:
0
发表于 2008-06-23 11:11 |显示全部楼层
原帖由 new_learner 于 2008-6-23 10:55 发表


这里说得不太严谨吧?
是不是应该把“访问”改成“写”呢?

不必在意这几个字眼,这种没有歧异的上下文中,LZ说访问的时候当然就该认为是写访问了

论坛徽章:
0
发表于 2008-06-23 11:21 |显示全部楼层
原帖由 flw2 于 2008-6-23 11:11 发表

不必在意这几个字眼,这种没有歧异的上下文中,LZ说访问的时候当然就该认为是写访问了


呵呵 说得也是
不过对于我这种新手菜鸟来说,有时候会产生怀疑~~

论坛徽章:
0
发表于 2008-10-15 17:01 |显示全部楼层
>>>
关于schedule和cpu_idle的一些问题:

   1. schedule会从一系列进程中选择最合适的进程来运行,假设某一时刻没有合适的进程(在寻找待切换入进程时next时,先将next设置为 init_task,然后在runqueue_head运行队列中找合适的进程,找到,就将其赋给next,注意,init_task不会在 runqueue_head队列中,没找到,则就是init_task了),则只能选择 init_task,这样便回到了init_task在cpu_idle->schedule()中被换出时的点,由于此时 init_task.need_resched==0,故进入idle(一般为poll_idle函数,在此函数中, init_task.need_resched被设置为-1),此时CPU halt了,直到中断的到来,CPU才会停止halt;
   2. 如果此时来了个中断,则中断处理完毕后返回前,发现current(也就是init_task)的need_resched为-1(!=0),又会主动调用 schedule,在schedule中,首先将current(也就是init_task)的need_resched清零,然后选择合适的进程来运行,如果找不到合适的,则schedule直接就返回了,此时也就是从中断处理中返回,这样又回到了cpu_idle->idle-> halt被中断时的点,再次进行1->2这样的循环;如果schedule找到了另一个合适的进程,则就切换到该进程去运行了, init_task则被挂起在idle->halt被中断时点的那个位置;

>>>

lz说的似乎有点复杂了,
任何arch启动第一个cpu都是start_kernel(),然后
start_kernel()
{
  .......
  rest_init()
}

static void rest_init(void)
{
        kernel_thread(init, NULL, CLONE_FS | CLONE_FILES | CLONE_SIGNAL);
        unlock_kernel();
        current->need_resched = 1;
        cpu_idle();
}

在kernel_thread()之后, init 进程才被fork出来,当前进程还是boot进程(即init_task,0号进程),之后,boot进程 设置need->resched =1,然后初始化idle,进入循环,  
void cpu_idle (void)
{
        while (1) {
                 ........
                while (!current->need_resched)
                        idle();
                schedule();
                check_pgt_cache();
        }
}
由于current->need_resched==0,第一次,就会调度,这是就会选择 fork出的init了,而init的起始执行点就是ret_from_fork,然后回到用户空间,
而init()里面就是 open console..execve "/sbin/init".......
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP