我想将一些值(比如2345)分配给一个内存位置(比如说0X12AED567).可以这样做吗?
换句话说,我该如何实现以下功能?
void AssignValToPointer(uint32_t pointer, int value)
{
}
Run Code Online (Sandbox Code Playgroud) 在 Linux 机器上,尝试编写驱动程序并尝试将一些内核内存映射到应用程序以提高性能。在线检查 mmap 的驱动程序实现,找到不同的实现方式。根据手册页,mmap - 在调用进程的虚拟地址空间中创建新的映射。
1)mmap调用时谁分配物理地址空间?内核还是设备驱动程序?
看到以下各种驱动程序 mmap 实现。
a) 驱动程序创建连续的物理内核内存并将其映射到进程地址空间。
static int driver_mmap(struct file *filp, struct vm_area_struct *vma)
{
unsigned long size = vma->vm_end - vma->vm_start;
pos = kmalloc(size); //allocate contiguous physical memory.
while (size > 0) {
unsigned long pfn;
pfn = virt_to_phys((void *) pos) >> PAGE_SHIFT; // Get Page frame number
if (remap_pfn_range(vma, start, pfn, PAGE_SIZE, PAGE_SHARED)) // creates mapping
return -EAGAIN;
start += PAGE_SIZE;
pos += PAGE_SIZE;
size -= PAGE_SIZE;
}
}
Run Code Online (Sandbox Code Playgroud)
b) 驱动程序创建虚拟内核内存并将其映射到进程地址空间。 …
在下面的 2 种情况下,“current->pid”打印什么
1) 硬IRQ上下文
2) 软IRQ上下文
我知道 IRQ 上下文和进程上下文是不同的,并且 PID 在 IRQ 上下文的情况下必须无效。但是当尝试在 IRQ 上下文中打印“current->pid”时,它正在打印一些有效的 PID,因此产生了疑问。请澄清。
谢谢你,
戈皮纳斯。