Linux将设备地址映射到用户空间内存映射与VMA?

Linux将设备地址映射到用户空间内存映射与VMA?,第1张

一般情况下,用户空间是不可能也不应该直接访问设备的,但是,设备驱动程序中可实现mmap ()函数,这个函数可使得用户空间能直接访问设备的物理地址。实际上,mmap ()实现了这样的一个映射过程:它将用户空间的一段内存与设备内存关联,当用户访问用户空间的这段地址范围时,实际上会转化为对设备的访问。

这种能力对于显示适配器一类的设备非常有意义,如果用户空间可直接通过内存映射访问显存的话,屏幕帧的各点像素将不再需要一个从用户空间到内核空间的复制的过程。

mmap ()必须以PAGE_SIZE为单位进行映射,实际上,内存只能以页为单位进行映射,若要映射非PAGE_SIZE整数倍的地址范围,要先进行页对齐,强行以PAGE_SIZE的倍数大小进行映射。

从file_operations文件 *** 作结构体可以看出,驱动中mmap ()函数的原型如下:

int ( *mmap)(struct file *, struct vm_area_struct* )

驱动中的mmap () 函数将在用户进行mmap ()系统调用时最终被调用,mmap ()系统调用的原型与file_operations中mmap ()的原型区别很大,如下所示:

caddr_t mmap (caddr_t addr,size_t len,int prot,int flags,int fd,off_t offset)

参数fd为文件描述符,一般由open ()返回,fd也可以指定为-1,此时需指定flags参数中的MAP_ANON,表明进行的是匿名映射。

len是映射到调用用户空间的字节数,它从被映射文件开头offset个字节开始算起,offset参数一般设为0,表示从文件头开始映射。

prot参数指定访问权限,可取如下几个值的“或”:PROT_READ(可读)、PROT_WRITE(可写)、PROT_EXEC(可执行)和PROT_NONE(不可访问)。

参数addr指定文件应被映射到用户空间的起始地址,一般被指定为NULL,这样,选择起始地址的任务将由内核完成,而函数的返回值就是映射到用户空间的地址。其类型caddr_t实际上就是void*。

当用户调用mmap ())的时候,内核会进行如下处理。

1)在进程的虚拟空间查找一块VMA。

2)将这块VMA进行映射。

3)如果设备驱动程序或者文件系统的file_operations定义了mmap () *** 作,则调用它。

4)将这个VMA插入进程的VMA链表中。

file_operations中mmap ()函数的第一个参数就是步骤1)找到的VMA。

由mmap ()系统调用映射的内存可由munmap ()解除映射,这个函数的原型如下:

int munmap(caddr_t addr, size_t len )

驱动程序中mmap ()的实现机制是建立页表,并填充VMA结构体中vm_operations_struct指针。

Tracepath。

Tracepath指令可以追踪数据到达目标主机的路由信息,同时还能够发现MTU值。它跟踪路径到目的地,沿着这条路径发现MTU。它使用UDP端口或一些随机端口。

它类似于Traceroute,只是不需要超级用户特权,并且没有花哨的选项。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8380406.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-15
下一篇2023-04-15

发表评论

登录后才能评论

评论列表(0条)

    保存