测试ldd3中的simple例子(mmap内存映射)

发布于 2022-09-23 15:20:05 字数 765 浏览 14 评论 0

弄了两天,总算弄明白了内核虚拟地址,内核逻辑地址,物理地址,page, pfn等的概念及转换
初步了解了设备的mmap操作(我只会很简单的)

下面的两个例子是由ldd3的simple改写而成,解压后直接make
测试例程则是自己写的,也很简单, 但需要手工编译,因为我不会在同一Makefile中写多个目标,特别是因为这个Makefile是编译模块的
编译测试代码 gcc test.c -o test /xx/yy/bb.a (/xx/yy/bb.a是因为这个例程里使用了apue的例库)
理所当然也可以不用,直接把test.c中的err_sys和第一行的include去掉
然后直接gcc test.c -o test就行了

这里有两种不同类型的内存映射方式,一种是remap,另一种是nopage(哈,我也不知道怎么区分,暂且就这叫吧)
第一种方式是相当于一次性映射,后一种方式则是按需要映射,当访问的页面不存在时再映射
LDD3上说第一种方式只能映射保留页面和超出物理内存的物理地址(这是LDD3第425页的话,所谓超出物理内存的物理地址是什么??
是不是由vmalloc等分配的高端内存?),所以在分配内存后通过SetPageReserved设置了页面标志,使之不会换出
第二种方式则不需要设置页面保留标志位

测试时先执行load脚本,然后./test就可以看到结果了,用dmesg可以看到nopage, mmap的操作过程

[ 本帖最后由 fly6 于 2009-3-4 16:26 编辑 ]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

GRAY°灰色天空 2022-09-30 15:20:05

看了下scullp,出现断错误应该是在simple驱动中根本就没有分配内存页面.也没有维护内存页面

但驱动什么时候会调用simple_vma_nopage,还是搞不懂

[ 本帖最后由 fly6 于 2009-2-16 15:46 编辑 ]

伪装你 2022-09-30 15:20:05

已经弄懂了

卖梦商人 2022-09-30 15:20:05

原帖由 fly6 于 2009-2-17 13:40 发表
已经弄懂了

贴出来分享一下吧,最近忙没继续研究ldd了

回梦 2022-09-30 15:20:05

原帖由 dreamice 于 2009-2-17 14:27 发表

贴出来分享一下吧,最近忙没继续研究ldd了

我也是。有时晚上回去还翻翻LDD3,温故而之新,呵呵

玩心态 2022-09-30 15:20:05

原帖由 Godbach 于 2009-2-17 15:07 发表

我也是。有时晚上回去还翻翻LDD3,温故而之新,呵呵

我实在是太忙,很久都没有闲下来看看书了

最近可好 2022-09-30 15:20:05

完成了两位的建议

倾城月光淡如水﹏ 2022-09-30 15:20:05

以后不要编辑,就提交到后面的新帖子吧,这样有利于大家分析问题。

简美 2022-09-30 15:20:05

OK

北陌 2022-09-30 15:20:05

多谢加分,哈哈

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文