阅读:1657回复:9
线程的问题,高手请进!
《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进程例外呢? |
|
沙发#
发布于:2003-10-09 08:46
你弄清什么是Win32进程后就很清楚原因了。
|
|
论坛版主
|
板凳#
发布于:2003-10-09 17:16
我没看过这本书,但是你可以想象一下,怎么可能一个进程里面的除0以外都一个起始地址喃,你那个1-9相同的线程起始地址肯定是共享代码段的三,书上说的start-of-thread各是各的,大家没说都是一个数字三,每个的可以不一样,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] |
|
地下室#
发布于:2003-10-10 08:19
我没看过这本书,但是你可以想象一下,怎么可能一个进程里面的除0以外都一个起始地址喃,你那个1-9相同的线程起始地址肯定是共享代码段的三,书上说的start-of-thread各是各的,大家没说都是一个数字三,每个的可以不一样,0那个应该是暂时叫父线程的吧,应该就是整个进程,所以地址是唯一的,但是我觉得你也可以弄一个线程从它的进程地址开始执行:)你可以试试 这位大概以为传给CreateThread的函数指针就是地址吧,随便想象当然不对了。你回去写个程序,创建几个线程,传给不同的函数指针,看看这些线程的start地址,都是“Win32 Start-of-process函数”。 :D :D :D |
|
论坛版主
|
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说了算,兄弟们可以研究研究。 对了,你能解释为什么给出不同的入口点,但是起始地址一样的原因吗?是否有一段公共代码,作为初始化公用? |
|
论坛版主
|
6楼#
发布于:2003-10-10 14:17
忘了补充一句,大家注意起始地址一样指的是虚拟地址一样,如果虚拟地址不一样,可能物理地址可能一样,也可能不一样;但是虚拟一样,物理肯定一样,就是说在这个进程里面大家的起始地址肯定一样!
|
|
7楼#
发布于:2003-10-10 14:51
你后面的猜测对了,呵呵 |
|
8楼#
发布于:2003-10-10 16:53
you can see the ifmormation on the site named msdn
|
|
9楼#
发布于:2003-10-10 16:54
do it for yourself
|
|