【问题标题】:How to find the current location of the program break如何找到程序中断的当前位置
【发布时间】:2016-03-07 16:38:47
【问题描述】:

我尝试在 brk 系统调用函数中添加这个:

void *addr = sbrk(0);
printk("current-add-is-%p-\n", addr);

但它在内核编译期间返回错误,即隐式声明 sbrk 函数。而且我找不到定义 sbrk 的位置!! 我只需要测量,每当某个用户进程尝试扩展其程序中断地址时,我就会知道它当前的程序中断地址,以便我可以测量有多少内存进程正在请求。

谢谢。

【问题讨论】:

    标签: linux linux-kernel kernel sbrk brk


    【解决方案1】:

    看起来你正在尝试做错事。

    没有“sbrk”系统调用,只有“brk”。除非它被命名为 sys_brk,但你没有理由调用它。因此,如果您想了解如何了解当前中断地址,请阅读 brk 的来源。

    但是,如果你没有找到 brk 的来源,你到底把它放在哪里了?

    【讨论】:

    • 能否请您说出“阅读 brk 的源代码”是什么意思,将其放入 brk 系统调用方法中。我知道没有 sbrk 系统调用。但是 sbrk 的手册页说 sbrk(0) 会给出当前的程序中断地址,所以只是尝试了 sbrk(0)
    • @ArjunBora:手册页描述了可用于用户空间程序的功能。 内核空间代码使用不同的函数集进行操作。
    • @Tsyvarev 好的,有什么办法可以从内核空间找到当前的程序中断地址吗?相当于 sbrk(0) 谢谢。
    • @ArjunBora:正如回答者所说,您可以查看brk 系统调用实现 - 这就是sbrk() 的实际实现方式。可能,您将能够重用其部分代码来执行所需的任务(获取当前中断地址)。要搜索系统调用实现,您可以在内核源代码的顶级目录中使用grep -r . --include "*.c" -e "SYSCALL_DEFINE1(brk"
    • @ArjunBora:当前任务的break地址应该在current->mm->brk
    【解决方案2】:

    添加这行代码:

    printf("Address of program break is %p\n", (void *)sbrk(0));
    

    它将向终端返回一条带有程序中断的十六进制地址的消息。(例如,0x#### #### ####。)

    如果你想要的不是十六进制的地址,那么使用 %u 或类似的。 sbrk(0) 的使用记录在手册页(Linux 程序员手册)中。

    要查看文档,请在命令行中输入:man sbrk,文档将弹出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-24
      相关资源
      最近更新 更多