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

时间:2022-10-05 16:56:06
就32位x86而言,进程的地址空间共有4g。  
0X00000000-7FFFFFFF是用户地址空间:这个地址空间中的放的东西具体地址是什么(尽量详细点),比如代码段,数据段,堆段,栈段还有bss段?进程的默认堆有多大,地址是多少,如果再申请的话地址怎么分配?主线程的两个堆栈地址分别是什么,其他线程的堆栈地址怎么分配?线程的两个堆栈是用来给函用的还是什么作用,线程切换的时候寄存器的信息要保存,它保存在什么地址了?  
0X80000000-FFFFFFFF是内核地址空间:这个地址空间中的放的东西具体地址是什么(尽量详细点),比如驱动放在什么地址,页表怎么放的,分页和不分页怎么放?  
线程本地存储器的地址在什么地方?  
另外关于c语言的:除各种运行时间库外一门编程语言到底是怎么出来的,它到底包括什么东西?(比如c语言),难道仅仅是规定语法,然后由其他人去写编译器把你的语法翻译成汇编语言(估计不会是这样的),这样一来不是说语言怎么样,而是谁的编译器做得好。  
脑子有点大,请高手指教。提的问题本身肯定就有不少错误,望指教。请不要介绍去看书,头大的。

28 个解决方案

#1


不会看书,死路一条,楼主可以改行了。:)

#2


多谢,领教了!

#3


去看windows程序设计和编译原理- -;

#4


晕,不是说了不要介绍书的吗?

#5


看过书的来说一下吧,就当复习一下吧

#6


语言是给人用的,又不是给机器用的,呵呵

#7


《windows 核心编程》内存管理部分,,

#8


哈,再详细点 :)

第三部分   内 存 管 理
第13章   Windows的内存结构 299
13.1   进程的虚拟地址空间 299
13.2   虚拟地址空间如何分区 300
13.2.1   NuLL 指针分配的分区—适用于
             Windows 2000和Windows 98 300
13.2.2   MS-DOS/16位Windows 应用程序兼容
             分区—仅适用于Windows 98 301
13.2.3   用户方式分区—适用于Windows 2000
             和Windows 98 301
13.2.4   64 KB禁止进入的分区—仅适用
             于Windows 2000 302
13.2.5   共享的MMF分区—仅适用于
             Windows 98 303
13.2.6   内核方式分区—适用于Windows 
             2000和Windows 98 303
13.3   地址空间中的区域 303
13.4    提交地址空间区域中的物理存储器 304
13.5   物理存储器与页文件 304
13.6   保护属性 307
13.6.1   Copy-On-Write 访问 308
13.6.2   特殊的访问保护属性的标志 309
13.7   综合使用所有的元素 309
13.7.1   区域的内部情况 312
13.7.2   与Windows 98地址空间的差别 315
13.8   数据对齐的重要性 319

#9


这几天正在研读中,,这本书写得很好,,不过觉得翻译一般 ,, 不知道哪里有原版,看不懂可以对照一下。

#10


呵呵,楼主问的问题我也想知道,受益了。

#11


实话跟大家说吧,核心编程我看过了,我觉得他讲的不够详细,或者是我看得不懂所以才来这问的,就怕大家给我说让我看了,结果没一个真正帮我的,晕死!
它有讲代码段具体地址是什么吗?
它有讲线程的两个堆栈地址什么吗?他讲的线程堆栈那一章举的例子地址是“保留的起始地址是0 x 0 8 0 0 0 0 0 0 ”,我就是看不懂才来问的。
大家的回帖让我很兴奋,但是也请大家说点实际的,根据我的要求回帖,这样才能达到这个帖子的效果,才能让我觉得散分散的值得。
还是请热心的高手详细指教!多谢了!

#12


0X00000000-7FFFFFFF是用户地址空间:这个地址空间中的放的东西具体地址是什么(尽量详细点),

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

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

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

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

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

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

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

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

ps:上面只是个人一些理解,不一定是对的,楼主可作参考。

#13


先说一下我以前知道的答案吧:
0X00000000-7FFFFFFF:应用程序代码,全局变量,线程堆栈,dll代码;我想知道他们的具体地址是什么?哪个占用多大?-----------个地址空间中的放的东西具体地址是什么(尽量详细点),比如代码段,数据段,堆段,栈段还有bss段?


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

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

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

楼上关于语言的回答没看懂得。

#14


还有请不要再介绍看书了,还指明是哪本书的哪个章节,有的还把目录给粘过来了,看得出来真够费心的。在这多谢了。

#15


呵呵,兄弟,你要太多会看怕人的。

#16


再等一天就结帖,郁闷!

#17


是我的问题不值得回答还是给分太少?这些问题我真的想搞明白,跪求高手回答,或留下联系方式。

#18


楼主到windows地方去问问吧! 那边高手比较多。

#19


多谢楼上的好意见

#20


WINDOWS核心编程

#21


up

#22


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#,也许以后面向问题了,又会有新的语言出来!

#23


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语言作为一门语言,它包括什么(到底需要发明什么),语法,关键字这些是规定不需要发明吧?


#24


忘了,我问的问题太多,可是帖子最高加分是100,我也没办法,又不想开新帖,怎么办?

#25


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++的基础上,又开创了可移植、垃圾回收等思想。

#26


TO:光光
再问一次吧,要不我不甘心....
1.进程的环境变量和命令行参数是不是都在进程控制块中?
2.保护模式下的平坦式内存使用虚拟地址(线性地址)而不使用逻辑地址(段:偏移地址)?
3.晕阿,tls就是线程在用户模式下的那个堆栈?我原来以为tls和那两个堆栈是分开的。
4.语言是编程思想。假如我有一种新的思想,然后我把实现这种思想所需要的关键字和语法规定一下,这就形成了一门语言?编译器的厂商负责翻译这些语法和关键?
多谢了!

#27


1.进程的环境变量指什么?进程ID,句柄,创建时间等内核要用来管理进程的就放在EProcess块(内核中),进程的入口函数地址,堆指针,栈指针……这些就放在PEB中(用户模式中)。命令行参数我记得是压入主线程栈的,不在EProcess和PEB中。
2.Win32下不用段:偏移地址。
3.tls和线程用户模式下的普通栈是不同的。两个栈都在teb中保存有信息,普通栈是保存的是一个指针,tls是以数组形式完全含在teb中,tls本来容量就不大,并且大小固定的。
4.差不多是这样的。

#28


说错了,PEB中的没有栈指针,栈指针是TEB中的。

#1


不会看书,死路一条,楼主可以改行了。:)

#2


多谢,领教了!

#3


去看windows程序设计和编译原理- -;

#4


晕,不是说了不要介绍书的吗?

#5


看过书的来说一下吧,就当复习一下吧

#6


语言是给人用的,又不是给机器用的,呵呵

#7


《windows 核心编程》内存管理部分,,

#8


哈,再详细点 :)

第三部分   内 存 管 理
第13章   Windows的内存结构 299
13.1   进程的虚拟地址空间 299
13.2   虚拟地址空间如何分区 300
13.2.1   NuLL 指针分配的分区—适用于
             Windows 2000和Windows 98 300
13.2.2   MS-DOS/16位Windows 应用程序兼容
             分区—仅适用于Windows 98 301
13.2.3   用户方式分区—适用于Windows 2000
             和Windows 98 301
13.2.4   64 KB禁止进入的分区—仅适用
             于Windows 2000 302
13.2.5   共享的MMF分区—仅适用于
             Windows 98 303
13.2.6   内核方式分区—适用于Windows 
             2000和Windows 98 303
13.3   地址空间中的区域 303
13.4    提交地址空间区域中的物理存储器 304
13.5   物理存储器与页文件 304
13.6   保护属性 307
13.6.1   Copy-On-Write 访问 308
13.6.2   特殊的访问保护属性的标志 309
13.7   综合使用所有的元素 309
13.7.1   区域的内部情况 312
13.7.2   与Windows 98地址空间的差别 315
13.8   数据对齐的重要性 319

#9


这几天正在研读中,,这本书写得很好,,不过觉得翻译一般 ,, 不知道哪里有原版,看不懂可以对照一下。

#10


呵呵,楼主问的问题我也想知道,受益了。

#11


实话跟大家说吧,核心编程我看过了,我觉得他讲的不够详细,或者是我看得不懂所以才来这问的,就怕大家给我说让我看了,结果没一个真正帮我的,晕死!
它有讲代码段具体地址是什么吗?
它有讲线程的两个堆栈地址什么吗?他讲的线程堆栈那一章举的例子地址是“保留的起始地址是0 x 0 8 0 0 0 0 0 0 ”,我就是看不懂才来问的。
大家的回帖让我很兴奋,但是也请大家说点实际的,根据我的要求回帖,这样才能达到这个帖子的效果,才能让我觉得散分散的值得。
还是请热心的高手详细指教!多谢了!

#12


0X00000000-7FFFFFFF是用户地址空间:这个地址空间中的放的东西具体地址是什么(尽量详细点),

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

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

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

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

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

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

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

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

ps:上面只是个人一些理解,不一定是对的,楼主可作参考。

#13


先说一下我以前知道的答案吧:
0X00000000-7FFFFFFF:应用程序代码,全局变量,线程堆栈,dll代码;我想知道他们的具体地址是什么?哪个占用多大?-----------个地址空间中的放的东西具体地址是什么(尽量详细点),比如代码段,数据段,堆段,栈段还有bss段?


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

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

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

楼上关于语言的回答没看懂得。

#14


还有请不要再介绍看书了,还指明是哪本书的哪个章节,有的还把目录给粘过来了,看得出来真够费心的。在这多谢了。

#15


呵呵,兄弟,你要太多会看怕人的。

#16


再等一天就结帖,郁闷!

#17


是我的问题不值得回答还是给分太少?这些问题我真的想搞明白,跪求高手回答,或留下联系方式。

#18


楼主到windows地方去问问吧! 那边高手比较多。

#19


多谢楼上的好意见

#20


WINDOWS核心编程

#21


up

#22


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#,也许以后面向问题了,又会有新的语言出来!

#23


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语言作为一门语言,它包括什么(到底需要发明什么),语法,关键字这些是规定不需要发明吧?


#24


忘了,我问的问题太多,可是帖子最高加分是100,我也没办法,又不想开新帖,怎么办?

#25


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++的基础上,又开创了可移植、垃圾回收等思想。

#26


TO:光光
再问一次吧,要不我不甘心....
1.进程的环境变量和命令行参数是不是都在进程控制块中?
2.保护模式下的平坦式内存使用虚拟地址(线性地址)而不使用逻辑地址(段:偏移地址)?
3.晕阿,tls就是线程在用户模式下的那个堆栈?我原来以为tls和那两个堆栈是分开的。
4.语言是编程思想。假如我有一种新的思想,然后我把实现这种思想所需要的关键字和语法规定一下,这就形成了一门语言?编译器的厂商负责翻译这些语法和关键?
多谢了!

#27


1.进程的环境变量指什么?进程ID,句柄,创建时间等内核要用来管理进程的就放在EProcess块(内核中),进程的入口函数地址,堆指针,栈指针……这些就放在PEB中(用户模式中)。命令行参数我记得是压入主线程栈的,不在EProcess和PEB中。
2.Win32下不用段:偏移地址。
3.tls和线程用户模式下的普通栈是不同的。两个栈都在teb中保存有信息,普通栈是保存的是一个指针,tls是以数组形式完全含在teb中,tls本来容量就不大,并且大小固定的。
4.差不多是这样的。

#28


说错了,PEB中的没有栈指针,栈指针是TEB中的。