![](https://img-blog.csdnimg.cn/2020061217443817.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
Linux 驱动三板斧
文章平均质量分 95
CPU架构 + C语言 + 操作系统
pwl999
莫听穿林打叶声,何妨吟啸且徐行。
展开
-
2.1 Linux驱动设备模型
非markdown版本Linux设备模型大概是最难的linux知识点之一了。晦涩难懂的kobject、kset概念,云里雾里的sys文件系统层次,搞得你不知所云。下面我们就尝试对这块硬骨头进行剖析。原创 2017-10-11 20:13:40 · 1546 阅读 · 2 评论 -
1.5 x86带宽计算
x86大框图的的名词解释和各部分的带宽计算,系统整理了一下,做了个总结,大家有兴趣就一起学习学习。原创 2017-10-12 19:12:54 · 1729 阅读 · 1 评论 -
2.7 Linux模块机制
1、模块插入模块的格式。驱动模块在2.6内核下编译出来是.ko文件,.ko文件也是elf格式的。elf格式的文件有3种类型:可重定位文件obj、可执行文件、共享库文件。需要注意的是,用户态编译出来的应用程序是可执行类型的elf,而.ko文件是可重定位类型的elf。 仅从文件格式上就可以看到,模块文件的加载和用户态可执行文件的动态加载机制是不一样的。1.1、外部模块插入工具Modprobe加载外部模块原创 2017-10-13 10:15:15 · 1613 阅读 · 0 评论 -
2.9 Linux tty终端
Linux在内核启动完成以后,需要启动用户态的各种应用服务,让linux可以提供给用户使用。通常用户程序的执行过程如图所示。 其执行顺序是/sbin/init ——–>/sbin/mingetty ——–>/bin/login ——–>/bin/sh。Init程序的执行在前面的文章里已经描述过,本篇重点讲述tty、login、shell的工作原理和运行过程。原创 2017-10-13 11:28:35 · 1881 阅读 · 0 评论 -
2.6 Linux内核makefile解析
Linux内核的整个makefile编译系统称为kbuild系统,负责linux内核源码文件架构的编译和链接工作。2.4内核和2.6内核的kbuild实现上有非常大的差异,但是实现的功能基本是一样的,从顶层makefile目标到一个个子文件夹的递归调用,最终又合成一个顶层目标。2.4内核的makefile比较直观比较容易理解些,2.6的makefile文件比较难看懂,所以本文重点解析2.4内核的ma原创 2017-10-12 21:01:27 · 917 阅读 · 0 评论 -
1.6 x86读取smbios信息
SMBIOS概念SMBIOS(System Management BIOS)是主板或系统制造者以标准格式原创 2017-10-12 19:22:23 · 2924 阅读 · 0 评论 -
1.4 x86 CPU地址空间分配和寄存器访问
1、基本概念cpu地址空间和pci地址空间是两个常用的比较容易混淆的概念,特别是其中不同系列的cpu的实现还各不相同:x86系列cpu地址空间和pci地址空间是重合的,即为同一空间;而非x86 cpu的cpu地址空间和pci地址空间为两个独立的空间。原创 2017-10-12 11:05:15 · 9443 阅读 · 0 评论 -
1.3 PCI&PCIE MSI中断
1、什么是MSI?(Message Signaled Interrupts)用简单的一句话就可以说明msi的原理:cpu有一段特殊的寄存器空间,往这个寄存器里面写数据,就会触发cpu的中断。pci设备经过配置以后,一旦需要上报中断就会往cpu这种寄存器里面写一个值,触发cpu的中断。2、PCI/PCIE Device侧关于MSI的配置:关于MSI特性,PCI提供了一组Capability Struc原创 2017-10-11 20:44:03 · 9840 阅读 · 0 评论 -
1.2 PCI&PCIE ExpansionOption ROM
1、什么是ExpansionOption ROM?Expansion rom是pci/pcie设备可选的一个外接的eprom芯片,其中用来存储相应pci设备的初始化代码或者系统启动代码(比如pxe或者pci boot)。BIOS在POST(Power-on Self Test)阶段,会扫描pci设备是否有expansion rom,有的话将其拷贝到ram中执行。在PCI规范中称为expansion原创 2017-10-11 20:36:50 · 8134 阅读 · 1 评论 -
2.10 Linux 串口、CF卡、MTD、I2C驱动分析
本文以风河linux代码为例,解析Linux 串口、CF卡、flash MTD、I2C驱动的具体实现。1、串口驱动1.1、原理简介Mspb单板的xlr732cpu提供了两个串口,我们使用了其中一个串口作为控制台。串口虽然简单,但是作用是非常重要的。在内核调试的初期一切都未正常,只能向串口直接输出调试信息来调试;在系统的启动阶段也只能向串口打印启动信息。在Linux系统中,串口驱动的架构如下: 1.2原创 2017-10-14 17:33:57 · 1353 阅读 · 0 评论 -
2.5 Linux启动
1、内核组成Linux的内核源码经过编译、链接以后,最原始的内核映像为vmlinux。而在实际使用的过程中为了启动的需要,会使用压缩过的内核zImage、bzImage,zImage对应小内核(内核启动地址为0x10000,大小不超过512K,即地址范围0x10000 – 0x8ffff),bzImage对应大内核(内核启动地址为0x100000),一般使用的都是大内核bzImage。首先我们来看看原创 2017-10-14 16:02:05 · 732 阅读 · 0 评论 -
2.3 Linux网络接口
1、网络系统调用1.1、socket()1.1.1、sys_socket() 1.1.2、socket fs 1.1.3、sock_create() 1.1.3.1、net_families的注册 1.1.3.2、net_proto_family->create()(AF_UNIX域的实现) 1.1.3.3、net_proto_原创 2017-10-15 02:50:19 · 991 阅读 · 0 评论 -
3.1 链接加载原理及elf文件格式
1、原理概述为什么要研究链接和加载?写一个小的main函数用户态程序,或者是一个小的内核态驱动ko,都非常简单。但是这一切都是在gcc和linux内核的封装之上,你只是实现了别人提供的一个接口,至于程序怎样启动、怎样运行、怎样实现这些机制你都一无所知。接着你会对程序出现的一些异常情况束手无策,对内核代码中的一些用法不能理解,对makefile中的一些实现不知所云。所以这就是我们要研究链接和加载的目的原创 2017-10-12 19:52:03 · 1317 阅读 · 0 评论 -
3.2 Linux C程序解析
相信大家在最早学习c语言程序的时候都写过“helloworld”程序,下面就是一个linux c语言的“helloworld”程序: 简单的main函数,简单调用printf打印一句话,简单的gcc编译 “gcc hello.c –o hello”以后,执行 “./hello”就可以看到打印结果。 做完这些以后,也许你会来上一句“so easy!”。但是,你真的了解了这个简单main函数的执行过程原创 2017-10-12 20:11:42 · 1502 阅读 · 0 评论 -
3.3 Linux头文件和库的搜索路径
1、FAQ1.1、glibc安装时.so库文件和.h头文件都安装到什么文件夹,gcc怎么能正确的找到相应的文件夹?当我们在build gcc时设定–prefix=/path/,则gcc安装到/path/,gcc默认会在/path/lib/路径下搜寻库,在/path/include/路径下搜寻头文件。 例如,一般linux系统把gcc和glibc都安装到/usr/目录,所以gcc可执行文件在/usr原创 2017-10-12 20:29:59 · 9486 阅读 · 1 评论 -
3.4 线程id获取
获取线程tid的地方有两个:原创 2017-10-12 20:36:26 · 573 阅读 · 0 评论 -
3.5 关于printf的典型隐藏性错误
调试的时候,碰到一个问题,从表面上看非常正常,但是运行就是不正常。原创 2017-10-12 20:41:32 · 716 阅读 · 1 评论 -
2.8 Linux系统调用
1、概述系统调用是操作系统为在用户态运行的进程与硬件设备(如打印机和磁盘)进行交互提供的一组接口。用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务,例如用户可以通过文件系统相关的调用请求系统打开文件和关闭文件等。系统调用的主要功能是使用户可以使用操作系统提供的有关设备管理、文件系统、进程控制、进程通讯以及存储管理方面的功能,而不必要了解操作系统的内部结构和有关硬件的细节问题,从而减轻用户原创 2017-10-13 10:36:50 · 584 阅读 · 0 评论 -
2.4 Linux进程
1、进程创建.1、clone()clone()、fork()、vfork()实际调用的都是do_fork()函数,只是带入的参数不一样。Clone()是最灵活的函数,参数可以自定义,但也只是一般拿来创建线程,被创建线程函数pthread_create()调用。Fork()创建进程,vfork创建共享用户空间的进程。1.1.1、pthread_create()创建线程一般不会直接调用clone()函数原创 2017-10-14 16:22:16 · 480 阅读 · 0 评论 -
2.2 Linux文件系统
1、虚拟文件系统VFS1.1、背景说明1.1.1、层次结构 所谓块设备,就是在该设备上读写数据时,必须要以块为基本单位,而不能以随机的字节起始地址和长度。一般的磁盘块就是扇区,常见扇区大小是512字节。上图是一个块设备操作在内核中涉及到的层次组织。其中分为四个大的层次:第一层:VFS。系统提供的虚拟文件系统,对所有的文件系统提供了一个统一的抽象视角,并且负责文件系统测层次结构组织。第二层:磁盘高原创 2017-10-15 00:51:38 · 824 阅读 · 0 评论 -
1.1 PCI&PCIE 配置寄存器访问
1、PCIE 寄存器的总体结构:PCI的配置寄存器空间为256个字节大小。PCIE扩展了配置寄存器空间,大小为4096的字节。PCIE配置寄存器的整体分布如下图所示:从上图可见,整个PCIE配置空间被分成了3部分,其中0-FF为PCI兼容的配置空间,100-FFF为PCIE扩展的空间。每部分的作用大概如下:a、0-3F :这部分的配置空间是标准的PCI配置空间头,是每个PCI/PCIE设备都必原创 2017-10-11 20:27:13 · 7412 阅读 · 0 评论