- 主题:Linux应用程序新创建一个线程,线程栈是放在哪里的?
- 为什么是mmap?
 【 在 hgoldfish 的大作中提到: 】
 : 线程可以有无穷多个。不会是固定的位置。每个栈用 mmap 申请一段内存作为线程的栈空间。你可以搜一下 MAP_STACK 和 MAP_GROWSDOWN,都是专门为栈空间设计的。一起使用时,线程可以申请 128M 的栈空间,但实际系统只分配 64K,剩下的等用到了再分配。
 --
 FROM 139.226.178.*
 
- 页表里不是设置了权限吗? - 【 在 nh26223 的大作中提到: 】 - : 标  题: Re: Linux应用程序新创建一个线程,线程栈是放在哪里的? - : 发信站: 水木社区 (Wed Oct 18 07:49:57 2023), 站内 - :  - : 对 - : - 来自 水木社区APP v3.5.7 - : 【 在 wjhtingerx 的大作中提到: 】 - : : 就是说这栈空间完全没有保护的对吧?进程里任何瞎写都可能把某个线程的栈破坏掉吧? - : -- - :  - :  - : ※ 来源:· https://exp.mysmth.net- ·[FROM: 39.144.107.*] - -- - FROM 139.226.178.* 
- 这个是 unix  系统提供的一个系统调用,普通程序向内核申请内存。
 
 虽然每个 amd64 的应用程序都能看到 2 ** 64 字节的内存空间,但是随便往里面读写数据是不行的。得先向内存申请一下内存空间。
 
 mmap() 除了可以申请未使用的内存,还可以把文件的内容映射到内存里面。读写这段内存相当于读写文件。所以叫做 memory map.
 
 【 在 JulyClyde 的大作中提到: 】
 : 为什么是mmap?
 --
 FROM 117.28.152.*
 
- mmap不是把文件映射到内存地址吗?
 申请内存不是brk syscall吗?
 【 在 hgoldfish 的大作中提到: 】
 : 这个是 unix  系统提供的一个系统调用,普通程序向内核申请内存。
 : 虽然每个 amd64 的应用程序都能看到 2 ** 64 字节的内存空间,但是随便往里面读写数据是不行的。得先向内存申请一下内存空间。
 : mmap() 除了可以申请未使用的内存,还可以把文件的内容映射到内存里面。读写这段内存相当于读写文件。所以叫做 memory map.
 : ...................
 --
 FROM 139.226.178.*
 
- 申请的栈空间,一定是可读可写的,这个权限是针对整个进程的。举个例子:
 
 线程1:
 
 byte buf[1024];
 command_to_bytes(buf, command);
 mq.process(buf);
 // buf is changed
 
 线程2:
 
 byte[] buf = mq.get();
 command_from_bytes(buf, &command);
 result = process(command);
 result_to_bytes(buf, result);
 
 在线程 2 里面修改线程 1 的栈是可行的吧,虽然说不是很安全。
 
 【 在 JulyClyde 的大作中提到: 】
 : 页表里不是设置了权限吗?
 --
 FROM 117.28.152.*
 
- mmap() 也可以申请内存的。不止 brk.
 
 我没有确认,不过我猜大多数情况下,线程栈都是调用 mmap() 而不是 brk() 来申请内存,因为 mmap() 有 MAP_STACK 和 MAP_GROWDOWN 这两个标志位。哪位大佬确认一下。
 
 进程的堆才用 brk
 
 【 在 JulyClyde 的大作中提到: 】
 : mmap不是把文件映射到内存地址吗?
 : 申请内存不是brk syscall吗?
 --
 修改:hgoldfish FROM 117.28.152.*
 FROM 117.28.152.*
 
- 野指针本身就是难调的问题。
 - 来自 水木社区APP v3.5.7
 【 在 wjhtingerx 的大作中提到: 】
 : 那这样的话,程序里某个bug把其他某个线程栈写了,然后这个线程栈崩了,这种问题怎么查?感觉毫无迹象可循啊
 --
 FROM 39.144.107.*
 
- 同一个进程用的同一个页表
 - 来自 水木社区APP v3.5.7
 【 在 JulyClyde 的大作中提到: 】
 : 页表里不是设置了权限吗?
 --
 FROM 39.144.107.*
 
- brk现在用的很少了。基本都mmap 了
 - 来自 水木社区APP v3.5.7
 【 在 hgoldfish 的大作中提到: 】
 : mmap() 也可以申请内存的。不止 brk.
 :
 : 我没有确认,不过我猜大多数情况下,线程栈都是调用 mmap() 而不是 brk() 来申请内存,因为 mmap() 有 MAP_STACK 和 MAP_GROWDOWN 这两个标志位。哪位大佬确认一下。
 :
 : 进程的堆才用 brk
 --
 FROM 39.144.107.*
 
- 就是在这么做,想知道有没有其他更有效的办法
 
 
 【 在 chunhui 的大作中提到: 】
 : 可以把工程的不同模块关闭,二分法试探,等待...
 : 或者看被覆盖的位置写入了什么东西,什么地方会写入这一类东西,然后猜。
 --
 FROM 144.34.191.*