随笔分类 -  ldd3

摘要:本章内容分为三个部分: 第一部分讲述了mmap系统调用的实现过程。将设备内存直接映射到用户进程的地址空间,尽管不是所有设备都需要,但是能显著的提高设备性能。 如何跨越边界直接访问用户空间的内存页,一些相关的驱动程序需要这种能力。在很多情况下,内核执行了该种映射,而无需驱动程序的参与。 直接内存访问( 阅读全文
posted @ 2018-10-19 14:01 习惯就好233 阅读(1161) 评论(0) 推荐(0)
摘要:通用串行总线(USB)是主机和外围设备之间的一种连接。最新USB规范修订增加了理论上高达480Mbps的高速连接。 从拓扑上看,USB子系统并不是以总线的方式来布置的,它是一颗由几个点对点的连接构建而成的树。 USB是四线缆:地线、电源线、两根信号线 USB主控制器负责询问每一个USB设备是否有数据 阅读全文
posted @ 2018-09-24 16:25 习惯就好233 阅读(252) 评论(0) 推荐(0)
摘要:PCI接口 PCI寻址 引导阶段 配置寄存器和初始化 MODULE_DEVICE_TABLE 注册PCI驱动程序 佬式PCI探测 激活PCI设备 访问配置空间 访问I/O和内存空间 PCI中断 硬件抽象 ISA回顾 硬件资源 ISA编程 即插即用规范 PC/104和PC/104++ 其他的PC总线 阅读全文
posted @ 2018-09-24 16:02 习惯就好233 阅读(138) 评论(0) 推荐(0)
摘要:考虑到可移植性的问题,现代版本的Linux内核的可移植性是非常好的。 在把x86上的代码移植到新的体系架构上时,内核开发人员遇到的若干问题都和不正确的数据类型有关。坚持使用严格的数据类型,并且使用-Wall -Wstrict -prototypes选项编译可以防止大多数的代码缺陷。 内核使用的数据类 阅读全文
posted @ 2018-09-20 13:59 习惯就好233 阅读(334) 评论(0) 推荐(0)
摘要:各种硬件和处理器打交道的周期不同,并且总是比处理器慢。必须有一种可以让设备在产生某个事件时通知处理器 中断。 中断仅仅是一个信号,如果硬件需要,就可以发送这个信号。Linux处理中断方式和用户空间的信号是一样的。 注册一个中断,需要处理时,调用函数处理。 中断处理例程和其他代码并发运行,这样处理例程 阅读全文
posted @ 2018-09-17 14:26 习惯就好233 阅读(377) 评论(0) 推荐(0)
摘要:一、I/O端口和I/O内存 每种外设都通过读写寄存器进行控制。大部分外设都有几个寄存器,不管是在内村地址空间还是在I/O地址空间,这些寄存器的访问地址都是连续的。 在硬件层,内存区域和I/O区域没有区别:都是地址总线和控制总线发送电平信号进行访问,再通过数据总线读写数据 I/O寄存器和常规内存 I/ 阅读全文
posted @ 2018-09-15 15:55 习惯就好233 阅读(225) 评论(0) 推荐(0)
摘要:一、Kmalloc函数的内幕 kamlloc原型: 常用的标志是GFP_KERNEL,表示内存分配是代表运行在内核空间的进程执行的。 GFP_ATOMIC:用于在中断处理例程或其他运行于进程上下文之外的代码中分配内存,不会休眠 GFP_KERNEL:内核内存的通常分配方法, 可能引起休眠 GFP_U 阅读全文
posted @ 2018-09-13 22:55 习惯就好233 阅读(337) 评论(0) 推荐(0)
摘要:处理时间委托包括如下任务,按复杂度依次上升: 测量时间流失和比较时间 知道当前时间 指定时间量的延时操作 调度异步函数在之后的时间发生 一、测量时间流失 系统定时硬件规律的产生定时器中断,在内核启动阶段,根据Hz的值,设置这个间隔时间。 HZ的值各不相同,不同平台硬件的参数也不一样,即便你知道HZ的 阅读全文
posted @ 2018-09-12 16:50 习惯就好233 阅读(260) 评论(0) 推荐(0)
摘要:第二章 快速参考 本节中出现的条目会以它们在文中出现的顺序列出: insmod modprobe rmmod 用来装载模块到正运行的内核和移除模块的用户空间工具: #include <linux/init.h> module_init(init_function); module_exit(clea 阅读全文
posted @ 2018-09-09 17:50 习惯就好233 阅读(200) 评论(0) 推荐(0)
摘要:一、ioctl接口 函数原型: ioctl驱动方法有和用户空间版本不同的原型: 为帮助程序员创建唯一的ioctl命令代码,这些编码已被划分为几个段位,Linux的第一个版本使用16-位数: 高8位是关联这个设备的“魔”数,低8位是一个顺序号,在设备内唯一。 根据Linux内核管理来选择驱动ioctl 阅读全文
posted @ 2018-06-22 10:15 习惯就好233 阅读(315) 评论(0) 推荐(0)
摘要:并发问题,并发相关的错误是一些最易出现又最难发现的问题。 设备启动程序员现在必须从一开始就将并发作为他们设计的要素。 一、scull中的缺陷 假设有2个进程("A"和“B”)独立试图写入同一个schll设备的相同便宜,每个进程同时到达上面片段的第一行的if测试。 因为两个进程都在赋值给同一个位置,显 阅读全文
posted @ 2018-06-20 17:22 习惯就好233 阅读(277) 评论(0) 推荐(0)
摘要:一、内核调试支持 我们列出用来开发的内核应当激活的配置选项。 CONFIG_DEBUG_KERNEL 这个选项只是使其他调试选项可用; 它应当打开, 但是它自己不激活任何的特性. CONFIG_DEBUG_SLAB CONFIG_DEBUG_PAGEALLOC 满的页在释放时被从内核地址空间去除. 阅读全文
posted @ 2018-06-14 16:20 习惯就好233 阅读(470) 评论(0) 推荐(0)
摘要:快速参考: 第一节的测试: #include <linux/module.h> #include <linux/init.h> #include <linux/types.h> /* dev_t */ #include <linux/kdev_t.h> /* MAJOR(dev_t dev); MI 阅读全文
posted @ 2018-06-09 16:31 习惯就好233 阅读(220) 评论(0) 推荐(0)
摘要:本章目的编写一个完整的字符设备驱动 一、主次编号 字符设备有主设备号和此设备号,主编号标识设备相连的驱动. 次编号被内核用来决定引用哪个设备。设备编号内部表示:dev_t 在<linux/types.h>中定义,2.6.0内核dev_t是32位的量,12位做朱编号,20位用作次编号。应当利用在<li 阅读全文
posted @ 2018-06-07 17:33 习惯就好233 阅读(256) 评论(0) 推荐(0)
摘要:一、Hello World模块 hello.c #include <linux/init.h> #include <linux/module.h> MODULE_LICENSE("Dual BSD/GPL"); static int hello_init(void) { printk(KERN_AL 阅读全文
posted @ 2018-06-06 23:35 习惯就好233 阅读(314) 评论(0) 推荐(0)
摘要:ldd3(《linux设备驱动程序》)里面使用的正是Linux2.6.10内核,如果内核不同,使用课本里的代码会出现各种问题,所以搭建与课本一样内核版本的环境,用来学习。 尝试过使用ubuntu14.04、fedora21直接编译2.6.10内核,结果都是gcc版本太高,尝试过给gcc降级,各种失败 阅读全文
posted @ 2018-06-06 17:13 习惯就好233 阅读(499) 评论(0) 推荐(0)
摘要:一、简介 在编写驱动时, 基础的概念: 编写内核代码来存取硬件, 但是不能强加特别的策略给用户, 因为不同的用户有不同的需求. 驱动应当做到使硬件可用, 将所有关于如何使用硬件的事情留给应用程序.一个驱动, 这样, 就是灵活的, 如果它提供了对硬件能力的存取, 没有增加约束. 然而, 有时必须作出一 阅读全文
posted @ 2018-06-06 09:08 习惯就好233 阅读(327) 评论(0) 推荐(0)