关于windows中进程地址空间问题

poor_coder 2005-10-18 08:07:58
就32位x86而言,进程的地址空间共有4g。
0X00000000-7FFFFFFF是用户地址空间:这个地址空间中的放的东西具体地址是什么(尽量详细点),比如代码段,数据段,堆段,栈段还有bss段?进程的默认堆有多大,地址是多少,如果再申请的话地址怎么分配?主线程的两个堆栈地址分别是什么,其他线程的堆栈地址怎么分配?线程的两个堆栈是用来给函用的还是什么作用,线程切换的时候寄存器的信息要保存,它保存在什么地址了?
0X80000000-FFFFFFFF是内核地址空间:这个地址空间中的放的东西具体地址是什么(尽量详细点),比如驱动放在什么地址,页表怎么放的,分页和不分页怎么放?
线程本地存储器的地址在什么地方?
另外关于c语言的:除各种运行时间库外一门编程语言到底是怎么出来的,它到底包括什么东西?(比如c语言),难道仅仅是规定语法,然后由其他人去写编译器把你的语法翻译成汇编语言(估计不会是这样的),这样一来不是说语言怎么样,而是谁的编译器做得好。
脑子有点大,请高手指教。提的问题本身肯定就有不少错误,望指教。请不要介绍去看书,头大的。
...全文
1180 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
bownk 2005-10-30
  • 打赏
  • 举报
回复
说错了,PEB中的没有栈指针,栈指针是TEB中的。
bownk 2005-10-30
  • 打赏
  • 举报
回复
1.进程的环境变量指什么?进程ID,句柄,创建时间等内核要用来管理进程的就放在EProcess块(内核中),进程的入口函数地址,堆指针,栈指针……这些就放在PEB中(用户模式中)。命令行参数我记得是压入主线程栈的,不在EProcess和PEB中。
2.Win32下不用段:偏移地址。
3.tls和线程用户模式下的普通栈是不同的。两个栈都在teb中保存有信息,普通栈是保存的是一个指针,tls是以数组形式完全含在teb中,tls本来容量就不大,并且大小固定的。
4.差不多是这样的。
poor_coder 2005-10-30
  • 打赏
  • 举报
回复
TO:光光
再问一次吧,要不我不甘心....
1.进程的环境变量和命令行参数是不是都在进程控制块中?
2.保护模式下的平坦式内存使用虚拟地址(线性地址)而不使用逻辑地址(段:偏移地址)?
3.晕阿,tls就是线程在用户模式下的那个堆栈?我原来以为tls和那两个堆栈是分开的。
4.语言是编程思想。假如我有一种新的思想,然后我把实现这种思想所需要的关键字和语法规定一下,这就形成了一门语言?编译器的厂商负责翻译这些语法和关键?
多谢了!
bownk 2005-10-30
  • 打赏
  • 举报
回复
1.其它操作系统不熟,补充一下,前面说的可能让你有误解,我说的编译器还包括链接器,当系统创建一个进程时,会相应的创建一个进程块(内核中)和进程环境块(PEB,用户模式中,固定在紧靠64KB不可访问区旁边),加载exe时,会查看里面的链接信息,如果没有打开/heap指定大小,系统默认1MB大小随机算法分配空间,然后把分配到的指针保存到PEB中(不是都交给编译器了)。保护模式下的平坦式内存(flat)是说访问内存不用段:偏移地址了,跑题了,不说这个了!再说详细点,win2k用户模式分区布局分别是:
NULL区
用户模式区
|(code、data、heap、stack)
|第n个TEB
|第n-1个TEB
|……
|第0个TEB
|PEB
不可访问区(这个里面有一个系统变量标明了第n个TEB的前一个地址,也就是用户实际可用的最大地址)

2.每个线程至少有一个存取局时变量的栈吧,要不int a;往哪放?TLS,Thread Location Stack,嘿嘿,顾名思义,本地的栈,不是放用户模式放哪?再确切点,(我说过了)TLS是存储在TEB中的,而TEB是在用户模式中的。
3.Windows不是微内核的,不是我说的,是根据定义来的,至于说有点“微内核”,大概就是指Win2000下应用程序不可以直接访问内核模式空间,就像不可以访问微内核的系统组件进程的私有地址空间吧。你说“是不是单独的进程我不知道”,但你已经知道了0x80000000-0xc0000000:内核执行体,HAL,驱动程序……,如果是微内核,硬件抽像、驱动程序等这些如果是单独进程,不应该有自己的进程的空间吗?2GB的内核空间啊!!!再怎么微,也有2GB啊,还能叫微内核啊?!!!(确实,有些人说Windows是微内核的,如果楼主要讨论这个问题,可以去驱动开发组)
4.内核模式的栈主要是供系统组件如进程调度,中断,I/O等用的。
5.最后一个问题,要创新的是一种编程思想,C是面向过程的思想,C++开创的面向对象,Java是C++的基础上,又开创了可移植、垃圾回收等思想。
poor_coder 2005-10-29
  • 打赏
  • 举报
回复
忘了,我问的问题太多,可是帖子最高加分是100,我也没办法,又不想开新帖,怎么办?
poor_coder 2005-10-29
  • 打赏
  • 举报
回复
TO:光光
终于有肯解答问题的高手了!
-----------------------
1、代码段、数据段这些都是因编器译而异的。没有固定的地址。
2、默认堆和栈的大小是可以自己设定的(在链接选项中),至于默认大小和位置还是由编译器说了算。
3、如果进程中再申请一个堆的话,按你申请的大小找到一块地址保留,至于在哪,运行时刻申请的地址,没有固定地址。
(总的来说,Windows是32位平坦式内存,其什么什么段不重要了!)
-------------------------------------------------------
你说的这些结论是不是对其他操作系统平台的编译器也适用?是不是因为Windows是32位平坦式内存,所以这些都交给编译器了?与平坦式内存相对应的内存方式是什么?

=================================

4,两个堆栈的作用:一个堆栈是用来存储局部变量的,一个是TLS
5、线程的堆栈也是任意的,tls也不例外,都在用户模式分区中,因为每个线程(同进程一样)都有一个环境块——TEB(进程的叫PEB),在TEB中记录有tls,当c函数要用到tls时,查一下teb就知道了!
6、程线切换是内核的功能,信息是保存到内核模式的堆栈中,不在用户模式中。
-------------------------------------------
我记得两个堆栈是用户模式下的堆栈和核心模式下的堆栈。不知道对不对?核心模式下的堆栈的主要作用是用来保存进程切换时候的信息的吗?tls你确定是在用户模式下吗?

=================================

可以说这个地方放的是整个windows,因为windows不是微内核的,也就是说它的进程管理、I/0控制等等都是内核模式的,不是单独的进程,都放在这个共享映射的分区中!至于要有多具体,要看微软的大度了!
-------------------------------
windows是不是微内核不能乱下定论吧,至少有点“微内核”的意思。它的进程管理、I/0控制等等都是内核模式的,都放在这个共享映射的分区中,但这些都是以服务的方式提供的是不是单独的进程我不知道。我记得win2000是客户/服务器模式,头大了,我都不知道自己要问什么。
=================================

CRT是基于操作系统的,在不同的操作系统上有不同的实现。语言其实就是用来翻译算法的,至于哪种语言(语法,结构)好用就是各显神通了!
------------------------------------------------
可能我没有说清楚,我想知道怎么从头开发一种语言?假设我现在想开发一门语言,我该怎么做?c语言是由bell实验室“发明”的,这个bell实验室是不是朗讯的贝尔实验室,不好意思,跑题了。c语言作为一门语言,它包括什么(到底需要发明什么),语法,关键字这些是规定不需要发明吧?


bownk 2005-10-28
  • 打赏
  • 举报
回复
0X00000000-7FFFFFFF是用户地址空间:这个地址空间中的放的东西具体地址是什么(尽量详细点),比如代码段,数据段,堆段,栈段还有bss段?进程的默认堆有多大,地址是多少,如果再申请的话地址怎么分配?主线程的两个堆栈地址分别是什么,其他线程的堆栈地址怎么分配?线程的两个堆栈是用来给函用的还是什么作用,线程切换的时候寄存器的信息要保存,它保存在什么地址了?
-------------------------
就我理解:
1、代码段、数据段这些都是因编器译而异的。没有固定的地址。
2、默认堆和栈的大小是可以自己设定的(在链接选项中),至于默认大小和位置还是由编译器说了算。
3、如果进程中再申请一个堆的话,按你申请的大小找到一块地址保留,至于在哪,运行时刻申请的地址,没有固定地址。
(总的来说,Windows是32位平坦式内存,其什么什么段不重要了!)
4,两个堆栈的作用:一个堆栈是用来存储局部变量的,一个是TLS
5、线程的堆栈也是任意的,tls也不例外,都在用户模式分区中,因为每个线程(同进程一样)都有一个环境块——TEB(进程的叫PEB),在TEB中记录有tls,当c函数要用到tls时,查一下teb就知道了!
6、程线切换是内核的功能,信息是保存到内核模式的堆栈中,不在用户模式中。
=================================
0X80000000-FFFFFFFF是内核地址空间:这个地址空间中的放的东西具体地址是什么(尽量详细点),比如驱动放在什么地址,页表怎么放的,分页和不分页怎么放?
-----------------
可以说这个地方放的是整个windows,因为windows不是微内核的,也就是说它的进程管理、I/0控制等等都是内核模式的,不是单独的进程,都放在这个共享映射的分区中!至于要有多具体,要看微软的大度了!
=================================
另外关于c语言的:除各种运行时间库外一门编程语言到底是怎么出来的,它到底包括什么东西?(比如c语言),难道仅仅是规定语法,然后由其他人去写编译器把你的语法翻译成汇编语言(估计不会是这样的),这样一来不是说语言怎么样,而是谁的编译器做得好。
--------------------------
不懂你问的什么意思!CRT是基于操作系统的,在不同的操作系统上有不同的实现。语言其实就是用来翻译算法的,至于哪种语言(语法,结构)好用就是各显神通了!以前觉得面向过程不错,所以有了C,现在面向对象,所以火了C++,然后有人觉得C++用起来困难,所以又有了Java、C#,也许以后面向问题了,又会有新的语言出来!
teli_eurydice 2005-10-28
  • 打赏
  • 举报
回复
up
windcsn 2005-10-28
  • 打赏
  • 举报
回复
WINDOWS核心编程
poor_coder 2005-10-27
  • 打赏
  • 举报
回复
多谢楼上的好意见
qhfu 2005-10-27
  • 打赏
  • 举报
回复
楼主到windows地方去问问吧! 那边高手比较多。
poor_coder 2005-10-27
  • 打赏
  • 举报
回复
是我的问题不值得回答还是给分太少?这些问题我真的想搞明白,跪求高手回答,或留下联系方式。
conglingkaishi 2005-10-21
  • 打赏
  • 举报
回复
呵呵,兄弟,你要太多会看怕人的。
poor_coder 2005-10-21
  • 打赏
  • 举报
回复
再等一天就结帖,郁闷!
qhfu 2005-10-19
  • 打赏
  • 举报
回复
这几天正在研读中,,这本书写得很好,,不过觉得翻译一般 ,, 不知道哪里有原版,看不懂可以对照一下。
qhfu 2005-10-19
  • 打赏
  • 举报
回复
0X00000000-7FFFFFFF是用户地址空间:这个地址空间中的放的东西具体地址是什么(尽量详细点),

======================================================================================

这是一个逻辑地址空间,32位的windows程序都有4G的逻辑地址空间,在2000中,后面一半是用于操作系统的。进城申请空间是,操作系统首先分配的是64k的逻辑空间,然后再把物理空间映射到逻辑空间。具体的方法和内容,上面都有写吧!

一般从下到上,是放EXE文件,交换文件,用户DLL,运行库。

0X80000000-FFFFFFFF
这部分放的系统内核的部分,最上面一般放系统代码,接着是DLLs(内核),再是内存映射文件。

上面都是逻辑空间, 实际用到时才会系统才会装入物理内存。

主线程的两个堆栈地址分别是什么,其他线程的堆栈地址怎么分配?线程的两个堆栈是用来给函用的还是什么作用,线程切换的时候寄存器的信息要保存,它保存在什么地址了?
可参考6.6,结合16章看应该能看懂。。

比如驱动放在什么地址,页表怎么放的,分页和不分页怎么放?
这个应该是操作系统的问题,

另外关于c语言的:除各种运行时间库外一门编程语言到底是怎么出来的,它到底包括什么东西?(比如c语言),
应该是用汇编

ps:上面只是个人一些理解,不一定是对的,楼主可作参考。
poor_coder 2005-10-19
  • 打赏
  • 举报
回复
实话跟大家说吧,核心编程我看过了,我觉得他讲的不够详细,或者是我看得不懂所以才来这问的,就怕大家给我说让我看了,结果没一个真正帮我的,晕死!
它有讲代码段具体地址是什么吗?
它有讲线程的两个堆栈地址什么吗?他讲的线程堆栈那一章举的例子地址是“保留的起始地址是0 x 0 8 0 0 0 0 0 0 ”,我就是看不懂才来问的。
大家的回帖让我很兴奋,但是也请大家说点实际的,根据我的要求回帖,这样才能达到这个帖子的效果,才能让我觉得散分散的值得。
还是请热心的高手详细指教!多谢了!
conglingkaishi 2005-10-19
  • 打赏
  • 举报
回复
呵呵,楼主问的问题我也想知道,受益了。
poor_coder 2005-10-19
  • 打赏
  • 举报
回复
还有请不要再介绍看书了,还指明是哪本书的哪个章节,有的还把目录给粘过来了,看得出来真够费心的。在这多谢了。
poor_coder 2005-10-19
  • 打赏
  • 举报
回复
先说一下我以前知道的答案吧:
0X00000000-7FFFFFFF:应用程序代码,全局变量,线程堆栈,dll代码;我想知道他们的具体地址是什么?哪个占用多大?-----------个地址空间中的放的东西具体地址是什么(尽量详细点),比如代码段,数据段,堆段,栈段还有bss段?


0x80000000-0xc0000000:内核执行体,HAL,驱动程序
0xc0000000-0xc0800000:进程页表和超空间,超空间是什么?我不知道。
0xc0800000-0xffffffff:系统高速缓存,分页缓冲池,非分页缓冲池
楼上说的内存映射文件不知道在什么地址?

希望高手把这4g地址中的每个位都讲清楚(最好是这样了)--不好意思,谁让你是高手呢!

主线程的两个堆栈地址分别是什么,其他线程的堆栈地址怎么分配?线程的两个堆栈是用来给函用的还是什么作用,线程切换的时候寄存器的信息要保存,它保存在什么地址了?
看了也没找到具体的地址在哪?

楼上关于语言的回答没看懂得。
加载更多回复(8)

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧