摘要: http://lsec.cc.ac.cn/~tengfei/doc/ldd3/index.html驱动开发的经典大牛书籍,百读不厌呀!! 阅读全文
posted @ 2010-08-18 19:58 郭—大—侠 阅读(204) 评论(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 郭—大—侠 阅读(218) 评论(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 郭—大—侠 阅读(396) 评论(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 郭—大—侠 阅读(358) 评论(0) 推荐(0) 编辑
摘要: 对于任何编写内核代码的人来说,最吸引他们注意的问题之一就是如何完成调试。由于内核是一个不与某个进程相关的功能集,其代码不能很轻松地放在调试器中执行,而且也不能跟踪。本章介绍你可以用来监视内核代码和跟踪错误的技术。用打印信息调试最一般的调试技术就是监视,就是在应用内部合适的点加上printf调用。当你调试内核代码的时候,你可以用printk完成这个任务。Printk在前些章中,我们简单假设printk工作起来和printf很类似。现在是介绍一下它们之间不同的时候了。其中一个不同点就是,printk允许你根据它们的严重程度,通过附加不同的“记录级”来对消息分类,或赋予消息优先级。你可以用宏来指示记 阅读全文
posted @ 2010-08-18 17:56 郭—大—侠 阅读(610) 评论(0) 推荐(0) 编辑
摘要: 本系列文章包括两篇,它们文详细地介绍了 Linux 系统下用户空间与内核空间数据交换的九种方式,包括内核启动参数、模块参数与 sysfs、sysctl、系统调用、netlink、procfs、seq_file、debugfs和relayfs,并给出具体的例子帮助读者掌握这些技术的使用。本文是该系列文章的第一篇,它介绍了内核启动参数、模块参数与sysfs、sysctl、系统调用和netlink,并结合给出的例子程序详细地说明了它们如何使用。一、引言一般地,在使用虚拟内存技术的多任务系统上,内核和应用有不同的地址空间,因此,在内核和应用之间以及在应用与应用之间进行数据交换需要专门的机制来实现,众所 阅读全文
posted @ 2010-08-18 16:55 郭—大—侠 阅读(802) 评论(0) 推荐(0) 编辑
摘要: 共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式。两个不同进程A、B共享内存的意思是,同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。由于多个进程共享同一块内存区域,必然需要某种同步机制,互斥锁和信号量都可以。采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次数据[1]:一次从输入文件到共享内存区,另一次从共享内存区到输出文件。实际上,进程之间在共享内存时,并不总是读写少量数据后就 阅读全文
posted @ 2010-08-17 15:29 郭—大—侠 阅读(1664) 评论(0) 推荐(0) 编辑
摘要: 这次在工作上分别遇到过strcpy、memset、memcpy,也在网络上看到过一些关于三者区别的文章,罗列大概内容如下:strcpy()来自C语言,在C++里得以保留。首先,要指明的是,C++里strcpy()里接受的参数是C-串,并非string,更不可能是其他类型的数据。它表示一个字串的内容拷贝到另一个字串。拷贝会在源字串里第一个'/0'时停止拷贝.strcpy(目标字串,源字串);ex:char*temp1,*temp2="test";strcpy(temp1,temp2);memset()主要用于对一个内存区域初始化。一般用在字符数组上,至少我现在 阅读全文
posted @ 2010-08-13 16:20 郭—大—侠 阅读(367) 评论(0) 推荐(0) 编辑
摘要: 9.4.使用 I/O 内存尽管 I/O 端口在 x86 世界中流行, 用来和设备通讯的主要机制是通过内存映射的寄存器和设备内存. 2 者都称为 I/O 内存, 因为寄存器和内存之间的区别对软件是透明的.I/O 内存是简单的一个象 RAM 的区域, 它被处理器用来跨过总线存取设备. 这个内存可用作几个目的, 例如持有视频数据或者以太网报文, 同时实现设备寄存器就象 I/O 端口一样的行为(即, 它们有读和写它们相关联的边际效果).存取 I/O 内存的方式依赖计算机体系, 总线, 和使用的设备, 尽管外设到处都一样. 本章的讨论主要触及 ISA 和 PCI 内存, 而也试图传递通用的信息. 尽管存 阅读全文
posted @ 2010-08-13 15:24 郭—大—侠 阅读(302) 评论(0) 推荐(0) 编辑