gpt4 book ai didi

c - 使用 C 代码在 Linux 中添加 mtrr 条目

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

我正在尝试向 MTRR 添加一个条目以将内存区域标记为写入组合,但内核不接受我的调用。它返回 EINVAL 错误号。可能是什么问题呢?我已经尝试了一切,但没有运气。这是代码和运行后的输出:

   #define NUM_ELTS        (1024*64)

struct mtrr_sentry sentry;

void register_wc(uint *addr);

void register_wc(uint *addr) {
int fd,ret;
int aux1,aux2;
int page_size;

sentry.base=(ulong) addr;
sentry.size=NUM_ELTS;
sentry.type=MTRR_TYPE_WRCOMB;

page_size=getpagesize();
aux1=sentry.base & (page_size - 1);
aux2=sentry.size & (page_size - 1);

printf("aux1=%d, aux2=%d, base=%d, size=%d, type=%d\n",aux1,aux2,sentry.base,sentry.size,sentry.type);

fd=open("/proc/mtrr",O_WRONLY); if (fd==-1) { perror("open()"); exit(2); }
printf("fd=%d\n",fd);
ret=ioctl(fd,MTRRIOC_ADD_ENTRY,&sentry); if (ret==-1) { perror("ioctl()"); exit(3); }
sleep(10);
close(fd);
}
int main(int argc, char **argv) {
ulong size;
uint *data;

size=sizeof(uint)*NUM_ELTS;

data=(uint*) memalign(4096,size); if (!data) { exit(1); }
printf("data address is %d, PAGE_SIZE=%d\n",data,getpagesize());
register_wc(data);
}

程序产生的输出是:

data address is -1420279808, PAGE_SIZE=4096
aux1=0, aux2=0, base=-1420279808, size=65536, type=1
fd=3
ioctl(): Invalid argument

代码是(几乎)从/usr/src/linux/Documentation/x86/mtrr.txt 复制的

最佳答案

您传递给 MTRRIOC_ADD_ENTRY 的基址必须是一个物理 地址。看起来您正在将一个逻辑 地址传递给您刚分配的内存块,这没有任何意义。 MTRR 用于控制对内存映射硬件的访问,而不是对 RAM 的访问。

关于c - 使用 C 代码在 Linux 中添加 mtrr 条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7642303/

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