随笔分类 -  Linux内核之旅

摘要:学号:SA12**6112本文将主要研究在X86体系下Linux系统中用户态到内核态切换条件,及切换过程中内核栈和任务状态段TSS在中断机制/任务切换中的作用及相关寄存器的变化。一:用户态到内核态切换途径: 1:系统调用 2:中断 3:异常对应代码,在3.3内核中,可以在/arch/x86/kernel/entry_32.S文件中查看。二:内核栈内核栈:Linux中每个进程有两个栈,分别用于用户态和内核态的进程执行,其中的内核栈就是用于内核态的堆栈,它和进程的task_struct结构,更具体的是thread_info结构一起放在两个连续的页框大小的空间内。在内核源代码中使用C语言定义了... 阅读全文
posted @ 2013-06-27 12:12 人若无名 阅读(8698) 评论(2) 推荐(3) 编辑
摘要:学号:SA12**6112前面一篇博文分析了进程从用户态切换到内核态时,内核所做的主要的事,本文将研究在进程切换时,内核所做的事。在内核态,进程切换主要分两步:1:切换页全局目录2:切换内核堆栈和硬件上下文用prev指向被替换进程的表述符,next指向被激活进程的描述符下面分析进程切换的第二步第二步主要由switch_to宏实现:3.3内核中X86体系下:/arch/x86/include/asm/system.h文件的第48行处: 48 #define switch_to(prev, next, last) \ 49 d... 阅读全文
posted @ 2013-06-27 12:11 人若无名 阅读(916) 评论(0) 推荐(1) 编辑
摘要:学号:SA12**6112研究笔记:1:计算机是怎么样工作的2:用户态到内核态切换之奥秘解析3:进程切换之奥秘解析本博文主要是根据前3篇笔记来总结Linux内核的工作机制。一:操作系统工作的基础存储程序计算机: 存储程序计算机最早的是冯.诺伊曼体系结构,即以运算为中心,采用存储程序原理,根据指令顺序执行的计算机。堆栈机制: 在计算机是怎么样工作的中我们分析了,在系统调用过程中,用户态堆栈的变化,在 用户态到内核态切换之奥秘解析,进程切换之奥秘解析中我们分析了内核态堆栈的变化。 进而可以发现堆栈在操作系统的工作中的作用:通过堆栈来保存任务切换过程中的上下文,进而在顺序执行的基础上支持了多任务.. 阅读全文
posted @ 2013-06-26 11:25 人若无名 阅读(674) 评论(3) 推荐(0) 编辑
摘要:根据前两篇博文中的实验:1:Linux进程地址空间之初探:一2:Linux进程地址空间之初探:二 现对进程的创建和可执行程序的加载过程总结如下:一:进程地址空间的组成及相关数据结构 Linux为每个进程都维持了一个独立的虚拟地址空间,进程地址空间又被分为几个虚拟内存区域:代码段、数据段、堆段、栈段、共享库段。进程地址空间中的任何有效地址都只能位于唯一的区域,这些区域不能相互覆盖。通过mmap/munmap函数,内核可以创建/删除一个虚拟内存区域。 主要的数据结构有: task_struct : 进程描述符结构,定义在<linux/sched.h>文件中,描述了该进程打开的文件、进程 阅读全文
posted @ 2013-05-28 19:35 人若无名 阅读(2247) 评论(0) 推荐(0) 编辑
摘要:引言:上篇博文中,我们简单的介绍了Linux虚拟存储器的概念及组成情况,下面来分析分析进程的创建和终结及跟进程地址空间的联系。这里首先介绍一个比较重要的概念:存储器映射在Linux系统中,通过将一个虚拟存储器区域与一个磁盘上的对象关联起来,以初始化这个虚拟存储器区域的内容,这个过程称为存储器映射。存储器映射为共享数据、创建新的进程以及加载程序提供了一种高效的机制。虚拟存储器区域可以映射到两种类型对象中:1)普通文件:一个虚拟区域可以映射到普通磁盘文件的连续部分,例如可执行目标文件。虚拟区域分为若干的虚拟页面,这些虚拟页面初始化时并没有实际交换进物理存储器,直到CPU第一次引用页面时才真正的加载 阅读全文
posted @ 2013-05-27 22:26 人若无名 阅读(2085) 评论(0) 推荐(0) 编辑
摘要:引言:现代操作系统提供了一种对内存的抽象概念,叫做虚拟存储器,它为每个进程提供了一个大的,一致的,和私有的地址空间。通过一个很清晰的机制,虚拟存储器提供了3个重要的能力:1)它将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,通过这种方式,它高效的使用了主存。2)它为每个进程提供了一致的地址空间,从而简化了存储器管理。3)它保护了每个进程的地址空间不被其他进程破坏。Linux操作系统同样也采用了虚拟内存技术,对一个进程而言,它好像可以访问整个系统的所有物理内存,更重要的是,即使单独一个进程,它拥有的地址空间也可以远远大于系统物理内 阅读全文
posted @ 2013-05-23 22:16 人若无名 阅读(3633) 评论(3) 推荐(0) 编辑
摘要:实验环境:Ubuntu12.04下面我们通过 example.c 代码分别生成.cpp .s .o 和ELF可执行文件,并加载运行来分析 程序 example在CPU上执行的整个过程,并由此分析单任务计算机和多任务计算机的工作原理: example.c 2 int g(int x) 3 { 4 return x + 3; 5 } 6 7 int f(int x) 8 { 9 return g(x);10 }11 int main()12 {13 return f(8) + 1; }一:为了在系统上运行example.c 程序,每条C语句都必须转化为低级机器语言指令,然... 阅读全文
posted @ 2013-05-13 22:08 人若无名 阅读(1680) 评论(2) 推荐(3) 编辑