相关疑难解决方法(0)

为什么Windows为其系统地址空间保留1Gb(或2 Gb)?

众所周知,Windows应用程序通常在32位系统上具有2Gb的专用地址空间.使用/ 3Gb开关可将此空间扩展至3Gb.

操作系统保留了4Gb的剩余部分.

我的问题是为什么?

在内核模式下运行的代码(即设备驱动程序代码)具有自己的地址空间.为什么在独有的4Gb地址空间之上,操作系统仍然希望保留每个用户模式进程的2Gb?

我认为原因是用户模式和内核模式调用之间的转换.例如,调用NtWriteFile将需要内核调度例程的地址(因此系统为什么在每个应用程序中保留2Gb).但是,使用SYSENTER,是不是系统服务号足以让内核模式代码知道正在调用哪个函数/服务?

如果你能向我澄清为什么操作系统对每个用户模式进程采用2Gb(或1Gb)非常重要.

memory windows virtual virtual-address-space memory-address

19
推荐指数
1
解决办法
4108
查看次数

execve()和环境变量

我有一个问题,Linux处理环境变量如何传递给execve():

execosis(): int execve(const char*filename,char*const argv [],char*const envp []);

在调用execve()之前,我们从当前进程的内存映射中分配用于保存envs/args的内存.但是在execve()之后,调用进程的所有text/data/bss/stack都被新程序覆盖,并且不保留旧进程的所有内存映射(包括传递的envs/args的内存).

对于新程序,在哪里阅读envs/args?内核是否复制了传递的envs/args并将其放在新的内存映射或其他一些技巧上?

c linux

4
推荐指数
1
解决办法
4099
查看次数