摘要: 多数的 Linux内核态程序都需要和用户空间的进程交换数据,但 Linux 内核态无法对传统的 Linux 进程间同步和通信的方法提供足够的支持!本文就总结下常见的ipc,getsockopt/setsockopt mmap netlink/socket proc/seq copy_from_user/copy_to_user文件。采用先讲解后测试代码的方式,netlink和proc由于江哥和段兄都写的比较好了我就贴了链接...好了不废话了开始 一.getsockopt/setsockopt 最近看ebtables源码,发现与内核的ipc是采用的getsockopt,具体实现是在内核中用... 阅读全文
posted @ 2010-08-18 20:15 郭—大—侠 阅读(1180) 评论(0) 推荐(0) 编辑
摘要: 用户空间存取内核空间,具体的实现方法要从两个方面考虑,先是用户进程,需要调用mmap来将自己的一段虚拟空间映射到内核态分配的物理内存;然后内核空间需要重新设置用户进程的这段虚拟内存的页表,使它的物理地址指向对应的物理内存。针对linux内核的几种不同的内存分配方式(kmalloc、vmalloc和ioremap),需要进行不同的处理。关于这个话题,前面已有文章论述了,<<Linxu设备驱动程序>>也专门用一章的内容来讲述,它们所用的方法是完全一样的。这里只是重复说一遍,以温故而知新。一、Linux内存管理概述这里说一下我的理解,主要从数据结构说。1、物理内存都是按顺序分 阅读全文
posted @ 2010-08-18 20:04 郭—大—侠 阅读(244) 评论(0) 推荐(0) 编辑
摘要: http://lsec.cc.ac.cn/~tengfei/doc/ldd3/index.html驱动开发的经典大牛书籍,百读不厌呀!! 阅读全文
posted @ 2010-08-18 19:58 郭—大—侠 阅读(212) 评论(0) 推荐(0) 编辑
摘要: 如果一个模块需要分配大块的内存, 它常常最好是使用一个面向页的技术. 请求整个页也有其他的优点, 这个在 15 章介绍.为分配页, 下列函数可用:get_zeroed_page(unsigned int flags);返回一个指向新页的指针并且用零填充了该页.__get_free_page(unsigned int flags);类似于 get_zeroed_page, 但是没有清零该页.__get_free_pages(unsigned int flags, unsigned int order);分配并返回一个指向一个内存区第一个字节的指针, 内存区可能是几个(物理上连续)页长但是没有清零 阅读全文
posted @ 2010-08-18 19:56 郭—大—侠 阅读(222) 评论(0) 推荐(0) 编辑
摘要: 内存映射是现代 Unix 系统最有趣的特性之一. 至于驱动, 内存映射可被实现来提供用户程序对设备内存的直接存取.一个 mmap 用法的明确的例子可由查看给 X Windows 系统服务器的虚拟内存区的一个子集来见到:cat /proc/731/maps 000a0000-000c0000 rwxs 000a0000 03:01 282652 /dev/mem000f0000-00100000 r-xs 000f0000 03:01 282652 /dev/mem00400000-005c0000 r-xp 00000000 03:01 1366927 /usr/X11R6/bin/Xorg0 阅读全文
posted @ 2010-08-18 19:55 郭—大—侠 阅读(405) 评论(0) 推荐(0) 编辑
摘要: Explaining what is zero-copy functionality for Linux, why it's useful and where it needs work.By now almost everyone has heard of so-called zero-copy functionality under Linux, but I often run into people who don't have a full understanding of the subject. Because of this, I decided to write 阅读全文
posted @ 2010-08-18 19:48 郭—大—侠 阅读(245) 评论(0) 推荐(0) 编辑
摘要: 之所以想写这篇帖子,是有两个方面原因。其一是内核版有一个关于《内核可以从线性 地址直接计算物理地址,用来做什么呢?》的讨论,偶说计算出物理地址可以共享给用户空间读写。dreamice兄说能否说一下详细的应用。其二是alb* 版主提到wheelz曾经写过这样一个例程,拜读了一把,发现在传递物理地址和内存大小上,wheelz的例程还有些不够灵活。alb*版主提到可以通过 文件的方式实现动态的传递。因此,偶也写了这样一个例程,可以动态的将内核空间的物理地址和大小传给用户空间。整个内核模块,在模块插入时建立proc文件,分配内存。卸载模块的时候将用户空间写入的内容打印出来。以下是内核模块的代码和用户空 阅读全文
posted @ 2010-08-18 18:38 郭—大—侠 阅读(362) 评论(0) 推荐(0) 编辑
摘要: 对于任何编写内核代码的人来说,最吸引他们注意的问题之一就是如何完成调试。由于内核是一个不与某个进程相关的功能集,其代码不能很轻松地放在调试器中执行,而且也不能跟踪。本章介绍你可以用来监视内核代码和跟踪错误的技术。用打印信息调试最一般的调试技术就是监视,就是在应用内部合适的点加上printf调用。当你调试内核代码的时候,你可以用printk完成这个任务。Printk在前些章中,我们简单假设printk工作起来和printf很类似。现在是介绍一下它们之间不同的时候了。其中一个不同点就是,printk允许你根据它们的严重程度,通过附加不同的“记录级”来对消息分类,或赋予消息优先级。你可以用宏来指示记 阅读全文
posted @ 2010-08-18 17:56 郭—大—侠 阅读(617) 评论(0) 推荐(0) 编辑
摘要: 本系列文章包括两篇,它们文详细地介绍了 Linux 系统下用户空间与内核空间数据交换的九种方式,包括内核启动参数、模块参数与 sysfs、sysctl、系统调用、netlink、procfs、seq_file、debugfs和relayfs,并给出具体的例子帮助读者掌握这些技术的使用。本文是该系列文章的第一篇,它介绍了内核启动参数、模块参数与sysfs、sysctl、系统调用和netlink,并结合给出的例子程序详细地说明了它们如何使用。一、引言一般地,在使用虚拟内存技术的多任务系统上,内核和应用有不同的地址空间,因此,在内核和应用之间以及在应用与应用之间进行数据交换需要专门的机制来实现,众所 阅读全文
posted @ 2010-08-18 16:55 郭—大—侠 阅读(825) 评论(0) 推荐(0) 编辑