我试图在这里略微调整规则和malloc缓冲区,然后将函数复制到缓冲区.
调用缓冲函数有效,但是当我试图调用其中的另一个函数时,该函数会抛出分段错误.
有什么想法?
#include <stdio.h>
#include <sys/mman.h>
#include <unistd.h>
#include <stdlib.h>
int foo(int x)
{
printf("%d\n", x);
}
int bar(int x)
{
}
int main()
{
int foo_size = bar - foo;
void* buf_ptr;
buf_ptr = malloc(1024);
memcpy(buf_ptr, foo, foo_size);
mprotect((void*)(((int)buf_ptr) & ~(sysconf(_SC_PAGE_SIZE) - 1)),
sysconf(_SC_PAGE_SIZE),
PROT_READ|PROT_WRITE|PROT_EXEC);
int (*ptr)(int) = buf_ptr;
printf("%d\n", ptr(3));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
此代码将抛出一个段错误,除非我将foo函数更改为:
int foo(int x)
{
//Anything but calling another function.
x = 4;
return x;
}
Run Code Online (Sandbox Code Playgroud)
注意:
代码成功复制foo到缓冲区,我知道我做了一些假设,但在我的平台上他们没问题.
我正在尝试编写一个非常简单的内核用于学习目的.在阅读了大量有关x86架构中PIC和IRQ的文章后,我发现这IRQ1是键盘处理程序.我正在使用以下代码打印正在按下的键:
#include "port_io.h"
#define IDT_SIZE 256
#define PIC_1_CTRL 0x20
#define PIC_2_CTRL 0xA0
#define PIC_1_DATA 0x21
#define PIC_2_DATA 0xA1
void keyboard_handler();
void load_idt(void*);
struct idt_entry
{
unsigned short int offset_lowerbits;
unsigned short int selector;
unsigned char zero;
unsigned char flags;
unsigned short int offset_higherbits;
};
struct idt_pointer
{
unsigned short limit;
unsigned int base;
};
struct idt_entry idt_table[IDT_SIZE];
struct idt_pointer idt_ptr;
void load_idt_entry(char isr_number, unsigned long base, short int selector, char flags)
{
idt_table[isr_number].offset_lowerbits = base & 0xFFFF;
idt_table[isr_number].offset_higherbits …Run Code Online (Sandbox Code Playgroud)