- 博客(183)
- 资源 (6)
- 问答 (7)
- 收藏
- 关注
原创 Linux驱动开发实战(一)——设备驱动模型
在早期的Linux内核中并没有为设备驱动提供统一的设备模型。随着内核的不断扩大及系统更加复杂,编写一个驱动程序越来越困难,所以在Linux2.6内核中添加了一个统一的设备模型。这样,写设备驱动程序就稍微容易一些了。本章将对设备模型进行详细的介绍。设备驱动模型比较复杂,Linux系统将设备和驱动归一到设备驱动模型中来管理。设备驱动模型的提出,解决了以前编写驱动程序没有统一方法的局面。设备驱动模型给各种驱动程序提供了很多辅助性的函数,这些函数经过严格测试,可以很大程度上地提高驱动开发人员的工作效率。
2023-07-22 21:22:16
2967
原创 Linux驱动进阶(四)——内外存访问
驱动程序加载成功的一个关键因素,就是内核能够为驱动程序分配足够的内存空间。这些控件一部分用于驱动程序必要的数据结构,另一部分用于数据交换。同时,内核也应该具有访问外部设备端口的能力。一般来说,外部设备被连接到内存空间或者I/O空间中。本章将对内外存设备的访问进行详细的介绍。
2023-07-14 20:51:11
956
原创 Linux驱动进阶(三)——中断与时钟机制
中断和时钟机制是Linux驱动中重要的两项技术。使用这些技术,可以帮助驱动程序更高效地完成任务。在写设备驱动程序的过程中,为了使系统知道硬件在做什么,必须使用中断。如果没有中断,设备几乎什么都不能做。本章将详细讲解中断与时钟机制。
2023-07-13 17:33:31
1912
原创 Linux驱动进阶(二)——设备驱动中的阻塞和同步机制
阻塞和非阻塞是设备访问的两种基本方式。使用这两种方式,驱动程序可以灵活地支持阻塞与非阻塞访问。在写阻塞与非阻塞的驱动程序时,经常用到等待队列,所有本章将对等待队列进行简要介绍。在Linux驱动程序中,阻塞进程可以使用等待队列(Wait Queue)来实现。由于等待队列很有用,在Linux2.0的时代,就已经引入了等待队列机制。等待队列的基本数据结构是一个双向链表,这个链表存储睡眠的进程。等待队列也与进程调度机制紧密结合,能够用于实现内核中异步事件通知机制。等待队列可以用来同步对系统资源的访问。
2023-07-11 16:58:41
634
原创 Linux驱动进阶(一)——设备驱动中的并发控制
中断处理、多任务处理和多处理器(SMP)。这些特性导致当多个进程、线程或者CPU同时访问一个资源时,可能会发生错误,这些错误是操作系统运行所不允许的。在操作系统中,内核需要提供并发控制机制,对公共资源进行保护。本章将对保护这些公共资源的方法进行简要的介绍。在Linux中提供了一些锁机制来避免竞争条件,最简单的一种就是自旋锁。引入锁的机制,是因为单独的原子操作不能满足复杂的内核设计需要。例如,当一个临界区域要在多个函数之间来回运行时,原子操作就显得无能为力了。
2023-07-10 19:52:14
392
原创 Linux驱动入门(五)——简单的字符设备驱动程序
在Linux设备驱动程序的家族中,字符设备驱动程序是较为简单的驱动程序,同时也是应用非常广泛的驱动程序。所以学习字符设备驱动程序,对构建Linux设备驱动程序的知识结构非常重要。本篇博客将带领读者编写一个完整的字符设备驱动程序。
2023-07-09 18:06:36
1450
原创 Linux驱动入门(四)——构建第一个驱动程序
开发板以STM32MP157为例进行实验。万事开头难,写驱动程序也是一样,本章将构建第一个驱动程序。驱动程序和模块的关系非常密切,所以这里将详细讲解模块的相关知识。而模块编程成败与否的先决条件是要有统一的内核版本,所以这里将讲解怎样升级内核版本。最后为了提高程序员的编程效率,这里将介绍两种集成开发环境。
2023-06-26 15:35:46
2175
原创 Linux内核设计与实现(一)——内核进程管理
进程是Unix操作系统抽象概念中最基本的一种。其中涉及进程的定义以及相关的概念,比如线程;然后讨论Linux内核如何管理每个进程:它们在内核中如何被列举,如何创建,最终如何消亡。我们拥有操作系统就是为了运行用户程序,因此,进程管理就是操作系统的心脏所在,Linux也不例外。本篇我们考察了操作系统中的核心概念——进程。也讨论了进程的一般特性,它为何如此重要,以及进程与线程之间的关系。然后,讨论了Linux如何存放和表示进程(用和),如何创建进程(通过fork(),实际上最终是clone()
2023-06-24 12:08:52
1042
1
原创 C语言深度刨析(二)——符号
qq群:829876251也欢迎热爱C语言的朋友们一起学习交流!!!符号有什么好说的呢?确实,符号可说的内容要少些,但总有些可以唠嗑地方。这个符号在C语言里都用在那些地方?,如果你真正掌握了C语言,你就能很轻易的回答上来。这个问题就请读者试着回答一下吧(我刚开始好像就看出了除号,^_^C语言的基本符号就有20多个,每个符号可能同时具有多重含义,而且这些符号之间相互结合使得C语言中的符号变得更加复杂起来。你也许听过“国际C语言乱码大赛(IOCCC)”,能获奖的人毫无疑问是世界顶级C程序员。
2023-06-20 17:46:12
240
原创 Linux驱动入门(三)——源码下载阅读、分析和嵌入式文件系统介绍
关于Source Insight的介绍和使用大家可以参考这篇博客。或者直接在网上找资料进行学习参考博客根文件系统是Linux操作系统运行需要的一个文件系统。分区1一般存储Linux内核映象文件,在Linux操作系统中,内核映象文件一般存储在单独的分区中。分区2存放根文件系统,根文件系统中存放着系统启动必须的文件和程序。这些文件和程序包括:提供用户界面的Shell程序、应用程序依赖库、配置文件等。其他分区上存放普通的文件系统,也就是一些数据文件。操作系统的运行并不依赖于这些普通文件。
2023-05-26 21:18:45
2189
6
原创 Linux驱动入门(二)——嵌入式处理器介绍和构建驱动程序开发环境
在实际工程项目中,Linux驱动程序一般是为嵌入式系统而写的。因为嵌入式系统因用途、功能、设计厂商不同,硬件之间存在很多的差异。这些差异性,不能通过写一个通用的驱动程序来完成,需要针对不同的设备书写不同的驱动程序。要写驱动程序,必须了解处理器和开发板的相关信息。ARM是微处理器行业的一家知名企业,设计了大量高性能、廉价、低功耗的RISC处理器。ARM处理器具有性能高、成本低和能耗低的特点。适用于多种领域,比如嵌入式控制、消费/教育类多媒体、DSP和移动式应用等。
2023-05-24 16:06:57
1359
原创 Linux驱动入门——基础概念
Unix是从贝尔实验室的一个失败的多用户操作系统Multics中涅槃而生的。Multics项目被终止后,贝尔实验室科学研究中心的人们发现自己处于一个没有交互式操作系统可用的境地。在这种情况下,1969年的夏天,贝尔实验室的程序员们设计了一个文件系统系统原型,而这个原型最终发展演化成了Unix。由于最初一六的设计和以后多年的创新与逐步提高,Unix系统成为一个强大、健壮和稳定的操作系统。下面的几个特点是使Unix。
2023-05-23 17:31:45
2650
原创 C语言深度解刨(一)——关键字
qq群:829876251也欢迎热爱C语言的朋友们一起学习交流!!!int i;定义:所谓定义就是(编译器)创建一个对象,为这个对象分配一块内存并给它取上一个名字,这个名字就是我们经常所说的变量名或对象名。但注意,这个名字一旦和这块内存匹配起来(可以想象是这个名字嫁给了这块空间,并且不要彩礼),它们就同生共死,终生不离不弃。并且这块内存位置也不能改变。一个变量或对象在一定区域内(比如函数,全局等)只能被定义一次,如果定义多次,编译器会提示你重复定义同一个变量或对象。
2023-05-20 19:59:25
1614
原创 如何在Ubuntu上编辑和运行C程序(新手入门)
兜兜转转还是想再深入的学习C语言,因此打算制定一个学习C语言的计划来不断推荐学习C语言。欢迎各位志同道合的同志加入和交流。qq群·:829876251本篇博客可能写的相对比较简易,后面收集了大家集中的问题后会再更改。也欢迎大家入群交流学习。qq群·:829876251。
2023-05-20 19:37:57
4129
原创 2022年总结——实习
lastday!感觉有很多想总结和分享的,但一落实到键盘上似乎就变得无从下手了(-__-)。但还是想发表点什么,哪怕是对看到这篇博客的你们有那么一点点帮助也是好的。notice:以下内容按时间线梳理我在Sagemcom实习了6个月(2022.06.20-2022.12.20)优点:学到了很多专业的知识技能,有培训,有导师一带一。公司主要是做网关产品的研发,所以主要是对网络方面的知识有了很大的加强。同时还跟着导师学习了WiFi相关的常用知识和技术。
2022-12-20 21:15:16
2809
5
原创 深入理解Linux网络技术内幕(十三)——协议处理函数
协议是所有通信的架构:指示每位通信者如何理解通话的另一端。在Linux中,对通信的理解是通过网络中各层的协议处理函数。本篇说明这些处理函数如何安装、如何在执行期间被选中以及如何启用。
2022-12-14 13:59:13
2635
2
原创 Shell脚本学习指南(七)——产生脚本
本篇,我们将进一步处理更复杂的工作。我们认为这里举出的例子都是一般用得到的工具,它们每一个都截然不同,且在大多数UNIX工具集里也没有。在篇中的程序,包括命令行参数分析、在远程主机上运算、环境变量、工作记录、并行处理、使用的运行时语句执行、草稿文件、Shell函数、用户定义初始文件,以及安全性议题考虑的范例。程序会运用Shell语言里的重要语句,并展现传统的UNIX Shell脚本编写风格。有些程序支持在目录路径上查找输入文件,有点像UNIX Shell查找以冒号隔开的目录列表,列在内,以找出可执行的程序。
2022-12-13 17:36:03
757
原创 Shell脚本学习指南(六)——输入/输出、文件与命令执行
本篇博客将完成介绍Shell语言。首先讨论的是文件:如何以不同的方式处理输入/输出和产生文件名。接着是命令替换,也就是让你使用一个命令的输出作为命令行的参数。然后,我们继续将重点放在命令行上,讨论Shell提供的各类引用。最后,则是深入讨论命令执行顺序,并针对内建于Shell里的命令作介绍。前面我们介绍过printf命令,下面我们将完整地介绍它。printf第一部分为描述符规格的字符串,它的最佳提供方式是放在引号内的字符串常数。第二部分为参数列表,例如字符串或变量值的列表,该列表需与格式规格相对应。
2022-12-08 17:08:09
7312
原创 深入理解Linux网络技术内幕(一)——基础介绍
Hello,各位小伙伴们大家好。出于工作的需要以及对Linux的浓厚兴趣,决定从今天开始对这本数进行学习。写这个博客的目的也是记录自己的学习笔记和自己的学习心得,如果大各位小伙伴也有兴趣,欢迎一起学习和讨论。关于本书的前言以及介绍这里就不再赘述,直接进入本书的第一章。对于大型项目源码的研究,就像进入一个陌生新奇的领域,有其习惯和不能言表的期待。事先学习一些主要的约定,并尝试和几种组件互动而不是仅站在旁边观察,肯定会对你有所帮助。本章主要介绍一些在网络代码中经常遇到的通用编程模式和技巧。可能的话,希望
2022-12-08 10:55:47
2633
3
原创 深入理解Linux网络技术内幕(十二)——中断事件一般性参考数据
这篇博客的内容不是很多,主要是介绍几种一般性信息,适用于前面所讲涉及中断事件和帧的处理有关帧接收的统计数据保存在各个CPU数组中,其元素为类型(参见)的元素有前述有些计数器目前都由(由非NAPI驱动程序所用)更新,这表示使用NAPI驱动程序时,其值是不正确的。向量的内容可通过接口查看。其他统计数据则由驱动程序、较高层协议以及流量控制队列控制保存在私有数据结构中。这些值有些可以通过用户空间程序读取,如,其他则可通过输出。下表列出了所有在中的文件,都定义在,你可以找出文件与内核变量之间的关联性。需要强调的是,
2022-12-08 10:53:08
448
原创 深入理解Linux网络技术内幕(十一)——帧的传输
“传输”这一术语用于离开系统的帧,也许是因为被系统传送出去,或者是因为被转发出去。本章我们讨论帧传输的数据通路中所涉及的主要任务:为设备开启和关闭帧的传输为设备调度以准备传输为下一帧调度以准备传输。也就是在设备出口队列中等待的那些帧。传输本身(我们将检查主要函数)传输过程和第十章所谈的接收过程大部分是对称的:传输软IRQ,与软IRQ配对,而与配对,诸如此类。因此,如果你已读过前一章,应该会发现这一章很容易理解。下图比较了调度设备以准备接收,以及调度设备以准备传输两者之间背后的逻辑。以下是一些相似性:是设备列
2022-12-07 13:10:43
1841
原创 Shell脚本学习指南(五)——变量、判断、重复动作
变量对于正规程序而言很重要。处理维护有用的值作为数据,变量还用于管理程序状态。由于Shell主要是字符串处理语言,所以你可以利用Shell变量对字符串做很多事。然而,因为算术运算也是必要的,所以POSIX Shell也提供利用Shell变量执行算术运算机制。流程控制的功能造就了程序语言:如果你有的只是命令语句,是不可能完成任何工作的。后面介绍了用来测试结果、根据这些记过做出判断以及加入循环的功能。最后介绍的是函数:它可以将相关工作的语句集中在同一处。这么一来就可以在脚本里的任何位置,轻松执行此工作。
2022-12-01 11:07:30
1019
原创 深入理解Linux网络技术内幕(十)——帧的接收
前面一节我们知道了,处理L2层的帧的函数是由中断事件驱动的。下面我们将着手讨论帧的接收,此时,硬件会使用中断事件通知CPU,该帧已经可用了。接收中断事件的CPU会执行do_IRQ函数。IRQ编号会引发正确的处理函数被启用后。此处理函数通常是设备驱动程序在设备设备驱动程序初始化期间所注册的函数,IRQ函数处理例程会在中断模式下执行,即后续的中断事件都会暂时被关闭。中断处理函数会执行一些立即性的任务,然后把其他任务安排到下半部函数中以便在稍后执行。明确的将,中断处理函数会:把帧拷贝到sk_buff。
2022-11-30 15:02:10
1230
原创 深入理解Linux网络技术内幕(九)——中断和网络驱动程序
这一篇我们将按照一个个的功能或一个个的子系统分析如何实现网络,为什么要引入某些功能,以及当功能之间有意义时彼此之间是如何交互的进行分析。
2022-11-25 18:27:03
1131
原创 Shell脚本学习指南(四)——管道的神奇魔力
当你在UNIX里对付文字处理作业时,必须谨记一个UNIX工具使用原则就是:想清楚这个问题该如何划分为更简单的工作,每个部分是不是已有现成的工具能解决,还是你可以写几行Shell程序或使用脚本语言就能解决。
2022-11-24 19:43:43
722
原创 Shell脚本学习指南(三)——文本处理工具
这样的命令已经不像以前那么好用了:打印工作很快就传到打印机,并出现在打印机daemon上,显示好了,然后从打印机队列中删除——即使打印机仍然将它们搁在内存或是文件系统里,这时,他仍能同时处理其他的打印工作。还有一种更好用的开放源代码版本,由于许多人的贡献,让我们可以享受到它的便利:它识别的文件类型有1200多种,包含许多非UNIX操作系统下的文件。将输入看做具有多条记录的数据流,而记录是由可宽度的字段组成,记录是以换行字符作为定界符,字段的定界符则是空白哦字符或是用户指定的单个字符。
2022-11-18 20:42:15
1486
原创 深入理解Linux网络技术内幕(八)——设备注册和初始化
经过前面所学,我们已经知道内核如何验证NIC,以及内核所做的初始化,使得NIC得以和其他设备驱动程序对话。下面我们将讨论初始化的其他步骤:网络设备何时以及如何在内核注册网络设备如何利用网络设备数据库注册,并指派一个net_device结构的实例。net_device结构如何组织到hash表和列表,以便于做各种查询。net_device实例如何初始化,一部分由内核核心函数完成,一部分由其设备驱动程序完成。就注册而言,虚拟设备和真实设备有何差别。NIC可用之前,其相关联的net_device。
2022-11-18 14:58:06
2094
原创 Shell脚本学习指南(二)——查找与替换
文本查找——寻找含特定文本的行,文本替换——更换找到的文本。虽然你可以使用简单的固定文本字符串完成很多工作,但是正则表达式能够提供更强大的标记法,以单个表达式匹配各种实际的文本段。本章会介绍两种由不同的UNIX程序所提供的正则表达式风格,然后进一步介绍提取文本与重新编排文本的几个重要工具。正则表达式是一种表示方式,让你可以查找匹配特定准则的文本,比如,以字母a开头。此表示法让你可以写一个表达式,选定或匹配多个数据字符串。
2022-11-14 13:53:15
5456
原创 深入理解Linux网络内幕(七)——组件初始化的内核基础架构
要完全了解内核组件,不但要知道给定的一组函数在做什么,还要知道这些函数何时被启用以及由谁启用。子系统的初始化就是内核根据其模型所处理的基本任务之一。这种基础架构值得研究,有助于了解网络协议栈的关键组件是如何初始化的(包括NIC设备驱动程序在内)。我们知道传给宏的函数都用诸如__initcall之类的宏标记。因为大多数内核组件可以编译成模块或与内核静态链接,而选择之后,会改变这些宏的定义,以应用前一节所介绍的内存最优化的工作。正如在所见的一样,会根据下列符号是否定义在包含。
2022-11-13 18:29:18
667
原创 精通Git(四)——Git服务器
要使用Git与其他人协作,比如拥有一个远程Git仓库。从理论上讲,你可以直接将你的更改推送到其他人的仓库,或是从他人的仓库拉取数据。但是这种做法是不推荐的,因为如果你不小心,就会很容易搞乱别人当前的工作。而且,你希望你的协作者在你自己的计算机离线的状态下也能访问Git仓库,这时一个拥有稳定的公共仓库就显得格外重要了。所以与他人协作推荐的方法是,建立一个你们可以共同访问的中间仓库,大家都向该仓库推送数据,也都从中拉取数据。运行一个Git服务器很简单。
2022-11-05 15:45:40
2973
原创 深入理解Linux网络技术内幕(六)——PCI层和网络接口卡
内核中的PCI子系统(也称PCI层)提供各种PCI设备驱动程序共同的所有通用功能。这个子系统让程序员减少了很多必须对各种设备所做的事,让驱动程序能以更简明的方式编写,使内核更易于收集和维护有关各种设备的信息,如描述信息和统计数据。
2022-11-04 10:50:54
1355
原创 精通Git(三)——Git分支机制
几乎每个版本控制系统都支持某种形式的分支功能。分支意味着偏离开发主线并继续你自己的工作而不影响主线开发。在很多版本控制工具中,这么做存在着比较昂贵的成本,因为常常需要去对整个源代码目录进行一次复制,而对于大型项目,这种复制会耗去很长时间。而Git很好的解决了这个问题,怎么做的?看下面的博客你就懂了。相信现在你应该可以自由创建和切换到新的分支,在不同的分支之间切换,并对本地的不同分支进行合并操作。
2022-10-29 18:44:24
568
原创 深入理解Linux网络技术内幕(五)——网络设备初始化
现代操作系统的适应性增加了初始化的复杂度。首先,设备驱动程序可以作为模块加载至内核,也可以作为内核的静态组件。此外,设备可以在引导期间就存在,也可以在运行期间插入(或删除):后一种类型的设备称为可热插拔设备,如USB、PCI CardBus、IEEE 1394以及其他。我们将会看到热插拔对内核和用户空间有什么影响。
2022-10-29 15:13:56
1375
原创 深入理解Linux网络技术内幕(四)——通知链
内核的很多子系统之间具有很强的相互依赖性,因此,其中一个子系统侦测到的或者产生的事件,其他子系统可能都有兴趣。为了实现这种交互需求,Linux使用了所谓的通知链(notification chain)通知链如何声明以及网络代码定义了哪些链(chain)内核子系统如何向通知链注册内核子系统如何在链上产生通知消息。注意,通知链只在内核子系统之间使用。内核和用户空间之间的通知信息则是依赖其他机制,如上一篇博客介绍(虚拟文件系统、系统调用等等)通知链列表元素的类型是};
2022-10-22 15:57:00
1742
原创 Shell脚本学习指南(一)——入门
不过权衡之下,通常使用脚本编程还是值得的:花一个小时写成的交单脚本,同样功能用C或C++来编写,可能需要两天,而且一般来说,脚本执行的速度已经够快了,快到足以让人忽略它性能上的问题。在大型的、多用户的系统上,所列出的列表可能很长,在你能够计算用户个数之前,列表早已滚动出屏幕画面,因此每次做这件事的时候,都会让你觉得很麻烦。这展示了小型Shell脚本的典型开发周期:首先,直接在命令行上测试,然后,一旦找到能够完成工作的适当语法,再将它们放在一个独立的脚本里,并为该脚本设置执行的权限。,就是大家所熟知的位桶。
2022-10-22 15:52:56
1699
原创 深入理解Linux网络技术内幕(三)——用户空间与内核的接口
简要的介绍用户空间应用程序可用于与内核通信或读取内核输出信息的主要机制。不谈其实现细节,因为每种机制都需要一章才能说清楚。主要的目的在于给出足够的引导。通过本章你可以取得所需要的信息,了解给定目录如何添加到/proc及所在位置、处理给定ioctl命令的内核处理函数,以及目前用户空间网络配置最佳接口Netlink提供了哪些函数。本章所关注的机制,就是在谈到用户空间配置命令(如ifconfig和route)及内核处理函数(应用所请求的配置)两者的接口。下一部分将围绕系统初始化进行学习和分析。
2022-10-15 16:35:29
1185
原创 精通Git(二)——Git基础
现在你就可以完成所有基本的Git本地操作了:创建或克隆仓库、做出更改、暂存并提交更改,以及查看仓库的变更历史。分支模型。
2022-10-07 21:12:31
1917
原创 深入理解Linux网络技术内幕(二)——关键数据结构
Linux网络代码中有些关键数据结构随处可见。在阅读本书以及直接研究源码时,必须了解这些数据结构里的字段。当然,逐一研究这些数据结构的字段比起解析函数更加乏味,但这是很重要的基础。传奇软件工程师Frederick P.Broooks曾说过:“给我看你的数据”本章介绍下列数据结构,同时说明操作这些数据结构的一些函数和宏。一个封包就存储在这里。所有网络分层都会使用这个结构来存储其报头、有关用户数据的信息(有效载荷),以及用来协调其工作的其他内部信息。
2022-09-24 17:33:16
1561
3
嵌入式入门四——SysTick定时器
2021-11-21
嵌入式入门三——中断系统
2021-11-21
嵌入式入门基础二——时钟系统
2021-11-21
嵌入式网关开发学习路线和方法?
2022-06-15
进程可以从运行态直接到就绪态吗?
2021-10-04
Linux下有0号进程吗?
2021-10-04
C语言中,拷贝图片可以使用标准块IO吗?
2021-09-29
函数返回值类型为指针,出现段错误。
2021-09-12
为什么我定义了一个结构体指针,进行了p=&stu操作,提示我段错误呢?
2021-09-11
为什么当我把数组a存满,这个程序运行结果就会出错
2021-09-09
TA创建的收藏夹 TA关注的收藏夹
TA关注的人