磁盘的 MBR 是否包含此信息,因此当我调用 fdisk 之类的命令时,内核级代码最终会运行并从 MBR 中的特定部分读取它?如果有,是哪一部分?什么抵消?
如果它不在 MBR 中,那么这些类型的命令如何找到它?考虑到他们需要计算该分区的起始地址并且他们需要扇区大小来这样做,他们不能从分区的开头读取它,不是吗?
如何fdisk
执行命令来查找这些信息?他们从哪里读到的?
因此,当我尝试以普通用户身份使用 Xorg 命令时,这是它给我的错误:
/usr/lib/xorg/Xorg.wrap: Only console users are allowed to run the X server
但我不明白,什么是“控制台用户”?当我切换到 root 时,它给了我另一个错误:
_XSERVTransSocketUNIXCreateListener: ...SocketCreateListener() failed
_XSERVTransMakeAllCOTSServerListeners: server already running
(EE)
Fatal server error:
(EE) Cannot establish any listening sockets - Make sure an X server isn't already running(EE)
(EE)
Please consult the The X.Org Foundation support
at http://wiki.x.org
for help.
(EE) Please also check the log file at "/var/log/Xorg.0.log" for additional information.
(EE)
(EE) Server terminated with error (1). Closing log file.
那么发生了什么,每个错误的原因是什么?
更新:命令的输出netstat -ln | grep -E '[.]X|:6[0-9][0-9][0-9]
是:
unix 2 [ ACC ] STREAM LISTENING 18044 @/tmp/.X11-unix/X0
unix 2 [ ACC ] STREAM LISTENING 47610 @/tmp/.X11-unix/X1
unix 2 [ ACC ] STREAM LISTENING 18045 /tmp/.X11-unix/X0
unix 2 [ ACC ] STREAM LISTENING 47611 /tmp/.X11-unix/X1
所以我在读这个问题:
https://stackoverflow.com/questions/1762418/what-resources-are-shared-between-threads
并基于答案,“线程共享除堆栈之外的所有段,但一个线程仍然可以访问另一个线程的堆栈”??
但我还有三个问题:
一个进程的所有线程都在同一个虚拟内存空间中工作吗?
当我们说线程仍然可以访问其他线程的堆栈时,这是否意味着例如,如果我们的堆栈从 0x00 到 0xff,那么一个线程可能从 0x00 到 0x0f 工作,而另一个线程从 0x10 到 0xff 工作?或者 ..?
堆栈是Linux中每个线程唯一的虚拟内存中唯一的部分吗?
这是在 gdb 中查看进程的虚拟内存的结果;我对此有一些疑问:
为什么虚拟内存的某些部分是重复的?比如我们的程序(stack6)和libc库重复4次;如果他们将它们分成不同的部分,那为什么呢?为什么不把它们放在一起呢?
最上面的路径(/opt/pro...)是我们虚拟内存的指令部分(文本部分)并且只包含指令吗?
为什么4个libc的大小不同?偏移量是怎么回事,如果我们已经有了大小和起始地址,那么偏移量是什么?
数据、bss、内核和堆部分在哪里?为什么上图中的某些部分没有关于它们的信息?gdb 中是否有更好的选项可以实际显示所有部分?
有没有比 gdb 更好的程序可以更好地显示我们进程的虚拟内存部分?我只想对实际的虚拟内存有一个很好的了解,哪个调试程序提供了最好的结果。
我提到的部分:
所以这个视频中的那个人:
https://www.youtube.com/watch?v=1S0aBV-Waeo
溢出堆栈,篡改返回地址,将其指向堆栈并使用 NOP 滑动复制堆栈中的可执行代码
但我认为所有现代 linux 系统(包括 debian 系统)都使用页表中的 NX(不可执行)类型的位并使用像这样的停止指令在堆栈中工作来防御这种情况?还是我错过了什么?
我发现了一个类似的问题,但它仍然没有回答我的问题 所有进程的虚拟地址空间在其“内核”部分中是否具有相同的内容?
首先,考虑到用户进程无权访问这部分,我猜如果他们尝试访问它会导致错误,那么为什么还要将此部分包含在用户进程虚拟空间中?你们能给我一个真实生活场景,说明这部分是必不可少且有用的吗?
另外,还有一个问题是我一直认为内存的内核部分是动态的,这意味着例如当我们在程序中使用动态库时它可能会增长,这是真的吗?如果是这样,那么操作系统如何确定内核在我们进程的虚拟空间中的大小?
当我们在物理内存中的内核增长或变化时,对于所有进程,虚拟内存的内核部分是否会发生相同的效果?这个虚拟内核到真实内核的映射是一对一的映射吗?