小编Del*_*hts的帖子

调用位于堆中的函数时出现分段错误

我试图在这里略微调整规则和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到缓冲区,我知道我做了一些假设,但在我的平台上他们没问题.

c linux mprotect

15
推荐指数
1
解决办法
2705
查看次数

x86内核中的键盘IRQ

我正在尝试编写一个非常简单的内核用于学习目的.在阅读了大量有关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)

c x86 kernel irq osdev

6
推荐指数
1
解决办法
1841
查看次数

标签 统计

c ×2

irq ×1

kernel ×1

linux ×1

mprotect ×1

osdev ×1

x86 ×1