Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux kernel armlinux:进程地址空间_Linux Kernel_Arm_Embedded Linux - Fatal编程技术网

Linux kernel armlinux:进程地址空间

Linux kernel armlinux:进程地址空间,linux-kernel,arm,embedded-linux,Linux Kernel,Arm,Embedded Linux,我正在使用一个带有ARM cortex_A9_MPCORE处理器的开发板(snowball),它运行的linux内核为3.0.8+。 我使用GDB和openocd进行调试 我正在寻找一种方法来查找用户模式进程的地址空间,特别是文本段和用户模式堆栈 首先,我查看了/proc/“PID”/maps,例如,我得到了一个正在运行的进程的输出: # cat /proc/1124/maps 00008000-000d5000 r-xp 00000000 b3:02 181 /system/bi

我正在使用一个带有ARM cortex_A9_MPCORE处理器的开发板(snowball),它运行的linux内核为3.0.8+。 我使用GDB和openocd进行调试

我正在寻找一种方法来查找用户模式进程的地址空间,特别是文本段和用户模式堆栈

首先,我查看了/proc/“PID”/maps,例如,我得到了一个正在运行的进程的输出:

# cat /proc/1124/maps
00008000-000d5000 r-xp 00000000 b3:02 181        /system/bin/lbsd
000d5000-000f8000 rw-p 000cd000 b3:02 181        /system/bin/lbsd
000f8000-0014a000 rw-p 00000000 00:00 0          [heap]
0014a000-0014c000 rw-p 00000000 00:00 0          [heap]
.
.
.
b0001000-b0009000 r-xp 00001000 b3:02 183        /system/bin/linker
b0009000-b000a000 rw-p 00009000 b3:02 183        /system/bin/linker
b000a000-b0015000 rw-p 00000000 00:00 0 
bea00000-bea21000 rw-p 00000000 00:00 0          [stack]
ffff0000-ffff1000 r-xp 00000000 00:00 0          [vectors]
然后,我使用GDB编写了一个脚本,从init_task开始解析板上运行的任务列表,对于每个任务,它都会获取task_struct中的mm_struct的值,然后提取start_code、end_code和start_stack的值。最后,脚本解析mmap所指向的不同内存区域。 脚本在板处于调试状态时运行,cortex a9的两个核心都暂停

以下是与上述相同流程的GDB脚本输出:

taskaddr 0xdf29f140
Name: lbsd
mm start text 8000
mm end text d4ba4
mm start stack bee63df0
####MEMORY REGIONS#####
vm_start 0x8000
vm_end 0xd5000
vm_flags 0x8001875
-----------------------
vm_start 0xd5000
vm_end 0xf8000
vm_flags 0x8101873
-----------------------
vm_start 0xf8000
vm_end 0x14a000
vm_flags 0x100073
-----------------------
vm_start 0x14a000
vm_end 0x14c000
vm_flags 0x100073
-----------------------
.
.
.
-----------------------
vm_start 0xb0001000
vm_end 0xb0009000
vm_flags 0x8000875
-----------------------
vm_start 0xb0009000
vm_end 0xb000a000
vm_flags 0x8100873
-----------------------
vm_start 0xb000a000
vm_end 0xb0015000
vm_flags 0x100073
-----------------------
vm_start 0xbee42000
vm_end 0xbee64000
vm_flags 0x100173
-----------------------
vm_start 0xffff0000
vm_end 0xffff1000
vm_flags 0x40c0055
-----------------------
除堆栈外,内存区域与使用的两种方法都匹配,在/proc方法的输出中,它从BEA0000开始,而在mm_结构的start_stack字段中,它位于bee63df0,vm_struct指向的内存区域指示bee42000。 有人能解释一下这些值的区别吗


我的第二个问题是关于00008000和000d5000之间的第一个内存区域的值,它对应于进程的文本部分。我注意到很多进程共享这些地址。内核如何获得文本内存区域的实际地址?

在ARM上,堆栈向下扩展。这意味着堆栈从更高的地址开始。这在堆栈
vma
vm_标志中可见,该堆栈设置了
vm_GROWSDOWN

堆栈
vma
vm_end
值为
0xbee64000
,比
0xbee63df0
start_堆栈
高528字节。之所以会发生这种情况,是因为在同一个VMA中,堆栈顶部有一些东西:命令行、环境和辅助向量

我不知道为什么堆栈(只有它)位于
/proc//maps
的不同地址。查看内核源代码,我看到
vma
可以显示为
[stack]
当且仅当
start\u stack
在其中时,因此如果
start\u stack
在查看
/proc//maps
时是相同的,
vma
不能被标记为
[stack]
。我能想到的唯一解释是,它来自不同的可执行文件运行,并且除了堆栈之外,其他所有内容都禁用了地址布局随机化


现在是第二个问题

进程运行时,硬件使用页表从虚拟地址(例如
0x8000
)映射到页的物理地址。内核也可以这样做;它有一个指向其
mm_结构中进程的根页表(
pgd
)的指针。一旦有了物理页码(
pfn
),它就可以进入相应的
struct页面
。有大量的宏和函数来执行所有这些操作


但可能缺少一页。例如,您的可执行文件的一个页面可能尚未出现故障。页面表中该页面的条目将显示为缺失。然后,内核查看相应的
vma
,在
vma
中给定一个偏移量,该偏移量有足够的信息从某处获取页面,并将其插入页面表中。

在ARM上,堆栈向下扩展。这意味着堆栈从更高的地址开始。这在堆栈
vma
vm_标志中可见,该堆栈设置了
vm_GROWSDOWN

堆栈
vma
vm_end
值为
0xbee64000
,比
0xbee63df0
start_堆栈
高528字节。之所以会发生这种情况,是因为在同一个VMA中,堆栈顶部有一些东西:命令行、环境和辅助向量

我不知道为什么堆栈(只有它)位于
/proc//maps
的不同地址。查看内核源代码,我看到
vma
可以显示为
[stack]
当且仅当
start\u stack
在其中时,因此如果
start\u stack
在查看
/proc//maps
时是相同的,
vma
不能被标记为
[stack]
。我能想到的唯一解释是,它来自不同的可执行文件运行,并且除了堆栈之外,其他所有内容都禁用了地址布局随机化


现在是第二个问题

进程运行时,硬件使用页表从虚拟地址(例如
0x8000
)映射到页的物理地址。内核也可以这样做;它有一个指向其
mm_结构中进程的根页表(
pgd
)的指针。一旦有了物理页码(
pfn
),它就可以进入相应的
struct页面
。有大量的宏和函数来执行所有这些操作

但可能缺少一页。例如,您的可执行文件的一个页面可能尚未出现故障。页面表中该页面的条目将显示为缺失。内核然后查看相应的
vma
,在
vma
中给定一个偏移量,该偏移量有足够的信息从某处获取页面,并将其插入页面表中