随笔分类 -  Linux Driver Development

1
摘要:一、DM6446 GPIO的介绍说到LINUX 驱动移植,没有移植过的朋友,或刚刚进入LINUX领域的朋友,最好去看看《LINUX 设备驱动程序》第三版,有个理论或感性的认识。该版本是基于2.6.10的基础上描述的,经典读物,网上有电子版,但是建议花几十元买本书是值得的。 GPIO是嵌入式系统最简单、最常用的资源了,比如点亮LED,控制蜂鸣器,输出高低电平,检测按键,等等。GPIO分输入和输出,在Montavista linux-2.6.18中,有关GPIO的最底层的寄存器驱动,是在linux-2.6.18_pro500\arch\arm\mach-davinci目录下的gpio.c,这个是寄 阅读全文
posted @ 2011-08-29 08:27 郭—大—侠 阅读(298) 评论(0) 推荐(0)
摘要:在pci驱动是使用pci_present()函数在init函数中,编译过程中报错。其中的源码为:static int __init shao_init(void){ int init_ret; if (!pci_present()){ printk("This kernel version does not support PCI.../n"); return -ENODEV; } if(!pci_register_driver(&shao_driver)){ pci_unregister_driver(&shao_driver); return -ENOD 阅读全文
posted @ 2011-05-11 10:19 郭—大—侠 阅读(438) 评论(0) 推荐(0)
摘要:Linux下的设备驱动程序被组织为一组完成不同任务的函数的集合,通过这些函数使得Windows的设备操作犹如文件一般。在应用程序看来,硬件设备只是一个设备文件,应用程序可以象操作普通文件一样对硬件设备进行操作,如open ()、close ()、read ()、write () 等。Linux主要将设备分为二类:字符设备和块设备。字符设备是指设备发送和接收数据以字符的形式进行;而块设备则以整个数据缓冲区的形式进行。字符设备的驱动相对比较简单。 下面我们来假设一个非常简单的虚拟字符设备:这个设备中只有一个4个字节的全局变量int global_var,而这个设备的名字叫做"gobalv 阅读全文
posted @ 2011-05-11 09:41 郭—大—侠 阅读(598) 评论(0) 推荐(0)
摘要:最近在做驱动的程序,需要开启启动,研究了一下,蛮简单的,找篇好文章,以飨大家。如果服务器重启之后需要手工开启许多服务、工作及以后的维护相对比较繁琐、特地总结了下linux下开机自动启动脚本所涉及的知识和方法、如下:1、相关基础知识点 1)redhat的启动方式和执行次序是: 加载内核 执行init程序 /etc/rc.d/rc.sysinit # 由init执行的第一个脚本 /etc/rc.d/rc $RUNLEVEL # $RUNLEVEL为缺省的运行模式 /etc/rc.d/rc.local #相应级别服务启动之后、在执行该文件(其实也可以把需要执行的命令写到该文件中) /sbi... 阅读全文
posted @ 2010-11-24 11:08 郭—大—侠 阅读(394) 评论(0) 推荐(0)
摘要:摘要:在进行设备驱动程序,内核功能模块等系统级开发时,通常需要在内核和用户程序之间交换信息。Linux提供了多种方法可以用来完成这些任务。本文总结了各种常用的信息交换方法,并用简单的例子演示这些方法各自的特点及用法。其中有大家非常熟悉的方法,也有特殊条件下方可使用的手段。通过对比明确这些方法,可以加深我们对Linux内核的认识,更重要的是,可以让我们更熟练驾御linux内核级的应用开发技术。内核空间(kernel-space) VS 用户空间(user-space)作为一个Linux开发者,首先应该清楚内核空间和用户空间的区别。关于这个话题,已经有很多相关资料,我们在这里简单描述如下:现代的计 阅读全文
posted @ 2010-11-23 19:00 郭—大—侠 阅读(800) 评论(0) 推荐(0)
摘要:发现好文,忍不住分享的冲动。我立即更新了很多很多的东西。========================================================Fedora 12 13 14基础环境配置2010年7月23日 Dawnson 发表评论 阅读评论 25 views这里假设Fedora 12/13/14业已安装完成,并能联入网络,那么接下来的基础办公和编程环境的配置过程可以走下面这个路线:1、配置sudo file;首先,打开终端,获得root环境: su - ,并输入root帐户密码。然后: visudo ,在root ALL=(ALL) ALL这一行下面空白行处按“A”键 阅读全文
posted @ 2010-11-16 12:37 郭—大—侠 阅读(188) 评论(0) 推荐(0)
摘要:进入vi的命令vi filename :打开或新建文件,并将光标置于第一行首vi +n filename :打开文件,并将光标置于第n行首vi + filename :打开文件,并将光标置于最后一行首vi +/pattern filename:打开文件,并将光标置于第一个与pattern匹配的串处vi -r filename :在上次正用vi编辑时发生系统崩溃,恢复filenamevi filename....filename :打开多个文件,依次编辑移动光标类命令h :光标左移一个字符l :光标右移一个字符space:光标右移一个字符Backspace:光标左移一个字符k或Ctrl+p:光标 阅读全文
posted @ 2010-10-22 16:47 郭—大—侠 阅读(157) 评论(0) 推荐(0)
摘要:板卡插入机箱,通过CPU(PCI总线的中央资源)在系统初始化阶段(POST)为各个PCI设备(包括插入的板卡)进行资源分配(IO/MEM/中断),资源分配完毕后,PCI设备的驱动程序进行PCI总线搜索,看是否有符合本驱动的板卡存在(根据PCI Vendor Id和Device Id,以及Revison Id),找到设备后驱动程序则根据板卡的硬件设计情况进行相应的寄存器初始化和中断挂载工作。所以有几点需要注意:因为PCI总线的资源分配是在POST《上电自检(Power On Self Test)》过程中动态分配的,根据系统配置不同,各板卡所获得的IO/MEM/中断资源会不相同,即所谓PnP,即. 阅读全文
posted @ 2010-10-01 14:55 郭—大—侠 阅读(1798) 评论(0) 推荐(0)
摘要://内核模块测试程序#include <linux/config.h>#include <linux/module.h>#include <linux/kernel.h>#include <linux/mm.h>static unsigned long p = 0;static int __init shao_init(void){ //分配共享内存(一个页面) p = __get_free_pages(GFP_KERNEL, 0); SetPageReserved(virt_to_page(p)); printk("<1> 阅读全文
posted @ 2010-08-20 18:18 郭—大—侠 阅读(781) 评论(0) 推荐(0)
摘要:在设备驱动程序中动态开辟内存,不是用malloc,而是kmalloc,或者用get_free_pages直接申请页。释放内存用的是kfree,或free_pages. 对于提供了MMU(存储管理器,辅助操作系统进行内存管理,提供虚实地址转换等硬件支持)的处理器而言,Linux提供了复杂的存储管理系统,使得进程所能访问的内存达到4GB。 进程的4GB内存空间被人为的分为两个部分--用户空间与内核空间。用户空间地址分布从0到3GB(PAGE_OFFSET,在0x86中它等于0xC0000000),3GB到4GB为内核空间。 内核空间中,从3G到vmalloc_start这段地址是物理内存映射... 阅读全文
posted @ 2010-08-20 15:14 郭—大—侠 阅读(607) 评论(0) 推荐(0)
摘要:本章内容分为三节。第一节讲述了 mmap 系统调用的实现,mmap允许直接将设备内存映射到用户进程的地址空间中。然后我们讨论内核 kiobuf 机制,它能提供从内核空间对用户内存的直接访问,kiobuf 系统可用于为某些种类的设备实现"裸(raw)I/O"。最后一节讲述直接内存访问(DMA)I/O操作,它本质上提供了外围设备直接访问系统内存的能力。当然,所有的这些技术都需要先了解 Linux 的内存管理是如何工作的,所以我们从内存子系统来开始本章的讨论。13.1 Linux 的内存管理这一节不是描述操作系统中内存管理的理论,而是关注于该理论在 Linux 实现中的主要特点。 阅读全文
posted @ 2010-08-19 09:24 郭—大—侠 阅读(731) 评论(0) 推荐(0)
摘要:多数的 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 郭—大—侠 阅读(1217) 评论(0) 推荐(0)
摘要:用户空间存取内核空间,具体的实现方法要从两个方面考虑,先是用户进程,需要调用mmap来将自己的一段虚拟空间映射到内核态分配的物理内存;然后内核空间需要重新设置用户进程的这段虚拟内存的页表,使它的物理地址指向对应的物理内存。针对linux内核的几种不同的内存分配方式(kmalloc、vmalloc和ioremap),需要进行不同的处理。关于这个话题,前面已有文章论述了,<<Linxu设备驱动程序>>也专门用一章的内容来讲述,它们所用的方法是完全一样的。这里只是重复说一遍,以温故而知新。一、Linux内存管理概述这里说一下我的理解,主要从数据结构说。1、物理内存都是按顺序分 阅读全文
posted @ 2010-08-18 20:04 郭—大—侠 阅读(264) 评论(0) 推荐(0)
摘要:http://lsec.cc.ac.cn/~tengfei/doc/ldd3/index.html驱动开发的经典大牛书籍,百读不厌呀!! 阅读全文
posted @ 2010-08-18 19:58 郭—大—侠 阅读(226) 评论(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 郭—大—侠 阅读(238) 评论(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 郭—大—侠 阅读(419) 评论(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 郭—大—侠 阅读(257) 评论(0) 推荐(0)
摘要:之所以想写这篇帖子,是有两个方面原因。其一是内核版有一个关于《内核可以从线性 地址直接计算物理地址,用来做什么呢?》的讨论,偶说计算出物理地址可以共享给用户空间读写。dreamice兄说能否说一下详细的应用。其二是alb* 版主提到wheelz曾经写过这样一个例程,拜读了一把,发现在传递物理地址和内存大小上,wheelz的例程还有些不够灵活。alb*版主提到可以通过 文件的方式实现动态的传递。因此,偶也写了这样一个例程,可以动态的将内核空间的物理地址和大小传给用户空间。整个内核模块,在模块插入时建立proc文件,分配内存。卸载模块的时候将用户空间写入的内容打印出来。以下是内核模块的代码和用户空 阅读全文
posted @ 2010-08-18 18:38 郭—大—侠 阅读(383) 评论(0) 推荐(0)
摘要:对于任何编写内核代码的人来说,最吸引他们注意的问题之一就是如何完成调试。由于内核是一个不与某个进程相关的功能集,其代码不能很轻松地放在调试器中执行,而且也不能跟踪。本章介绍你可以用来监视内核代码和跟踪错误的技术。用打印信息调试最一般的调试技术就是监视,就是在应用内部合适的点加上printf调用。当你调试内核代码的时候,你可以用printk完成这个任务。Printk在前些章中,我们简单假设printk工作起来和printf很类似。现在是介绍一下它们之间不同的时候了。其中一个不同点就是,printk允许你根据它们的严重程度,通过附加不同的“记录级”来对消息分类,或赋予消息优先级。你可以用宏来指示记 阅读全文
posted @ 2010-08-18 17:56 郭—大—侠 阅读(647) 评论(0) 推荐(0)
摘要:本系列文章包括两篇,它们文详细地介绍了 Linux 系统下用户空间与内核空间数据交换的九种方式,包括内核启动参数、模块参数与 sysfs、sysctl、系统调用、netlink、procfs、seq_file、debugfs和relayfs,并给出具体的例子帮助读者掌握这些技术的使用。本文是该系列文章的第一篇,它介绍了内核启动参数、模块参数与sysfs、sysctl、系统调用和netlink,并结合给出的例子程序详细地说明了它们如何使用。一、引言一般地,在使用虚拟内存技术的多任务系统上,内核和应用有不同的地址空间,因此,在内核和应用之间以及在应用与应用之间进行数据交换需要专门的机制来实现,众所 阅读全文
posted @ 2010-08-18 16:55 郭—大—侠 阅读(858) 评论(0) 推荐(0)

1