LDD3的1-3章, 第7章,第10章的学习笔记

Chapter1, Chapter2

(1) 实际上, current 不真正地是一个全局变量, 它产生一个指针指向结构 task_struct

printk(KERN_INFO "The process is \"%s\" (pid %i)\n", current->comm, current->pid);

存于 current->comm 的命令名称是由当前进程执行的程序文件的基本名称( 截短到 15 个字符, 如果需要 ). 

(2)在device driver的makefile中, ifneq ($(KERNELRELEASE),)判断是否在内核根目录下;–C  $(KERNELDIR) 指定了内核源代码的位置,其中保存有内核的顶层 makefile文件;

Chapter3

(1)主设备号和次设备号 

主设备号表示设备对应的驱动程序; 

次设备号由内核使用,用于正确确定设备文件所指的设备。

内核用 dev_t 类型(<linux/types.h>)来保存设备编号,dev_t 是一个 32 位的数,12 位表示主设备

号,20为表示次设备号。在实际使用中,是通过<linux/kdev_t.h>中定义的宏来转换格式,如下: 

 (dev_t)->à主设备号、次设备号   MAJOR(dev_t dev)

  MINOR(dev_t dev)

 主设备号、次设备号->(dev_t)    MKDEV(int major,int minor)

int register_chrdev_region(dev_t first, unsigned int count,char *name);   //指定设备编号 

int alloc_chrdev_region(dev_t *dev, unsigned int firstminor,unsigned int count, char *name);   //动态生成设备编号 

void unregister_chrdev_region(dev_t first, unsigned int count);      //释放设备编号

(2)一些重要的数据结构ile_operations、file 和inode,它们的定义都在<linux/fs.h>。

(3) 字符设备的注册【参考LDD3 上新/老方法】

(4) 设备是不允许移位的, 通过调用 nonseekable_open 通知内核你的设备不支持 llseek

Chapter7

(1) int time_after(unsigned long a, unsigned long b);

(2) wait_event_interruptible_timeout, interrupt的意思是说, 当进入等待后, 我们进程可以被信号打断, return值为-ERESTARTSYS

(3)delay, cpu_relex是占CPU的.sleep和schedure不占CPU去休眠.

(4)定时器的实现(参考7.4)

Chapter10 中断处理

(1)Linux的中断处理程序分为两个部分:上半部(top half)和下半部(bottom half)。

上半部的功能是“登记中断”。当一个中断发生时,就把设备驱动程序中中断例程的下半部挂到该设备的下半部执行队列中去,然后就等待新的中断的到来。这样,上半部执行的速度就会很快,就可以接受所负责设备产生的更多中断。上半部之所以要快,是因为它是完全屏蔽中断的,其它的中断只能等到这个中断处理程序执行完毕以后才能申请,不能得到及时的处理。快速的中断处理程序就可以对设备产生的中断尽可能多地进行服务。

下半部是可中断的,而上半部是不可中断的。上半部只是将下半部放入了它们所负责的设备的中断处理队列中去,然后就什么都不管了。因此,下半部几乎做了中断处理程序所有的工作

由于下半部是可中断的,所以在它运行期间,如果其它的设备产生了中断,这个下半部可以暂时的中断掉,等到那个设备的上半部运行完了,再回头来运行它。

(2)Linux内核定义了两种类型的中断,快速的和慢速的,这两者之间的一个区别是慢速中断自身还可以被中断,而快速中断则不能。

(3)软中断是利用硬件中断的概念,用软件方式进行模拟,实现宏观上的异步执行效果。硬中断是外部设备对CPU的中断,软中断通常是硬中断服务程序对内核的中断,信号则是由内核(或其它进程)对某个进程的中断。

(4) 在/proc文件系统下,又两个文件提供了中断的信息。

从左到右分别是,

irq的序号, 在各自cpu上发生中断的次数,可编程中断控制器,设备名称(request_irq的dev_name字段)

$cat /proc/interrupts 
           CPU0       CPU1       
  0: 2822434225          0    IO-APIC-edge  timer
  1:         12         45    IO-APIC-edge  i8042
  6:          3          0    IO-APIC-edge  floppy
  7:          0          0    IO-APIC-edge  parport0
  8:         13          0    IO-APIC-edge  rtc
  9:          0          0   IO-APIC-level  acpi
 12:        105        431    IO-APIC-edge  i8042
 14:        169  179654525    IO-APIC-edge  ide0
 50:          0          0   IO-APIC-level  uhci_hcd:usb4
 58:          0          0   IO-APIC-level  uhci_hcd:usb5
 74:       6870  651949183         PCI-MSI  ahci
 82:        193          0         PCI-MSI  HDA Intel
 90:         28  675362729         PCI-MSI  eth0
225:          0          0   IO-APIC-level  ehci_hcd:usb1, uhci_hcd:usb2
233:          0          0   IO-APIC-level  uhci_hcd:usb3
NMI:          0          0 
LOC: 2820592939 2820592942 
ERR:          0
MIS:          0

/proc/stat 文件中有一行记录的机器从启动依赖,各个中断序号发生中断的次数。

这一行以intr开头,接下来的第一个数字是总的中断数目,之后就是分别的中断数目,从0开始。

$cat /proc/stat  | grep intr
intr 4329441883 2822466790 57 0 0 4 0 3 0 13 0 0 0 536 0 179654982 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 651956087 0 0 0 0 0 0 0 193 0 0 0 0 0 0 0 675363218 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

(5) 主板上有8条IRQ(IRQ0-7)线连接到8位的ISA扩展槽。还有另外的8条(IRQ8-15)连接到16位的增强型ISA槽。所以,在一台典型的ISA总线的PC机中总共有16条IRQ请求线。其中,IRQ0优先级最高,IRQ7的优先级最低。IRQ8-15的优先级有点特殊,IRQ8-15与IRQ2具有相同的优先等级

(6) 中断共享. 

--SA_SHIRQ 位必须在 flags 参数中指定, 当请求中断时. 

--dev_id 参数必须是独特的. 任何模块地址空间的指针都行, 但是 dev_id 明确地不能设置为 NULL.

内核保持着一个与中断相关联的共享处理者列表, 并且 dev_id 可认为是区别它们的签名

--中断线空闲.

--所有这条线的已经注册的处理者也指定共享这个 IRQ.

无论何时 2 个或多个驱动在共享中断线, 并且硬件中断在这条线上中断处理器, 内核为这个中断调用每个注册的处理者, 传递它的 dev_id 给每个. 因此, 一个共享的处理者必须能够识别它自己的中断并且应当快速退出当它自己的设备没有被中断时. 确认返回 IRQ_NONE 无论何时你的处理者被调用并且发现设备没被中断.

void *dev_id 

用作共享中断线的指针. 它是一个独特的标识, 用在当释放中断线时以及可能还被驱动用来指向它自己的私有数据区(来标识哪个设备在中断). 如果中断没有被共享, dev_id 可以设置为 NULL, 但是使用这个项指向设备结构不管如何是个好主意

一、中断类: 

    1. 中断类型: 在request_irq(irq, handler, flags, devname, dev_id)中使用

    #define SA_SHIRQ            共享中断(旧版本的,2.6.19之前的内核)

    #define IRQF_SHARED         共享中断(新版本的)

    #define SA_INTERRUPT        快速中断(旧版本的)

    #define IRQF_DISABLED       快速中断(新版本的)

    #define IRQF_SAMPLE_RANDOM  表示本中断源可以用作随机数生成器的熵池

 

    2. 中断的触发类型: 在set_irq_type(irq, type)中使用

    #define IRQ_TYPE_NONE           0x00000000     未指明类型

    #define IRQ_TYPE_EDGE_RISING    0x00000001     上升沿触发

    #define IRQ_TYPE_EDGE_FALLING   0x00000002     下降沿触发
    #define IRQ_TYPE_EDGE_BOTH      (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING)
    #define IRQ_TYPE_LEVEL_HIGH     0x00000004     高电平触发

    #define IRQ_TYPE_LEVEL_LOW      0x00000008     低电平触发

    #define IRQ_TYPE_SENSE_MASK     0x0000000f     /* Mask of the above */
    #define IRQ_TYPE_PROBE          0x00000010     /* Probing in progress */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值