摘要: 本文就来揭秘一下到底一个驱动的接口函数是如何被调用的: 首先我们来反汇编读驱动的程序: 跳转到__libc_read,发现他把r7赋值给3,3是传过去的参数,然后调用svc指令,进入内核态相应的入口: 接下来就已经进入内核态,入口函数中将存入r7中的3取出。 然后加载一张表,表名是sys_call_call,根据这个表中内容,断定3到底是对应什么操作: 这个表如下,可以看出表中第三项对应C... 阅读全文
posted @ 2015-11-24 23:40 DChipNau 阅读(543) 评论(0) 推荐(0) 编辑
摘要: 应用程序使用驱动:一个设备驱动其实就是一个内核模块。应用程序使用一个字符设备是通过使用其设备文件来完成的,通过对其设备文件的读写来完成对设备的交互: 那么,想要使用字符设备驱动就首先得有一个字符设备文件,创建一个字符设备文件的方式有两种: 驱动初始化 因为驱动程序是一个内核模块,所以驱动的初始化操作是放在内核模块的初始化函数里: 主要流程如下: 下面展示一段示例代码: 下面来解释一... 阅读全文
posted @ 2015-11-24 23:38 DChipNau 阅读(418) 评论(0) 推荐(0) 编辑
摘要: 这种问题就要和ucos结合起来嘛。 程序和进程:程序:存放在磁盘上的一些列代码和数据的可执行映像,是一个静止的实体。进程:是一个执行中的程序,它是动态的实体。 linux进程的四要素:1. 有一段程序供其执行。这段程序不一定是某个进程所专有,可以与其他进程共用。2. 有进程专用的内核空间堆栈。3. 在内核中有一个task_struct数据结构,即通常所说的“进程控制块”。有了这个数据结构,进程才能... 阅读全文
posted @ 2015-11-24 23:36 DChipNau 阅读(1571) 评论(0) 推荐(0) 编辑
摘要: 能不能一种链表中链接不同的类型呢,相应这种号召,内核链表诞生了。内核链表之所以能够链接不同的类型的数据,是因为它和普通链表不一样,它链接的不是数据结构的起始地址,而是链接的该数据结构中的的list_head属性。 下面是比较重要的函数: 其他的都很简单,专门介绍一下list_entry函数: 函数最后返回的是这个结构体节点起始地址。Ptr是这个节点中list_head属性的地址,type是这个... 阅读全文
posted @ 2015-11-24 23:35 DChipNau 阅读(240) 评论(0) 推荐(0) 编辑
摘要: 王工小板中对于stm32f411芯片的复位电路如下: 实际上这个电路是错误的,经过实测,stm32f411芯片运行时复位引脚为高电平,而在这个电路图里,实际上是把stm32f411芯片运行时复位引脚的电平看为了低电平,按照这个电路,按下按键,会引起电平跳转到高电平从而触发复位,然而实际上并不是... 阅读全文
posted @ 2015-11-24 23:28 DChipNau 阅读(574) 评论(0) 推荐(0) 编辑