syn*_*ync 5 c memory function-pointers memcpy linux-kernel
有没有办法计算函数的大小?我有一个指向函数的指针,我必须使用memcpy复制整个函数.我必须malloc一些空间并知道memcpy的第三个参数 - 大小.我知道这 sizeof(function)不起作用.你有什么建议吗?
它不直接回答您的问题,但您不应该实现从内核代码到用户空间的回调.
将代码注入内核空间也不是一个很好的解决方法.
最好像进程间屏障一样表示用户/内核屏障.通过char设备在明确定义的协议之间来回传递数据,而不是代码.如果您确实需要传递代码,只需将其包装在内核模块中即可.然后,您可以动态加载/卸载它,就像.so基于插件的系统一样.
在旁注中,起初我误读了你确实想要传递memcpy()给内核.你必须提醒它,这是一个非常特殊的功能.它在C标准中定义,非常简单,范围很广,因此它是编译器作为内置程序提供的完美目标.
就像strlen(),strcmp()和其他海湾合作委员会.
也就是说,内置的事实并不妨碍你获取指针的能力.
即使有一种方法可以将sizeof()作为函数,但当您尝试调用已复制到内存中另一个区域的版本时,它仍可能失败.如果编译器具有到特定内存位置的本地或长跳转,该怎么办?你不能只在内存中移动一个函数并期望它运行.操作系统可以做到这一点,但它拥有完成它所需的所有信息.
我打算问一下操作系统是如何做到这一点的,但是现在我想到了,当操作系统移动它时,它通常会移动整个页面并处理内存,使地址转换为页面/偏移量.我甚至不确定操作系统是否会在内存中移动一个函数.
即使在OS在内存中移动函数的情况下,也必须声明或以其他方式编译/汇编函数本身以允许此类操作,通常通过指示代码可重定位的编译指示.所有内存引用都需要相对于其自己的堆栈帧(也称为局部变量)或包含某种段+偏移结构,以便CPU直接或在OS的命令下可以选择适当的段值.如果在创建应用程序时涉及链接器,则可能必须将应用程序重新链接到新功能地址的帐户.
有些操作系统可以为每个应用程序提供自己的32位地址空间,但它适用于整个进程和任何子线程,而不是单个函数.
正如其他地方所提到的,你真的需要一种语言,其中函数是一流的对象,否则你运气不好.