我正在尝试将自定义系统调用添加到linux内核中.这是一个简单的代码:
#include <linux/mysyscall.h>
#include <linux/kernel.h>
#include <asm/uaccess.h>
#include <asm/system.h>
asmlinkage int sys_mysyscall(int *data){
int a = 3;
cli();
copy_to_user(data, &a, 1);
sti();
printk(KERN_EMERG "Called with %d\n", a);
return a;
}
Run Code Online (Sandbox Code Playgroud)
我可以编译一个添加了mysyscall的内核,当我尝试使用以下用户程序访问它时:
#include <linux/mysyscall.h>
int main(void){
int *data;
int r;
int a = 0;
data = &a;
r = mysyscall(data);
printf("r is %d and data is %d", r, *data);
}
Run Code Online (Sandbox Code Playgroud)
*数据不等于3,等于0.
我应该如何使用copy_to_user来修复它?
我知道可执行文件中的软件断点可以通过用另一个替换所需位置的某些汇编指令来工作,这会导致中断.因此,调试器可以在此处完全停止执行,并将此指令替换为原始指令,并询问用户下一步操作或调用某些命令等.
但是这样的可执行文件的代码不被其他程序使用,并且在内存中只有一个副本.软件断点如何与共享库一起使用?例如,如果我在C库的某个内部函数中设置一个软件断点,它的工作原理(据我所知它只有一个副本用于所有应用程序,所以我们不能只替换它中的一些指令)?是否有为此目的的"软件断点"技术?
我正在开发一个性能关键型应用程序,它必须移植到Intel Atom处理器,它只支持MMX,SSE,SSE2和SSE3.我以前的应用程序支持SSSE3以及AVX,现在我想将它降级到Intel Atom处理器(MMX,SSE,SSE2,SSE3).
当我更换ssse3指令时,特别是_mm_hadd_epi16
使用此代码,会严重降低性能
RegTemp1 = _mm_setr_epi16(RegtempRes1.m128i_i16[0], RegtempRes1.m128i_i16[2],
RegtempRes1.m128i_i16[4], RegtempRes1.m128i_i16[6],
Regfilter.m128i_i16[0], Regfilter.m128i_i16[2],
Regfilter.m128i_i16[4], Regfilter.m128i_i16[6]);
RegTemp2 = _mm_setr_epi16(RegtempRes1.m128i_i16[1], RegtempRes1.m128i_i16[3],
RegtempRes1.m128i_i16[5], RegtempRes1.m128i_i16[7],
Regfilter.m128i_i16[1], Regfilter.m128i_i16[3],
Regfilter.m128i_i16[5], Regfilter.m128i_i16[7]);
RegtempRes1 = _mm_add_epi16(RegTemp1, RegTemp2);
Run Code Online (Sandbox Code Playgroud)
这是我能够为这个特定指令提出的最佳转换.但这种变化严重影响了整个计划的表现.
任何人都可以在MMX,SSE,SSE2和SSE3指令中建议更好的性能效率替代_mm_hadd_epi16
指令.提前致谢.
breakpoints ×1
debugging ×1
gdb ×1
intel ×1
intel-atom ×1
internals ×1
linux-kernel ×1
simd ×1
sse ×1
sse3 ×1
system-calls ×1