C memcpy()函数

syn*_*ync 5 c memory function-pointers memcpy linux-kernel

有没有办法计算函数的大小?我有一个指向函数的指针,我必须使用memcpy复制整个函数.我必须malloc一些空间并知道memcpy的第三个参数 - 大小.我知道这 sizeof(function)不起作用.你有什么建议吗?

Bri*_*ndy 23

函数不是C中的第一类对象.这意味着它们不能传递给另一个函数,它们不能从函数返回,也不能复制到内存的另一部分.

函数指针虽然可以满足所有这些要求,但它是第一类对象.函数指针只是一个内存地址,它通常与机器上任何其他指针的大小相同.

  • 请注意,C规范确实允许函数指针与数据指针类型不兼容. (4认同)

Ste*_*epp 8

它不直接回答您的问题,但您不应该实现从内核代码到用户空间的回调.

将代码注入内核空间也不是一个很好的解决方法.

最好像进程间屏障一样表示用户/内核屏障.通过char设备在明确定义的协议之间来回传递数据,而不是代码.如果您确实需要传递代码,只需将其包装在内核模块中即可.然后,您可以动态加载/卸载它,就像.so基于插件的系统一样.

在旁注中,起初我误读了你确实想要传递memcpy()给内核.你必须提醒,这是一个非常特殊的功能.它在C标准中定义,非常简单,范围很广,因此它是编译器作为内置程序提供的完美目标.

就像strlen(),strcmp()其他海湾合作委员会.

也就是说,内置的事实并不妨碍你获取指针的能力.


Kel*_*nch 5

即使有一种方法可以将sizeof()作为函数,但当您尝试调用已复制到内存中另一个区域的版本时,它仍可能失败.如果编译器具有到特定内存位置的本地或长跳转,该怎么办?你不能只在内存中移动一个函数并期望它运行.操作系统可以做到这一点,但它拥有完成它所需的所有信息.


我打算问一下操作系统是如何做到这一点的,但是现在我想到了,当操作系统移动它时,它通常会移动整个页面并处理内存,使地址转换为页面/偏移量.我甚至不确定操作系统是否会在内存中移动一个函数.


即使在OS在内存中移动函数的情况下,也必须声明或以其他方式编译/汇编函数本身以允许此类操作,通常通过指示代码可重定位的编译指示.所有内存引用都需要相对于其自己的堆栈帧(也称为局部变量)或包含某种段+偏移结构,以便CPU直接或在OS的命令下可以选择适当的段值.如果在创建应用程序时涉及链接器,则可能必须将应用程序重新链接到新功能地址的帐户.

有些操作系统可以为每个应用程序提供自己的32位地址空间,但它适用于整个进程和任何子线程,而不是单个函数.

正如其他地方所提到的,你真的需要一种语言,其中函数是一流的对象,否则你运气不好.