系统调用与内存虚拟地址空间联系
2011-09-13 10:06
274 查看
怎么说呢?最近在写系统调用的时候,牵扯到从User空间拷贝内存到Kernel空间的问题,因为当前写的进程都是和Kernel一起编译的,也没有什么虚拟地址的问题,就都是保护模式下的4G空间的地址。所有的Kernel中的代码包括好几个进程都是在这个空间运行的。
比如TTY进程虽然是自己单独运行在Task特权级上的,但是因为和Kernel一起编译,Kernel中的代码随时可以调用TTY中的代码并修改TTY中的数据结构或者变量的值。
如果进程是单独编译,并且不使用虚拟地址空间,那么需要链接时候指定自己在内存中的地址,但是由于ldt的存在使得它其实还是可以被存放到其他实际内存地址的,如果它的内存地址已经有进程在用了。这里就要涉及到内存管理了,会稍微复杂一些。
所以这里暂时先不考虑 虚拟地址,不考虑内存管理,每次都先将进程和kernel一起编译,并且ldt都设为初始地址为0,这样能降低复杂度,等我掌握基本知识之后,再去看Linux内核,学习虚拟地址和内存管理。
并且明白当前系统调用将指针传给kernel,并让Kernel到User空间中复制数据在加入了虚拟地址后也是这么做的,所以暂时可以不考虑虚拟地址,不然那样会增加我学习的复杂度。
比如TTY进程虽然是自己单独运行在Task特权级上的,但是因为和Kernel一起编译,Kernel中的代码随时可以调用TTY中的代码并修改TTY中的数据结构或者变量的值。
如果进程是单独编译,并且不使用虚拟地址空间,那么需要链接时候指定自己在内存中的地址,但是由于ldt的存在使得它其实还是可以被存放到其他实际内存地址的,如果它的内存地址已经有进程在用了。这里就要涉及到内存管理了,会稍微复杂一些。
所以这里暂时先不考虑 虚拟地址,不考虑内存管理,每次都先将进程和kernel一起编译,并且ldt都设为初始地址为0,这样能降低复杂度,等我掌握基本知识之后,再去看Linux内核,学习虚拟地址和内存管理。
并且明白当前系统调用将指针传给kernel,并让Kernel到User空间中复制数据在加入了虚拟地址后也是这么做的,所以暂时可以不考虑虚拟地址,不然那样会增加我学习的复杂度。
相关文章推荐
- 虚拟地址空间管理之mmap系统调用关系图
- 【C语言】【unix c】使用mmap将文件映射到进程的虚拟地址空间,然后对内存的操作直接反应到文件中
- 虚拟地址空间的内存布局
- 此时无足够的可用内存,无法满足操作的预期要求,可能是由于虚拟地址空间碎片造成的,请稍后重试
- 此时无足够的可用内存,无法满足操作的预期要求,可能是由于虚拟地址空间碎片造成的,请稍后重试
- 此时无足够的可用内存,无法满足操作的预期要求,可能是由于虚拟地址空间碎片造成的,请稍后重试
- windows系统调用 遍历进程的虚拟地址
- 关于Windows编程中进程虚拟地址空间/虚拟内存及内存映射方面的资料
- 1虚拟地址,虚拟内存映射,系统调用本质,进程运行状态
- 此时无足够的可用内存,无法满足操作的预期要求,可能是由于虚拟地址空间碎片造成的。请稍后重试。
- 内存虚拟地址空间的划分空间
- 虚拟地址空间,用户空间,系统空间
- 从MDL(把应用层的地址空间映射到系统内核空间)得到系统虚拟空间地址
- Linux系统--进程地址空间之虚拟地址空间
- 关于Windows编程中进程虚拟地址空间/虚拟内存及内存映射方面的资料
- C的内存虚拟地址空间结构
- Microsoft Visual Studio2010--此时无足够的可用内存,无法满足操作的预期要求,可能是由于虚拟地址空间碎片造成的。请稍后重试。
- 系统的虚拟地址空间是啥,为什么要使用?
- 深入理解计算机系统-之-内存寻址(一)--存储管理机制(虚拟地址,线性地址,物理地址)
- Linux虚拟地址空间布局以及进程栈和线程栈总结