Linux
sunr_
这个作者很懒,什么都没留下…
展开
-
《Linux Device Driver》——Linux设备模型
Linux设备模型的目的是:为内核建立起一个统一的设备模型,从而有一个对系统结构的一般性抽象描述。现在内核使用设备模型支持多种不同的任务:设备模型描述电源管理和系统关机这些需要对系统结构的理解,设备模型使OS能以正确顺序遍历系统硬件。与用户空间的通讯sysfs 虚拟文件系统的实现与设备模型的紧密相关, 并向外界展示它所表述的结构。向用户空间提供系统信息、改变操作参数的接口正越来越多地通过 sysfs , 也就是设备模型来完成。热插拔设备外围设备可根据用户的需要安装与原创 2020-09-15 13:21:18 · 702 阅读 · 0 评论 -
《Linux Device Driver》——中断处理
尽管有些设备仅仅通过控制其寄存器就可以得到控制,但现实中的大部分设备却要比这复杂一些。因为大部分设备的处理时间与处理器不在同一个周期,且一定会比处理器慢的多,这就造成了一种让处理器等待设备的现象,显然这是不行的,而有一种解决方法就是中断操作。中断仅仅就是一个信号,当硬件需要获得处理器对它的关注时,就可以发送这个信号。 Linux 处理中断的方式非常类似在用户空间处理信号的方式。大多数情况下,一个驱动只需要为它的设备的中断注册一个处理例程,并当中断到来时进行正确的处理。本质上来讲,中断处理例程和其他的代码并原创 2020-09-14 22:35:03 · 323 阅读 · 0 评论 -
《Linux Device Driver》——与硬件通信
设备驱动程序是软件概念和硬件概念电路之间的一个抽象层。I/O端口和I/O内存每一种外设都是通过读写寄存器进行控制。在硬件层,内存区域和I/O区域没有概念上的区别:它们都通过地址总线和控制总发送电平信号(比如读信号和写信号),再通过数据总线读写数据。I/O寄存器和常规内存1.I/O寄存器与RAM的最主要区别就是I/O操作具有边际效应(个人理解就是副作用):读取某个地址时可能导致这个地址的内容发生变化,比如很多中断寄存器的值一经读取,便自动清零。内存操作就不存在:内存写操作的唯一结果就是在指定位原创 2020-09-14 20:14:54 · 333 阅读 · 0 评论 -
《Linux Device Driver》——分配内存
kmalloc函数kmalloc不对所获得的内存空间清零,分配给它的区域保持原有的数据,所分配的区域在物理内存中也是连续的。flags参数#include<linux/slab.h>void *kmalloc(size_t size,int flags);kmalloc的第一个参数是要分配的块的大小,第二个参数是分配的标志(flags),它能以多种方式控制kmalloc的行为。最常用的标志是GFP_KERNEL,表示内存分配(最终总是调用get_free_pages来实现实际的分原创 2020-09-11 10:42:15 · 253 阅读 · 0 评论 -
《Linux Device Driver》——时间、延迟及延缓操作
任务:度量时间差,如何比较时间获得当前时间将操作延迟指定一段时间调度异步函数到指定时间之后执行度量时间差内核通过定时器中断来跟踪时间流。时间中断由系统定时硬件以周期性的间隔产生,这个间隔由内核根据HZ的值设定,HZ是一个与体系结构有关的常数,定义在<linux/param.h>或者该文件下。hz:上述间隔由hz的值设定,hz是一个与体系结构相关的常数计数器:发生中断一次,计数器加一,这个计数器的值(只有)在系统引导时被初始化为0jiffies变量:unsigned long原创 2020-09-10 23:58:12 · 409 阅读 · 0 评论 -
《Linux Device Driver》——高级字符驱动程序操作
首先实现ioctl系统调用,它是用来设备控制的公共接口。然后,内核态与用户态保持同步。掌握进程休眠和唤醒、实现阻塞I/O,以及在设备可读取或写入时通知用户空间。最后,在驱动程序中实现设备访问策略。ioctl驱动程序通过ioctl执行各种类型的硬件控制。1.在用户空间,ioctl系统调用具有如下原型:int ioctl(int fd,unsigned long cmd,...);参数描述fd文件描述符cmd控制命令…表示可变数目的参数表,在实际使用中是原创 2020-09-10 21:04:55 · 325 阅读 · 0 评论 -
《Linux Device Driver》——并发和竞态
scull的缺陷 if (!dptr->data[s_pos]) { dptr->data[s_pos] = kmalloc(quantum, GFP_KERNEL); if (!dptr->data[s_pos]) goto out; }sucll代码中当有两个进程A、B正在独立尝试向同一个scull设备的相同偏移量写入数据,两个进程在同一时刻到达上述代原创 2020-09-08 00:37:58 · 132 阅读 · 0 评论 -
《Linux Device Driver》——调试技术
内核中的调试支持编译内核 1.获取内核源码,解压至/usr/src # tar xf linux-3.13.5.tar.xz -C /usr/src # ln -sv /usr/src/linux-3.13.5 /usr/src/linux 2.配置内核特性(选择一种方法就可以了) make config:遍历选择所要编译的内核特性 make allyesconfig:配置所有可编译的内核特性 make allnoconf原创 2020-09-07 20:21:21 · 528 阅读 · 0 评论 -
《Linux Device Driver》——字符设备驱动程序
目标是编写一个完整的字符设备驱动程序——scull。即“simply character unility for loading localites,区域装载的简单字符设备”。scull是一个操作内存区域的字符设备驱动程序,这片内存就相当于一个设备。scull的优点在于不和硬件相关,而只是操作从内核中分配的一些内存。scull的设计主设备号和次设备号对字符设备的访问通过文件系统内的设备名称进行。位于/dev下ls -al字符设备用“c“标识块设备用”b“标识...原创 2020-09-05 22:52:35 · 933 阅读 · 0 评论