摘要: 扒完了 "字符设备" ,我们来看看平台总线设备,平台总线是Linux中的一种虚拟总线,我们知道, 总线+设备+驱动 是Linux驱动模型的三大组件,设计这样的模型就是将驱动代码和设备信息相分离,对于稍微复杂一点的驱动,都要使用这种结构,我在 ""Linux设备管理(一)_kobject, kset, 阅读全文
posted @ 2016-12-20 08:08 Abnor 阅读(4255) 评论(0) 推荐(1) 编辑
摘要: 我在 "Linux字符设备驱动框架" 一文中已经简单的介绍了字符设备驱动的基本的编程框架,这里我们来探讨一下Linux内核(以4.8.5内核为例)是怎么管理字符设备的,即当我们获得了设备号,分配了 cdev 结构,注册了驱动的操作方法集,最后进行 cdev_add() 的时候,究竟是将哪些内容告诉了 阅读全文
posted @ 2016-12-19 09:05 Abnor 阅读(20281) 评论(0) 推荐(8) 编辑
摘要: Linux内核大量使用面向对象的设计思想,通过追踪源码,我们甚至可以使用面向对象语言常用的UML类图来分析Linux设备管理的"类"之间的关系。这里以4.8.5内核为例从kobject,kset,ktype的分析入手,进而一探内核对于设备的管理方式 container_of宏 这个宏几乎是linux 阅读全文
posted @ 2016-12-18 13:28 Abnor 阅读(21541) 评论(6) 推荐(6) 编辑
摘要: 字符设备是Linux三大设备之一(另外两种是块设备,网络设备),字符设备就是字节流形式通讯的I/O设备,绝大部分设备都是字符设备,常见的字符设备包括鼠标、键盘、显示器、串口等等,当我们执行 ls l /dev 的时候,就能看到大量的设备文件, c 就是字符设备, b 就是块设备,网络设备没有对应的设 阅读全文
posted @ 2016-12-15 08:11 Abnor 阅读(16060) 评论(0) 推荐(8) 编辑
摘要: Linux是单内核系统,可通用计算平台的外围设备是频繁变化的,不可能将所有的(包括将来即将出现的)设备的驱动程序都一次性编译进内核,为了解决这个问题,Linux提出了可加载内核模块(Loadable Kernel Module,LKM)的概念,允许一个设备驱动通过模块加载的方式,在内核运行起来之后" 阅读全文
posted @ 2016-12-13 21:15 Abnor 阅读(6408) 评论(0) 推荐(2) 编辑
摘要: 概念 Linux内核从3.x开始引入设备树的概念,用于实现 驱动代码与设备信息相分离 。在设备树出现以前,所有关于设备的具体信息都要写在驱动里,一旦外围设备变化,驱动代码就要重写。引入了设备树之后,驱动代码只负责处理驱动的逻辑,而关于设备的具体信息存放到设备树文件中,这样,如果只是硬件接口信息的变化 阅读全文
posted @ 2016-12-06 11:40 Abnor 阅读(71677) 评论(1) 推荐(15) 编辑
摘要: Kconfig是我们进行内核配置的关键文件,用于生成menuconfig的界面并生成最终确定编译选项的 文件。关于Kconfig文件的编写规则,在 有详尽的叙述。这里主要用实例进行语法分析。 config 确定了条目前面是否有选项,menuconfig界面中的条目中一共有3种主动选项,分别是 ,`` 阅读全文
posted @ 2016-12-04 18:18 Abnor 阅读(4103) 评论(0) 推荐(2) 编辑
摘要: 和绝大多数源码编译安装一样,uboot的编译流程也类似于"make config make make install" 三步,只是由于uboot本身是针对多种平台的bootloader,软件的复杂性和通用型决定了编译uboot需要自行填补很多坑。本文主要讨论的就是移植uboot 2013.01的第一 阅读全文
posted @ 2016-11-27 16:30 Abnor 阅读(14843) 评论(0) 推荐(4) 编辑
摘要: GNU内联汇编 内联汇编 即在C中直接使用汇编语句进行编程,使程序可以在C程序中实现C语言不能完成的一些工作,例如,在下面几种情况中必须使用内联汇编或嵌入型汇编 1. 程序中使用饱和算术运算(Saturating Arithmetic) 2. 程序需要对协处理器进行操作 3. 在C程序中完成对程序状 阅读全文
posted @ 2016-11-15 07:39 Abnor 阅读(2862) 评论(0) 推荐(2) 编辑
摘要: ARM汇编程序结构 一个ARM程序可以被划分为多个代码段和数据段,在汇编的时候这些段会被形成一个可执行文件 子程序调用 ARM汇编中,子程序的调用一般通过 指令实现,在程序中,执行 即可完成子程序的调用。该指令在执行时完成如下操作: 1. 将子程序的返回地址保存在LR 2. 将PC指向子程序的入口 阅读全文
posted @ 2016-11-14 21:54 Abnor 阅读(1408) 评论(0) 推荐(0) 编辑
摘要: 符号定义伪指令 ,`.local .set .equ` .global 使得符号对连接器可见,变为对整个工程可用的全局变量 .local 表示符号对外部不可见,只对本文件可见 .set 给一个全局变量或局部变量赋值,和 的功能一样 .equ 和 一样,只是格式不同 数据定义伪指令 ,`.short 阅读全文
posted @ 2016-11-14 21:24 Abnor 阅读(1479) 评论(0) 推荐(1) 编辑
摘要: tcpip协议使用"流式"(套接字)进行数据的传输,就是说它保证数据的可达以及数据抵达的顺序,但并不保证数据是否在你接收的时候就到达,特别是为了提高效率,充分利用带宽,底层会使用缓存技术,具体的说就是使用Nagle算法将小的数据包放到一起发送,但是这样也带来一个使用上的问题——黏包,黏包就是说一次将 阅读全文
posted @ 2016-11-14 08:26 Abnor 阅读(2853) 评论(7) 推荐(2) 编辑
摘要: 当我们用socket进行编程的时候,细节上都是选择一个 ,`AF_INET`再根据相应的类型填充地址,其实根据通信需求,有几种简单的服务模型可供选用,掌握了这些框架再结合socket高度的抽象,可以为我们编写简单的服务器程序提供指导 循环服务 用户请求服务需要排队,服务器一次只能服务一个客户,服务完 阅读全文
posted @ 2016-11-13 22:12 Abnor 阅读(534) 评论(0) 推荐(1) 编辑
摘要: UNIX域套接字本地通信即在socket第一个参数中选择 ,socket是BSD提出的一种适用于所有的情况的进程间通信的方式,虽然现在多用于网络通信,但是本机内的进程间通信也是没有问题的,使用socket机制的UNIX域常用在前台进程和后台进程的通信。VS tcp/ip和udp/ip的socket在 阅读全文
posted @ 2016-11-05 10:20 Abnor 阅读(1129) 评论(0) 推荐(0) 编辑
摘要: getsockopt()/setsockopt() level :选项级别 SOL_SOCKET :指定设置属性在socket API层次,即通用socket选项 IPPROTO_IP :IP选项。 IPPROTO_TCP :TIP选项。 optname :选项名 SO_BROADCAST :广播 阅读全文
posted @ 2016-11-05 10:00 Abnor 阅读(1312) 评论(0) 推荐(0) 编辑
摘要: Linux中一切皆文件,不论是我们存储在磁盘上的字符文件,可执行文件还是我们的接入电脑的 I/O设备 等都被VFS抽象成了文件,比如标准输入设备默认是键盘,我们在操作标准输入设备的时候,其实操作的是默认打开的一个文件描述符是0的文件,而一切软件操作硬件都需要通过OS,而OS操作一切硬件都需要相应的驱 阅读全文
posted @ 2016-11-05 08:00 Abnor 阅读(4698) 评论(1) 推荐(2) 编辑
摘要: 模型 创建孤儿进程 fork() 创建新的会话 setid() 改变当前目录为根目录chdir() 重设文件权限掩码umask() 关闭文件描述符close() 创建孤儿进程 创建孤儿进程只需要将父进程关闭保留子进程 pid_t pid_child=fork(); if(0 阅读全文
posted @ 2016-11-02 08:23 Abnor 阅读(737) 评论(0) 推荐(1) 编辑
摘要: Process program program==code+data; 一个进程可以对应多个程序,一个程序也可以变成多个进程。程序可以作为一种软件资源长期保存,以文件的形式存放在硬盘 process: 1. 相应的程序+CPU上下文+一组系统资源 2. 动态性, 独立性, 并发性 3. 一个CPU, 阅读全文
posted @ 2016-11-01 21:28 Abnor 阅读(1768) 评论(0) 推荐(0) 编辑
摘要: Reentrant和Thread safe 在单线程程序中,整个程序都是顺序执行的,一个函数在同一时刻只能被一个函数调用,但在多线程中,由于并发性,一个函数可能同时被多个函数调用,此时这个函数就成了临界资源,很容易造成调用函数处理结果的相互影响,如果一个函数在多线程并发的环境中每次被调用产生的结果是 阅读全文
posted @ 2016-11-01 20:36 Abnor 阅读(2990) 评论(0) 推荐(3) 编辑
摘要: 条件变量是线程同步的另一种方式,实际上,条件变量是信号量的底层实现,这也就意味着,使用条件变量可以拥有更大的自由度,同时也就需要更加小心的进行同步操作。条件变量使用的条件本身是需要使用互斥量进行保护的, 线程在改变条件状态之前必须首先锁住互斥量 ,其他线程在获得互斥量之前不会察觉到这种改变,因为互斥 阅读全文
posted @ 2016-10-30 09:02 Abnor 阅读(1039) 评论(0) 推荐(1) 编辑