Linux驱动
Vinx911
这个作者很懒,什么都没留下…
展开
-
Linux驱动开发杂记(0x06) - 内核中的内存分配
一般我们会用到 kmalloc()、kzalloc()、vmalloc() 等,下面我们介绍一下这些函数的使用以及它们之间的区别。kmalloc()函数原型:void *kmalloc(size_t size, gfp_t flags);kmalloc() 申请的内存位于物理内存映射区域,而且在物理上也是连续的,它们与真实的物理地址只有一个固定的偏移,因为存在较简单的转换关系,所以对申请...转载 2018-11-09 16:59:27 · 275 阅读 · 0 评论 -
Linux驱动开发杂记(0x0E) - vm_area_struct结构体
内存映射信息放在vma参数中,注意,这里的vma的数据类型是struct vm_area_struct,它表示的是一块连续的虚拟地址空间区域,在函数变量声明的地方,我们还看到有一个类似的结构体struct vm_struct,这个数据结构也是表示一块连续的虚拟地址空间区域。那么,这两者的区别是什么呢?在Linux中,struct vm_area_struct表示的虚拟地址是给进程使用的,而str...转载 2018-11-16 08:52:35 · 1029 阅读 · 0 评论 -
Linux驱动开发杂记(0x0F) - Cannot access memory at address
按照教程Linux内核调试环境搭建(基于ubuntu12.04) 配置kgdb双机调试时,出现一下错误:(gdb) set serial baud 115200(gdb) target remote /dev/ttyS0Remote debugging using /dev/ttyS00xffffffffb753b940 in ?? ()(gdb) b start_kernelBrea...原创 2018-11-17 00:54:15 · 3890 阅读 · 0 评论 -
Linux驱动开发杂记(0x10) - uart_driver结构体
struct uart_driver { struct module *owner; /* 拥有该uart_driver的模块,一般为THIS_MODULE */ const char *driver_name; /* 串口驱动名,串口设备文件名以驱动名为基础 */ const char *dev_name; ...原创 2018-11-22 15:06:46 · 472 阅读 · 0 评论 -
Linux驱动开发杂记(0x11) - uart_port结构体
struct uart_port { spinlock_t lock; /* 串口端口锁 */ unsigned int iobase; /* IO端口基地址 */ unsigned char __iomem *membase; /* IO内存基地址,经映射(如ioremap)后的...原创 2018-11-22 15:07:57 · 3319 阅读 · 0 评论 -
Linux驱动开发杂记(0x12) - uart_ops结构体
/* * This structure describes all the operations that can be * done on the physical hardware. */struct uart_ops { unsigned int (*tx_empty)(struct uart_port *); /* 串口的Tx FIFO缓存是否为空 */ void ...原创 2018-11-22 15:09:30 · 3011 阅读 · 0 评论 -
Linux驱动开发杂记(0x13) - 串口UART驱动API
串口驱动API1、uart_register_driver/* 功能: uart_register_driver用于将串口驱动uart_driver注册到内核(串口核心层)中,通常在模块初始化函数调用该函数。 * 参数 drv:要注册的uart_driver * 返回值: 成功,返回0;否则返回错误码 */int uart_register_driver(struct uar...转载 2018-11-22 15:13:17 · 2230 阅读 · 0 评论 -
Linux驱动开发杂记(0x14) - 环形缓冲区circ_buf
/* * 在内核<linux/circ_buf.h>中定义了关于环形缓冲区的相关变量。 * 其中缓冲区的大小size必须定义成2的n次方,这样可以将取余运算转换成位与运算, * 提高计算机的处理速度。例如:x % size = x & (size - 1)。实际可用的空间为size-1, * 这样可以避免缓冲区为满时和为空时都满足head = tail。*/stru...原创 2018-12-07 09:37:30 · 2228 阅读 · 0 评论 -
Linux驱动开发杂记(0x15) - tasklet
为了提高系统的响应能力和并发能力,Linux将中断处理分了上半部和下半部。当一个中断产生,调用该中断对应的处理程序(上半部),然后告诉系统,对应的后半部可以执行了,中断处理程序立即返回,下半部会在合适的时机由操作系统调用。这样一来就大大的减少了中断处理所需要的时间。tasklet是中断处理下半部分最常用的一种方法,驱动程序一般先申请中断,在中断处理函数内完成中断上半部分的工作后调用tasklet...原创 2019-01-04 11:46:11 · 433 阅读 · 0 评论 -
Linux驱动开发杂记(0x16) - 内核定时器接口各版本的变化
2.6.13 - 2.6.14添加#define DEFINE_TIMER(_name, _function, _expires, _data)2.6.14 - 2.6.15static inline void setup_timer(struct timer_list * timer, void (*function)(uns...原创 2019-02-18 15:39:03 · 493 阅读 · 0 评论 -
Linux驱动开发杂记(0x17) - 内核tty接口各版本的变化(一)之tty_flip.h
2.6.15 - 2.6.16添加extern int tty_buffer_request_room(struct tty_struct *tty, size_t size);extern int tty_insert_flip_string(struct tty_struct *tty, unsigned char *chars, size_t size);extern int tty...原创 2019-02-19 09:10:41 · 699 阅读 · 0 评论 -
Linux驱动开发杂记(0x0B) - 内核计数
Linux内核和驱动开发时,由于各种结构体变量见相互引用,因此,当回收内存时,由于引用没有清理,很容易发生内存指向错误。因此,Linux使用引用计数方式来代替简单的malloc,free。不过由于Linux的内核是以C为开发语言,不是C++,无法使用继承和派生,因此只能使用结构体互相包含和containerof方式来使用引用计数框架,读起来还是比较晦涩的。\linux-2.6.11\includ...转载 2018-11-12 15:09:57 · 237 阅读 · 0 评论 -
Linux驱动开发杂记(0x0A) - errno含义
#define EPERM 1 /* Operation not permitted */ 操作不允许#define ENOENT 2 /* No such file or directory */ 文件或路径不存在#define ESRCH 3 /* No such process */ 进程不存在#def...转载 2018-11-12 14:38:20 · 469 阅读 · 0 评论 -
Linux驱动开发杂记(0x01) - 内核中的一些标记宏__init等
以下内容摘自内核初始化优化宏 ,初始化顺序, __init,__devexit等, 本文仅作为笔记保存。内核使用了大量不同的宏来标记具有不同作用的函数和数据结构。如宏__init 、__devinit 等。这些宏在include/linux/init.h 头文件中定义。编译器通过这些宏可以把代码优化放到合适的内存位置,以减少内存占用和提高内核效率。下面是一些常用的宏:__init标记内...原创 2018-11-08 14:59:12 · 215 阅读 · 0 评论 -
Linux驱动开发杂记(0x02) - pci_dev结构体
每种类的PCI设备都可以用结构类型pci_dev来描述。更为准确地说,应该是每一个PCI功能,即PCI逻辑设备都唯一地对应有一个pci_dev设备描述符。该数据结构的部分定义如下(include/linux/pci.h):struct pci_dev {/* 总线设备链表元素bus_list:每一个pci_dev结构除了链接到全局设备链表中外,还会通过这个成员连接到其所属PCI总线的设备链表中...原创 2018-11-08 16:32:43 · 4878 阅读 · 0 评论 -
Linux驱动开发杂记(0x03) - pci_bus结构体
struct pci_bus { /* 链表元素node:对于PCI根总线而言,其pci_bus结构通过node成员链接到本节一开始所述的根总线链表中,根总线链表 的表头由一个list_head类型的全局变量pci_root_buses所描述。而对于非根pci总线,其pci_bus结构通过node成员链接 到其父总线的子总线链表children中*/ struct list_head no...原创 2018-11-08 16:56:20 · 1289 阅读 · 0 评论 -
Linux驱动开发杂记(0x04) - pci_device_id结构体
struct pci_device_id { __u32 vendor, device; /* 厂商和设备ID,Vendor and device ID or PCI_ANY_ID*/ __u32 subvendor, subdevice; /* 子系统和设备ID,Subsystem ID's or PCI_ANY_ID */ __u32 class, class_mask; /* 类、子...原创 2018-11-08 17:05:18 · 1643 阅读 · 0 评论 -
Linux驱动开发杂记(0x05) - 从pci_dev中获取总线、插槽、功能号
/* * The PCI interface treats multi-function devices as independent * devices. The slot/function address of each device is encoded * in a single byte as follows: * * 7:3 = slot * 2:0 = function...原创 2018-11-08 17:10:12 · 1729 阅读 · 0 评论 -
Linux驱动开发杂记(0x0C) - SetPageReserved()
SetPageReserved() 随着linux的长时间运行,空闲页面会越来越少,为了防止linux内核进入请求页面的僵局中,Linux内核采用页面回收算法(PFRA)从用户进程和内核高速缓存中回收内存页框,并根据需要把要回收页框的内容交换到磁盘上的交换区。调用该函数可以使页面不被交换。#define SetPageReserved(page) set_bit(PG_reserved,&a...原创 2018-11-15 15:31:01 · 3925 阅读 · 0 评论 -
Linux驱动开发杂记(0x0D) - remap_pfn_range()
驱动实现mmap主要是调用:int remap_pfn_range(struct vm_area_struct *, unsigned long addr, unsigned long pfn, unsigned long size, pgprot_t);函数来映射,声明在include/linux/mm.h。第一个参数:虚拟地址描述结构体(声明在include/l...转载 2018-11-15 16:23:43 · 330 阅读 · 0 评论 -
Linux驱动开发杂记(0x07) - I/O端口
1 申请I/O 端⼝:在驱动还没独占设备之前,不应对端⼝进⾏操作。内核提供了⼀个注册接⼝,以允许驱动声明其需要的端⼝:/* request_region告诉内核:要使⽤first开始的n个端⼝。参数name为设备名。如果分配成功返回值是⾮NULL;否则⽆法使⽤需要的端⼝(/proc/ioports包含了系统当前struct resource *request_region(unsigned ...原创 2018-11-12 10:06:31 · 432 阅读 · 0 评论 -
Linux驱动开发杂记(0x08) - I/O内存
尽管 I/O 端口在x86世界中非常流行,但是用来和设备通讯的主要机制是通过内存映射的寄存器和设备内存,两者都称为I/O 内存,因为寄存器和内存之间的区别对软件是透明的。 I/O 内存仅仅是一个类似于RAM 的区域,处理器通过总线访问该区域,以实现对设备的访问。同样,读写这个区域是有边际效应。 根据计算机体系和总线不同,I/O 内存可分为可以或者不可以通过页表来存取。若通过页表存取,内核必...转载 2018-11-12 10:12:12 · 292 阅读 · 0 评论 -
Linux驱动开发杂记(0x09) - likely()与unlikely()
ikely()与unlikely()在2.6内核中,随处可见,那为什么要用它们?它们之间有什么区别呢?首先明确:if (likely(value))等价于if (value)if (unlikely(value))等价于if (value)也就是说likely()和unlikely()从阅读和理解的角度是一样的。这两个宏在内核中定义如下:#define likely(x) __buil...转载 2018-11-12 13:35:12 · 263 阅读 · 0 评论 -
Linux驱动开发杂记(0x18) - 内核tty接口各版本的变化(二)之tty_driver.h
2.6.17 - 2.6.18删除struct tty_driver { const char *devfs_name;}2.6.19 - 2.6.20修改struct tty_operations { void (*set_termios)(struct tty_struct *tty, struct termios * old);//改为 void (*set...原创 2019-02-19 09:59:02 · 280 阅读 · 0 评论