Tag: 程序计数器

从数据部分执行一段代码

我想获取一段代码,将其复制到全局数组中并从那里执行。 换句话说,我试图将一堆指令从代码部分复制到数据部分,然后设置程序计数器以继续从数据部分执行程序。 这是我的代码: #include #include typedef void(*func)(); static void code_section_func() { printf(“hello”); } #define CODE_SIZE 73 // I verified this size in the disassembly of ‘code_section_func’ static long long data[(CODE_SIZE-1)/sizeof(long long)+1]; // I am using ‘long long’ in order to obtain the maximum alignment int main() { func data_section_func = (func)data; memcpy((void*)data_section_func,(void*)code_section_func,CODE_SIZE); data_section_func(); return 0; […]

在内核中查找进程的程序计数器

我正在尝试跟踪内核中特定进程的PC值。 为此,我查看了内核源代码并发现pc存储在task_struct->stack ,为了理解堆栈,我需要将其转换为struct thread_info * 。 因此,在gdb中,我设置了一个断点b scheduler_tick (每10ms调用一次)。 但是,当我打印出p/x ((struct thread_info *)curr->stack)->cpu_context.pc ,我收到的值为$4 = 0x804d19d8 。 我预计PC将低于0x80000000因为我的内核中的0x80000000以上的地址被配置为内核空间。 在查看内核的objdump输出时,我看到pc指向__schedule 。 对于我从用户空间开始的进程,PC不应该指向用户空间指令吗? 我的理解是,当一个中断被触发时,寄存器状态被保存,中断被服务,然后寄存器状态被恢复,所以程序继续,就像“没有”发生一样。

如何在C或Assembly中修改Stack上的返回地址

如您所知,当子程序调用时,当前PC(程序计数器)值存储在堆栈中。 我想在子程序中修改它,如下所示。 我希望使用gcc编译器在Intel Core-i7 3632QM上执行此操作。 void main() { foo(); } void foo() { pop return address from stack; modify return address; push it to stack; }