devmem_is_allowed 函数
时间: 2024-05-16 11:12:36 浏览: 229
`devmem_is_allowed` 函数是 Linux 内核中的一个函数,用于检查是否允许使用 `devmem` 命令访问物理内存。该函数通常在 `arch/arm/mm/dma-mapping.c` 中定义,其实现如下:
```c
static bool __init devmem_is_allowed(unsigned long pfn, unsigned long size)
{
if (!capable(CAP_SYS_RAWIO))
return false;
if (!phys_addr_valid(pfn << PAGE_SHIFT))
return false;
if (!access_ok((void __force *)phys_to_virt(pfn << PAGE_SHIFT), size))
return false;
return true;
}
```
该函数接受两个参数,一个是物理页帧号 `pfn`,另一个是要访问的内存大小 `size`。该函数首先检查当前进程是否具有 CAP_SYS_RAWIO 权限,如果没有则返回 false,表示不允许访问。然后,它检查物理页帧号是否有效,如果无效则返回 false。最后,它使用 `access_ok` 函数检查要访问的内存区域是否在进程的地址空间中,并返回相应的结果。如果所有检查都通过,则返回 true,表示允许访问。
相关问题
检测devmem_is_allowed 函数是否正常运行
`devmem_is_allowed` 函数是用来检测是否允许使用 `dev/mem` 设备进行直接内存访问。该函数通常在用户空间程序中被调用,在内核中实现。如果返回值为 0,则表示不允许直接内存访问,如果返回值为 1,则表示允许直接内存访问。
你可以使用以下命令来测试 `devmem_is_allowed` 函数是否正常运行:
```
sudo cat /proc/sys/kernel/dmesg_restrict
```
如果返回值为 1,则表示 `devmem_is_allowed` 函数未正常运行,因为 `dmesg_restrict` 的值为 1,表示不允许非特权用户访问内核日志。你可以使用以下命令来修改 `dmesg_restrict` 的值:
```
sudo sysctl -w kernel.dmesg_restrict=0
```
然后再次运行上述命令,如果返回值为 0,则表示 `devmem_is_allowed` 函数正常运行。
检测devmem_is_allowed 函数是否正常运行判断
`devmem_is_allowed` 函数用于检查是否允许使用 `dev/mem` 设备进行物理地址访问。你可以按照以下步骤来检测该函数是否正常运行:
1. 编写一个测试程序,调用 `devmem_is_allowed` 函数进行检查。例如:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/mman.h>
#include <fcntl.h>
int devmem_is_allowed(void)
{
int fd;
void *map;
fd = open("/dev/mem", O_RDWR | O_SYNC);
if (fd == -1) {
return 0;
}
map = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (map == MAP_FAILED) {
close(fd);
return 0;
}
close(fd);
munmap(map, 4096);
return 1;
}
int main()
{
if (devmem_is_allowed()) {
printf("dev/mem access is allowed\n");
} else {
printf("dev/mem access is not allowed\n");
}
return 0;
}
```
2. 编译并运行测试程序。如果输出为 `dev/mem access is allowed`,则说明 `devmem_is_allowed` 函数正常运行。如果输出为 `dev/mem access is not allowed`,则说明该函数未能正常运行。
注意:在一些系统中,只有 root 用户才能访问 `dev/mem` 设备,因此你需要使用 root 用户或者使用 `sudo` 命令来运行测试程序。
阅读全文