免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: chenrvmldd
打印 上一主题 下一主题

也谈谈这四年来对内核的研究 [复制链接]

论坛徽章:
0
61 [报告]
发表于 2011-07-04 17:08 |只看该作者
赞这个帖子

论坛徽章:
0
62 [报告]
发表于 2011-07-04 17:15 |只看该作者
没有女朋友不能看书吗?

论坛徽章:
0
63 [报告]
发表于 2011-07-04 18:09 |只看该作者
本帖最后由 futex 于 2011-07-04 18:35 编辑

再回答一下:1:不同的的cpu架构切换动作是不一样的,楼主指那种? 一般而言,切换的主要动作是先装载内存页目录地址,而后切换到目的进程的内核栈,并从栈中恢复目的进程保存在栈中的各寄存器。 2:当然是init_task进程,所有进程的祖宗(包括init 和 kthreadd),最后归于idle进程,楼主还是要问kernel启动动作,其过程太长,描述起来要花很多文字。3:理论上可以,调用sched_setscheduler将进程设为最高实时优先级并把调度策略设为SCHED_FIFO,并且在进程中不主动放弃cpu或调用主动放弃cpu的相关系统调用(比如阻塞的read)。

评分

参与人数 1可用积分 +5 收起 理由
瀚海书香 + 5 多谢分享!

查看全部评分

论坛徽章:
4
CU大牛徽章
日期:2013-04-17 11:48:26CU大牛徽章
日期:2013-04-17 11:48:40CU大牛徽章
日期:2013-04-17 11:48:45摩羯座
日期:2013-12-06 18:10:04
64 [报告]
发表于 2011-07-04 19:38 |只看该作者
无条件顶。

论坛徽章:
0
65 [报告]
发表于 2011-07-04 21:54 |只看该作者
回复 60# chenrvmldd

我想就第一个问题谈谈我得看法:
早期的linux内核版本比如0.11(够早的^^)进程切换是借助CPU提供的硬件机制完成的。简单来说就是每个进程对应一个RSS,记录进程上下文
(主要指寄存器),切换时由硬件对上下文全盘替换。
后来虽然内核的发展,设计者发现CPU的这种机制是非常消耗时间的。于是进程切换实现为软件机制。由软件来替代保存上下文,但为了不绕过CPU
自身的机制,只是简单走过过场,保存TSS描述符。这个在LINUX源码分析有句话说的很地道:铁打的营盘流水的兵。
至于进程上下文嘛:就是当前进程所有的寄存器值,以及打开文件,信号,堆栈(其实也是寄存器描述的)等。
至于优化嘛:只能说内核开发者永远不会盲从于权威,就算你是INTEL设计的,该不用我也照样不用。内存管理部分同样也有这样的案例。

论坛徽章:
0
66 [报告]
发表于 2011-07-04 21:58 |只看该作者
回复 63# futex

3:理论上可以,调用sched_setscheduler将进程设为最高实时优先级并把调度策略设为SCHED_FIFO,并且在进程中不主动放弃cpu或调用主动放弃cpu的相关系统调用(比如阻塞的read)。

这个貌似不行吧,时钟中断一来,就算你不主动放弃还是会被强制替换的。??

论坛徽章:
0
67 [报告]
发表于 2011-07-04 22:37 |只看该作者
本帖最后由 nettom 于 2011-07-04 22:52 编辑

第二个小问:在Linux中创建进程通过fork调用,按照fork调用的实现,它是写时复制机制,我们知道新创建的内核时复制的父进程的,那么父进程复制的是它的父进程的,那么系统中第一个进程是复制谁的了?它是怎么产生的了?第一个进程有什么作用了?
==第一个进程应该是pid 0,就是唯一不需要有kernel_thread创建的进程;数据成员大多静态定义;他主要是产生pid 1并调度执行,同时自己成为cpu_idle.  start_kernel -> rest_init

第三个小问:
进程调度的算法,你对现有的进程调度算法了解吗?如果让你在现有的调度算法中,你能不能做到让一个进程永远的在CPU上运行,如果能,你怎么做?
==是不是应该理解为守护进程?或者是每次调度必须运行的第一个进程,然后再调度其他进程?
如果是后者,那么这样的进程意义何在?不如就在schedule_tick里加一段代码。因为这样已经偏离了进程的概念:生命周期和状态转换了。也就是说,不需要再用进程来实现这个要求。
可能我理解错了。因为不可能除了中断处理就是这个进程在cpu上运行,他必须让其他进程也运行,而这个时候,他是不占有cpu的(仅讨论单核)。

愚见,轻拍。

论坛徽章:
0
68 [报告]
发表于 2011-07-04 23:26 |只看该作者
好久没有看到这么有意思的回复讨论了,帮顶。

论坛徽章:
0
69 [报告]
发表于 2011-07-04 23:37 |只看该作者
请教个问题: 物理内存应该是由内存子系统来统一管理的,对于用户态进程来说,当需要访问其进程某一地址空间映射的文件时(假设相应内容还没载入物理内存),文件需要的内存是直接通过进程的页目录表项分配的,还是要经过内核把需要的物理页框先映射到内核空间,然后内核空间再映射到进程空间?这部分看书上讲的不是太详细的说...

论坛徽章:
0
70 [报告]
发表于 2011-07-04 23:59 |只看该作者
转帖一个,应该就在站内的。就是对page fault的理解。

5. 用户进程申请内存vaddr = malloc(size):
    * 内存管理模块从用户进程内存空间(0--3G)中找到一块还没使用的空间vm_area_struct(start--end);
    * 随后将其插入到task->mm->mmap链表中;

6. 用户进程写入vaddr(0-3G),例如执行指令mov(eax, vaddr):
    * CPU获得vaddr这个虚地址,该虚地址应该已经由glibc库设置好了,一定在3G一下的某个区域,根据CR3寄存器指向的current->pgd查当前进程的页目录页表数据库,发现该vaddr对应的页目录表项为0,故产生异常;
    * 在异常处理中,发现该vaddr对应的vm_area_struct已经存在,为vaddr对应的页目录表项分配一个页表;
    * 随后从free_list找到一个page,将该page对应的物理页面物理首地址赋给vaddr对应的页表表项,很明显,此时的vaddr和paddr不是线性对应关系了;
    * 将page从free_list中脱离;
    * 异常处理返回;
    * CPU重新执行刚刚发生异常的指令mov(eax, vaddr);
    * CPU获得vaddr这个虚地址,根据CR3寄存器指向的current->pgd,利用建立好的页目录页表数据库,找到其对应的物理内存地址;
    * 将eax的内容写入vaddr对应的物理内存地址内;
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP