Linux

内核空间与用户空间共享内存(mmap)

好多次遇见mmap,但都没有实际实验过,最近终于抽出时间做了个mmap的小实验。这篇博文中的代码是在其他人的基础上修改而成,并非个人原创。

一、mmap实现方法:
将内核的物理内存通过mmap映射到用户空间,直接在用户空间对内核数据进行存取。
1、在内核中分配一片内存(kzalloc/__get_free_pages),将这片内存的虚拟地址转换成物理地址;
2、在内核的mmap函数中通过remap_pfn_range实现内核物理内存空间映射到用户虚拟地址空间转换的功能;
3、在应用程序中可以调用用户态的mmap函数,完成内核物理内存向用户空间的映射;
4、可直接利用这片被映射了的用户空间对内核空间进行存取操作。

二、程序实现功能:
1、创建mmap_dev字符设备,实现该设备的mmap函数;
2、在/proc中创建获取内核中分配的物理内存信息(起始地址和大小)的接口;
3、通过/proc读取内核中分配的物理内存信息(起始地址和大小);
4、通过读取的这些内存信息调用mmap函数,完成用户空间到内核空间的映射;
5、向这片映射过的用户空间写入数据。

Continue reading “内核空间与用户空间共享内存(mmap)” »

Linux字符设备驱动

模块头文件

Continue reading “Linux字符设备驱动” »

Linux驱动学习笔记4:带参数的模块

Linux的模块在装载到内核时还可以带有参数,按照《Linux设备驱动程序》一书上的说明,在运行的自行编译的Linux内核上进行了操作,把上一次编写的hello模块进行了简单的修改。

Linux内核:2.6.32.35

Linux发行版:CentOS 6.4

gedit hello.c

Continue reading “Linux驱动学习笔记4:带参数的模块” »

Linux驱动学习笔记3:编写第一个Linux模块

Linux内核树创建完成后,就可以编写Linux驱动模块了,编写了一个简单的hello模块,在模块加载到内核或从内核卸载时输出字符串信息。

gedit hello.c

Continue reading “Linux驱动学习笔记3:编写第一个Linux模块” »