首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解Linux进程管理

理解Linux进程管理
EN

Unix & Linux用户
提问于 2019-08-11 12:55:54
回答 1查看 133关注 0票数 0

我试着理解Linux内核的内部结构、进程管理和上下文切换过程。就我所理解的教程(来自这个社区、IBM等)而言,内核是在按power按钮之后由引导加载器加载的。然后启动调度程序并创建最终init进程,该进程负责启动所有其他进程。

因此,过了一段时间,就会发生上下文切换。在此上下文切换期间,内核查看新进程的页表,并将其加载到MMU的TLB中(如果必要的话)。内核是否将整个页面表(对于32位系统上的4GB虚拟内存)加载到MMU中?这个表交换是如何工作的,因为据我所知,在所有进程中,前1GB的内存都会出现,而不是交换掉,因为这是内核内存?所有进程的页表是否包含前1GB内存的直接映射,从而将前1GB的虚拟内存直接映射到1GB的物理内存中?

有没有一些关于这个上下文转换是如何工作的文档,因为我找不到像我这样解释这件事的文档。

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2019-08-11 15:27:04

每个进程都有自己的一组页面页,覆盖32位x86机器上的低3GB。32位计算机上的前1GB对于所有进程来说都是通用的,并且无法从用户空间访问。前1GB是为内核保留的,最初包含一个由3GB偏移的整个物理RAM的映射。这意味着物理内存地址0在虚拟地址0xc0000000可见,物理内存地址1在地址0xc0000001可见,依此类推。当内存大小超过1GB限制时,就开始通过"highmem“窗口访问多余的物理内存。

在x86-64上,地址空间的上半部分保留给内核,下半部保留给用户空间。请注意,当前的硬件不允许使用整个64位地址空间:通常只有48位地址位是可用的,上16位必须是所有零或所有位。(可用位的确切数量取决于CPU模型。)

在上下文切换时,映射的用户空间部分被替换为新进程的映射,但是内核部分保持不变。整个4GB内存空间没有映射,只有实际使用的部分。这允许一个小得多的页面表树。初始映射由包含要运行的程序的ELF文件确定。在动态分配新内存、使用mmap映射或自动扩展堆栈时,将根据需要修改页表。

调度程序没有“启动”,因为它不是一个单独的进程。当正在运行的进程需要等待输入或其他事件时,或者当当前进程用完了其时间片时,内核将重新安排进程。每个进程处于几种状态之一,比如等待某个事件、准备运行或运行。当内核进行重新安排时,它会检查已准备好运行的进程列表,并选择一个(每个CPU)来运行下一步。

另外,翻译查找缓冲区(TLB)不是由内核直接加载的(在x86处理器上)。软件只修改页面表,硬件在运行时根据需要自动填充TLB中的条目。TLB可以通过软件进行刷新;这需要在上下文切换时完成。

有几本书是关于Linux内核内部的(例如“理解Linux内核”),但现在大多数都已经很老了。但是,即使他们不再是很好的参考资料,他们中的许多确实提供了相关的信息,但是你必须记住,很多事情已经改变了。

票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/535009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档