摘要:
kernel/sched.c struct rq { ... #ifdef CONFIG_SMP struct sched_domain *sd; /* 用于主动均衡 */ int active_balance; int push_cpu; //表示需要迁移进程的目的CPU /*该就绪队列的CPU: 阅读全文
摘要:
可以用两种方法激活调度。一种是直接的,比如进程打算睡眠或出于其他原因放弃CPU;另一种是通过周期性机制,以固定的频率运行,不时检测是否有必要进行进程切换。在下文中我将这两个组件称为通用调度器(generic scheduler)或核心调度器(core scheduler)。 <sched.h> st 阅读全文
摘要:
asmlinkage int sys_fork(struct pt_regs regs) { return do_fork(SIGCHLD, regs.esp, ®s, 0, NULL, NULL); }这意味着在子进程终止后发送SIGCHLD信号通知父进程。最初,父子进程的栈地址相同(起始地 阅读全文
摘要:
图4-17给出了内核在处理缺页异常时,可能使用的各种代码路径的一个粗略的概观。 arch/x86/kernel/entry_32.S中的一个汇编例程用作缺页异常的入口,但其立即调用了arch/x86/mm/fault_32.c中的C例程do_page_fault。 图4-18给出了该例程的代码流程图 阅读全文
摘要:
堆是一个连续的内存区域,在扩展时自下至上增长。的mm_struct结构,包含了堆在虚拟地址空间中的起始和当前结束地址(start_brk和brk)。 <mm_types.h> struct mm_struct { ... unsigned long start_brk, brk, start_sta 阅读全文
摘要:
C标准库提供了mmap函数建立映射。在内核一端,提供了两个系统调用mmap和mmap2。两个函数的参数相同。 asmlinkage unsigned long sys_mmap{2}(unsigned long addr, unsigned long len,unsigned long prot, 阅读全文
摘要:
内核提供了各种函数来操作进程的虚拟内存区域。在建立或删除映射时,创建和删除区域(以及查找用于新区域的适当的内存位置)是所需要的标准操作。如图4-10所示。 将虚拟地址关联到区域 通过虚拟地址,find_vma可以查找用户地址空间中结束地址在给定地址之后的第一个区域,即满足addr < vm_area 阅读全文
摘要:
struct mm_struct提供了进程在内存中布局的所有必要信息。另外,它还包括下列成员,用于管理用户进程在虚拟地址空间中的所有内存区域。(其中管理虚拟地址空间所有内存区域) <mm_types.h> struct mm_struct { struct vm_area_struct * mmap 阅读全文
摘要:
由于所有用户进程总的虚拟地址空间比可用的物理内存大得多,因此只有最常用的部分才与物理页帧关联。我们考察一下通过文本编辑器操作文件的情况。通常用户只关注文件结尾处,因此尽管整个文件都映射到内存中,实际上只使用了几页来存储文件末尾的数据。至于文件开始处的数据,内核只需要在地址空间保存相关信息,如数据在磁 阅读全文
摘要:
虚拟地址空间中包含了若干区域。其分布方式是特定于体系结构的,但所有方法都有下列共同成分。 当前运行代码的二进制代码。该代码通常称之为text,所处的虚拟内存区域称之为text段。 程序使用的动态库的代码。 存储全局变量和动态产生的数据的堆。 用于保存局部变量和实现函数/过程调用的栈。 阅读全文