- 主题: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.*