gpt4 book ai didi

linux - 为什么我执行的 sbrk 系统调用不起作用?

转载 作者:太空宇宙 更新时间:2023-11-04 09:33:46 27 4
gpt4 key购买 nike

我尝试写一个非常简单的操作系统来更好地理解基本原理。我需要实现用户空间 malloc。所以一开始我想在我的 linux 机器上实现和测试它。

起初我通过以下方式实现了sbrk()函数

void* sbrk( int increment ) {
return ( void* )syscall(__NR_brk, increment );
}

但是这段代码不起作用。相反,当我使用 os 提供的 sbrk 时,它工作正常。

我尝试使用 sbrk() 的另一个实现

static void *sbrk(signed increment)  
{
size_t newbrk;
static size_t oldbrk = 0;
static size_t curbrk = 0;

if (oldbrk == 0)
curbrk = oldbrk = brk(0);

if (increment == 0)
return (void *) curbrk;

newbrk = curbrk + increment;

if (brk(newbrk) == curbrk)
return (void *) -1;

oldbrk = curbrk;
curbrk = newbrk;

return (void *) oldbrk;
}

sbrk 从此函数调用

static Header *morecore(unsigned nu)  
{
char *cp;
Header *up;

if (nu < NALLOC)
nu = NALLOC;

cp = sbrk(nu * sizeof(Header));
if (cp == (char *) -1)
return NULL;

up = (Header *) cp;
up->s.size = nu; // ***Segmentation fault
free((void *)(up + 1));

return freep;
}

这段代码也行不通,在线 (***) 我得到段错误。哪里出了问题?

谢谢大家。我已经使用 sbrk 的新实现解决了我的问题。给定的代码工作正常。

void* __sbrk__(intptr_t increment)
{
void *new, *old = (void *)syscall(__NR_brk, 0);

new = (void *)syscall(__NR_brk, ((uintptr_t)old) + increment);

return (((uintptr_t)new) == (((uintptr_t)old) + increment)) ? old :
(void *)-1;
}

最佳答案

第一个 sbrk 应该有一个 long increment。而你忘记处理错误(并设置errno)

第二个sbrk 函数没有改变address space (正如 sbrk 所做的那样)。您可以使用 mmap 来更改它(但是使用 mmap 而不是 sbrk 不会将内核的数据段结束 View 更新为 sbrk 确实如此)。您可以使用 cat/proc/1234/maps 查询 pid 1234 进程的地址空间)。甚至从程序内部读取(例如使用 fopen&fgets)/proc/self/maps

顺便说一句,sbrk 已过时(大多数 malloc 实现使用 mmap),并且根据定义每个 system call (在 syscalls(2) 中列出)由内核执行(对于 sbrk内核 保持“数据段”限制!)。所以你无法避免内核,我什至不明白你为什么要模拟任何系统调用。几乎根据定义,您不能模拟系统调用,因为它们是从用户应用程序与内核交互的唯一方式。从用户应用程序来看,每个系统调用都是一个原子基本操作(由单个 SYSENTER 机器指令完成,机器寄存器中有适当的内容)。

你可以使用 strace(1)了解您正在运行的程序完成的实际系统调用。

顺便说一句,GNU libcfree software .你可以查看它的源代码。 musl-libc是一个更简单的 libc其代码更具可读性。

最后用 gcc -Wall -Wextra -g 编译并使用 gdb 调试器(如果你愿意,你甚至可以查询寄存器)。也许阅读 x86/64-ABI specificationLinux Assembly HowTo .

关于linux - 为什么我执行的 sbrk 系统调用不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28825329/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com