注册完设备和驱动之后,就需要注册设备节点 Linux杂项设备出现的意义在于:有很多简单的外围字符设备,它们功能相对简单,一个设备占用一个主设备号对于内核资源来说太浪费.所以对于这些简单的字符设备它们共用一个主设备号,不同的设备使用不同的次设备号. MISC_DYNAMIC_MINOR 表示由系统分配子设备号 生成helloword.ko文件后,执行 insmod helloworld,就可以在 dev/ 文件夹下看到 hello_device_node 文件,表明成功生成设备节点,执行 rmmo…
因为CPU只有一个,同一时刻要么是客户进程在运行,要么是操作系统在运行,如果实现进程,需要一种控制权转换机制,这种机制便是中断. 要做的工作有两项:设置8259A和建立IDT. /*======================================================================* init_8259A *======================================================================*/ PU…
8259A虽然已经设置完成,但是我们还没有真正开始使用它呢. 所有的中断都会触发一个函数spurious_irq(),这个函数的定义如下: PUBLIC void spurious_irq(int irq) { disp_str("spurious_irq: "); disp_int(irq); disp_str("\n"); } spurious_irq()其实什么也不做,仅仅是把IRQ号打印出来而已. 其实现在已经可以make并运行了,但是不会有什么效果,因为我…
原文网址:http://blog.chinaunix.net/uid-29287950-id-4573481.html BQ27501驱动编译进内核 一.       驱动程序编译进内核的步骤 在 linux 内核中增加程序需要完成以下三项工作: 1. 将编写的源代码复制到 Linux 内核源代码的相应目录: 2. 在目录的 Kconfig 文件中增加新源代码对应项目的编译配置选项: 3. 在目录的 Makefile 文件中增加对新源代码的编译条目. bq27501驱动编译到内核中具体步骤如下:…
I/O体系结构 总线系统 PCI(Peripheral Component Interconnect) ISA(Industrial Standard Architecture) SBus IEEE1394 USB(Universal Serial Bus) SCSI(Small computer System Interface) 并口与串口(Parallel and Serial Interface) 与外设的交互 I/O端口:处理器管理了一个独立的虚拟地址空间,可用于管理所有I/O地址.…
设备驱动 设备栈:从上层到下层的顺序依次是:过滤设备.类设备.过滤设备.小端口设备[过.类.过滤.小端口] 驱动栈:因设备堆栈原因而建立起来的一种堆栈 老式驱动:指不提供AddDevice的驱动,又叫NT式驱动 Wdm驱动:指提供了AddDevice的驱动 驱动初始化:指IO管理器加载驱动后,调用驱动的DriverEntry.AddDevice函数 设备栈中上层设备与下层设备的绑定关系不是一对一,而是一对多.一个设备可以同时绑定到N个下层设备上去,而一个下层设备,也可以同时被N个上层设备绑定,但…
RT-Thread系统的IO设备管理模块为上层应用提供了一个对设备进行访问的通用抽象接口,而对于下层设备来说则提供了底层设备驱动框架,并通过定义的数据结构对设备信息和底层设备驱动进行管理.从系统整体位置来说I/O设备管理模块相当于底层设备驱动和上层应用之间的一个中间层. I/O管理模块实现了对设备驱动程序的封装:设备驱动程序的实现与I/O管理模块独立,提高了模块的可移植性.应用程序通过I/O管理模块提供的标准接口访问底层设备,设备驱动程序的升级不会对上层应用产生影响.这种方式使得与设备的硬件操作…
摘要 用BIOS方式启动计算机后,BIOS先读取引导扇区,引导扇区再从外部存储设备中读取加载器,加载器读取内核.进入内核后,把加载器中建立的GDT复制到内核中. 这篇文章的最大价值也许在末尾,对C语言指针的新理解. 是什么 在BOOT(引导扇区)加载LOADER(加载器). 在LOADER中初始化GDT.堆栈,把Knernel(内核)读取到内存,然后开启保护模式,最后进入Knernel并开始执行.操作系统正式开始运行了. GDT是CPU在保护模式下内存寻址必定会使用的元素,在Kernel执行过程…
在内核中异步请求设备固件firmware的测试代码 static void ghost_load_firmware_callback(const struct firmware *fw, void *context) { if(fw){ printk("firmware size=%d\n", fw->size); }else{ printk("failed to load firmware\n"); } } void ghost_load_firmware(…
linux内核用C语言实现了C++面向对象的大部分特性:封装,继承,多态.在看内核的过程中,开始追寻其中的设计思想,封装.继承.多态.恰好今天又在看Linux设备模型,找了很多资料.总结如下: 1.linux设备模型总结:点击打开链接 这篇文章对设备模型的讲解比较到位,但是没有图示清楚,如果需要形象理解,则可以参考我的前一篇文章:linux对象系统.在这篇文章的最后,利用pci_register_driver的注册过程和platform_register_driver,分别讲解了继承和多态思想的…