随笔分类 - 嵌入式
摘要:Linux处理嵌套中断 1.慢速中断情况下 第一种情况:当中断处理1正在执行的时候,中断处理2(不同类型中断)到来,那么会暂停中断处理1,转向执行中断处理2,待中断处理2执行完后,再接着执行中断处理1。 第二种情况:当中断处理1正在执行的时候,中断处理2(同类型中断)来到,那么会忽略中断处理2,接着
阅读全文
摘要:中断类型对应中断号 1.在内核代码中找到irqs.h(.../s3c2410.h)对应的中断号,Linux系统中用的中断号是中断类型编号(INTOFFSET)加上基数偏移得到的。 2.其中的宏就是中断类型所对应的中断号 #define S3C2410_CPUIRQ_OFFSET (16) #defi
阅读全文
摘要:裸机中断: 1.中断统一入口。 2.注册中断处理程序。 3.根据中断源编号,调用中断处理程序。 Linux中断 1.在entry-armv.S中的_irq_svc是中断统一入口。 2.获取产生中断源的编号(中断号)。 3.根据中断号,找到irq_desc结构 4.从irq_desc描述结构中取出事先
阅读全文
摘要:混杂设备概念 在linux系统中,存在一类字符设备,它们拥有相同的主设备号(10),但次设备号不同,我们称这类设备为混杂设备(miscdevice)。所有的混杂设备形成一个链,对设备访问时内核根据次设备号查找到相应的混杂设备。 设备描述 Linux中使用struct miscdevice来描述一个混
阅读全文
摘要:LED程序设计 1.编写内核模块 2.搭建字符驱动框架 3.实现设备方法 头文件 <linux/io.h> writel() 1.编译/安装驱动 make cp leddev.ko .../rootfs insmod leddev.ko 2.创建设备文件 mknod /dev/myled0 c 25
阅读全文
摘要:设备控制理论 1.设备控制的作用 大部分驱动程序除了需要提供读写设备的能力外,还需要具备控制设备的能力。比如改变波特率。 2.设备控制的函数 在用户空间使用ioctl系统调用函数来控制设备。 int ioclt(int fd, unsigned long cmd, ...) fd:要控制的设备文件描
阅读全文
摘要:应用程序访问驱动程序 1.系统调用找到内核实现函数(read) 在这个过程中主要做了下面的工作: r7 = 3 svc 说明: svc是系统调用指令,当使用该指令时系统会从用户空间进入内核空间的固定入口处,内核会从r7寄存器中取出系统调用编号,然后内核会查找系统调用表找到对应的函数实现,然后调用该函
阅读全文
摘要:头文件 <linux/cdev.h> struct cdev <linux/fs.h> struct file_operations <asm/uaccess.h> copy_from_user(); copy_to_user(); memdev.c #include <linux/init.h>
阅读全文
摘要:设备驱动模型 1.驱动初始化(驱动安装) 1.1.分配设备描述符 1.2.初始化设备描述符 1.3.注册设备描述符 1.4.硬件初始化 2.实现设备操作(驱动操作) 3.驱动注销(驱动卸载) 设备描述结构 在任何一种驱动模型中,设备都会用内核中的一种结构来描述。我们的字符设备在内核中使用struct
阅读全文
摘要:编译/安装驱动程序 在Linux系统中,驱动程序通常采用内核模块的程序结构来进行编码。因此编译/安装一个驱动程序,其实就是编译/安装一个内核模块。 示例: make insmod memdev.ko 创建设备文件 应用程序->设备文件->驱动程序 通过字符设备文件,应用程序可以使用相应的字符设备驱动
阅读全文
摘要:硬件访问实质 驱动程序控制设备,主要是通过访问设备内的寄存器来达到控制目的的,因此我们讨论如何访问硬件,就成了如何访问这些寄存器。 访问流程 1.地址映射 在Linux系统中,无论是内核程序还是应用程序,都只能使用虚拟地址,而芯片手册中给出的硬件寄存器地址或RAM地址都是物理地址,无法直接使用。因此
阅读全文
摘要:驱动程序分类 常规分类法: 1.字符设备 字符设备是一种按字节来访问的设备,字符驱动则负责驱动字符设备,这样的驱动通常支持open,close,read和write系统调用。例如:串口,LED。按键。 2.块设备 在大部分unix系统中,块设备的定义为:以块(通常是512字节)为最小传输单位的设备,
阅读全文
摘要:系统调用 函数实现体在内核空间,提供给应用程序来使用,就是一个系统调用。 工作流程 1.通过软中断(swi)从用户空间切换到内核空间。entry-common.S中的ENTRY(vector_swi)是用来处理软中断的。系统调用通常从r7寄存器中取出系统调用编号。 2.通过系统调用编号从系统调用表中
阅读全文
摘要:链表简介 链表是一种常见的数据结构,它通过指针将一系列数据节点连接成一条数据链。相对于数组,链表具有更好的动态性,建立链表时无需预先知道数据总量,可以随机分配空间,可以高效地在链表中的任意位置实时插入或删除数据。链表的开销主要是访问的顺序性和组织链的空间损失。 传统链表与Linux内核链表的区别 L
阅读全文
摘要:进程与程序 1.程序:存放在磁盘上的一系列代码和数据的可执行映像,是一个静止的实体。 2.进程:是一个执行中的程序,它是一个动态的实体。 进程四要素 1.有一段程序供其执行。这段程序不一定是某个进程所专有,可以与其他进程共用。 2.有进程专用的内核空间堆栈。 3.在内核中有一个task_struct
阅读全文
摘要:内存管理子系统 1.虚拟地址与物理地址的映射 2.物理内存的分配 Linux虚拟地址空间分布 设备最后访问的一定是物理地址,但Linux系统中使用的都是虚拟地址。虚拟地址简单的来说就是程序中使用的地址。所以存在虚拟地址到物理地址之间的映射关系。 Linux系统支持的虚拟地址空间由硬件来决定。例如处理
阅读全文
摘要:模块申明 1.MODULE_LICENSE(“遵守的协议”) 申明该模块遵守的许可证协议,如:”GPL”,”GPL v2”等 2.MODULE_AUTHOR(“作者”) 申明模块的作者 3.MODULE_DESCRIPTION(“模块的功能描述”) 申明模块的功能 4.MODULE_VERSION(
阅读全文
摘要:内核模块示例 #inlcude <linux/init.h> #inlcude <linux/module.h> static int hello_init(){ printk(KERN_WARNING”hello_init\n”); return 0; } static void hello_ex
阅读全文
摘要:什么是内核模块 Linux内核的整体结构非常庞大,其中包含的组件也非常多,如何使用这些组件。一种方式是把所有的组件都编译进内核文件,即zImage或bzImage,但这样会导致一个问题,占用内存过多。内核模块是一种能让内核文件本身并不包含某些组件,而是是在被需要使用的时候,动态地添加到到在运行的内核
阅读全文
摘要:服务器环境搭建 1.配置tftp服务器 1.1.设置tftp目录 vim /etc/xinetd.d/tftp server_args = -s .../tftp disable = no 1.2.启动tftp服务 /etc/init.d/xinetd restart 2.配置nfs服务器 2.1.
阅读全文