kwest
驱动牛犊
驱动牛犊
  • 注册日期2003-06-20
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1657回复:9

线程的问题,高手请进!

楼主#
更多 发布于:2003-10-07 23:10
《Windows NT技术内幕》(2rd)第79页说:“Win32进程中线程0的起始地址是Win32 Start-of-process函数,其他任何线程的起始地址都是Win32 start-of-thread函数。”

由于本人用的是Windows2000 sp1中文专业版。。我用Win2000 support tools中的Process Viewer观测到系统进程System的
线程0:Start Address是:0x8054aca6
线程1到线程9:Start Address是:0x80418ada
而从线程10开始,Start Address的值就各不相同了。
按照书上所说的:除线程0以外,同一进程中其他所有线程的起始地址都应该相同啊,为什么system进程例外呢?
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-10-09 08:46
你弄清什么是Win32进程后就很清楚原因了。
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-10-09 17:16
我没看过这本书,但是你可以想象一下,怎么可能一个进程里面的除0以外都一个起始地址喃,你那个1-9相同的线程起始地址肯定是共享代码段的三,书上说的start-of-thread各是各的,大家没说都是一个数字三,每个的可以不一样,0那个应该是暂时叫父线程的吧,应该就是整个进程,所以地址是唯一的,但是我觉得你也可以弄一个线程从它的进程地址开始执行:)你可以试试
根据地的兄弟们,团结就是力量
violin
驱动牛犊
驱动牛犊
  • 注册日期2003-10-02
  • 最后登录2009-08-22
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望83点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-10-10 08:09
你弄清什么是Win32进程后就很清楚原因了。


别人意思很明白了,system进程不是win32进程。
比如smss.exe也不是win32进程,在我的机器上的地址为:
TID:000140  StartAddress:0x48589586
TID:000148  StartAddress:0x48587ed6
TID:000152  StartAddress:0x48587ed6
TID:000160  StartAddress:0x48582f0f
TID:000156  StartAddress:0x48582ca4
TID:000164  StartAddress:0x77f9ac29

而作为win32进程一员的explorer.exe则为:
TID:000312  StartAddress:0x77e77cc6//主线程

TID:000808  StartAddress:0x77e67532  
TID:000816  StartAddress:0x77e67532  
TID:000672  StartAddress:0x77e67532  
TID:000660  StartAddress:0x77e67532  
TID:000876  StartAddress:0x77e67532  
TID:000956  StartAddress:0x77e67532  
TID:000964  StartAddress:0x77e67532  
TID:000456  StartAddress:0x77e67532  
TID:000508  StartAddress:0x77e67532  
TID:000744  StartAddress:0x77e67532  
TID:001112  StartAddress:0x77e67532  
TID:000548  StartAddress:0x77e67532  
TID:000892  StartAddress:0x77e67532  
TID:000676  StartAddress:0x77e67532  
TID:001376  StartAddress:0x77e67532  
TID:001380  StartAddress:0x77e67532  
TID:001488  StartAddress:0x77e67532    
TID:001516  StartAddress:0x77e67532  
TID:001484  StartAddress:0x77e67532
TID:001524  StartAddress:0x77e67532

[编辑 -  10/10/03 by  violin]
violin
驱动牛犊
驱动牛犊
  • 注册日期2003-10-02
  • 最后登录2009-08-22
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望83点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-10-10 08:19
我没看过这本书,但是你可以想象一下,怎么可能一个进程里面的除0以外都一个起始地址喃,你那个1-9相同的线程起始地址肯定是共享代码段的三,书上说的start-of-thread各是各的,大家没说都是一个数字三,每个的可以不一样,0那个应该是暂时叫父线程的吧,应该就是整个进程,所以地址是唯一的,但是我觉得你也可以弄一个线程从它的进程地址开始执行:)你可以试试


这位大概以为传给CreateThread的函数指针就是地址吧,随便想象当然不对了。你回去写个程序,创建几个线程,传给不同的函数指针,看看这些线程的start地址,都是“Win32 Start-of-process函数”。 :D :D :D
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-10-10 14:11
[quote]我没看过这本书,但是你可以想象一下,怎么可能一个进程里面的除0以外都一个起始地址喃,你那个1-9相同的线程起始地址肯定是共享代码段的三,书上说的start-of-thread各是各的,大家没说都是一个数字三,每个的可以不一样,0那个应该是暂时叫父线程的吧,应该就是整个进程,所以地址是唯一的,但是我觉得你也可以弄一个线程从它的进程地址开始执行:)你可以试试


这位大概以为传给CreateThread的函数指针就是地址吧,随便想象当然不对了。你回去写个程序,创建几个线程,传给不同的函数指针,看看这些线程的start地址,都是“Win32 Start-of-process函数”。 :D :D :D [/quote]

=====================================================
嗯,你说的现象我没有实验过,所以没有发言权,至于传给createthread的入口点是不是地址在预编译的时候不好说,但是变成代码以后应该是一个指针,哎,其实我还是没有发言权,这个指针也完全可能指向某个结构,再找到那个入口地址......:)这个和系统有关,designer说了算,兄弟们可以研究研究。
对了,你能解释为什么给出不同的入口点,但是起始地址一样的原因吗?是否有一段公共代码,作为初始化公用?
根据地的兄弟们,团结就是力量
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-10-10 14:17
忘了补充一句,大家注意起始地址一样指的是虚拟地址一样,如果虚拟地址不一样,可能物理地址可能一样,也可能不一样;但是虚拟一样,物理肯定一样,就是说在这个进程里面大家的起始地址肯定一样!
根据地的兄弟们,团结就是力量
violin
驱动牛犊
驱动牛犊
  • 注册日期2003-10-02
  • 最后登录2009-08-22
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望83点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-10-10 14:51

对了,你能解释为什么给出不同的入口点,但是起始地址一样的原因吗?是否有一段公共代码,作为初始化公用?


你后面的猜测对了,呵呵
jhome
驱动牛犊
驱动牛犊
  • 注册日期2002-07-04
  • 最后登录2005-01-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-10-10 16:53
you can see the ifmormation on the site named msdn
jhome
驱动牛犊
驱动牛犊
  • 注册日期2002-07-04
  • 最后登录2005-01-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-10-10 16:54
do it for yourself
游客

返回顶部