Linux 操作系统
文章平均质量分 95
扎根底层,深入到 Linux 操作系统最核心的地方去学习、理解。
IOT物联网小镇
公众号:【IOT物联网小镇】。
道哥,十多年的嵌入式开发老兵。擅长用通俗的语言、简洁的代码,一步一步的剖析C/C++、Linux操作系统、应用程序设计、物联网、单片机和嵌入式平台的底层思考过程。
坚持原创,厚积薄发、换位思考,以读者的角度来总结文章。每一篇输出,不仅仅是干货的呈现,更是引导你一步一步的深入思考,从底层逻辑来提升自己。
展开
-
哨兵节点:思想简单,效果很棒的的编程算法
所谓的哨兵,就是一个标志,一个与查找目标对象一样的操作对象。原创 2022-06-12 21:52:35 · 801 阅读 · 1 评论 -
C语言:如何给全局变量起一个别名?
所谓的变量别名,就是通过通过不同的标识符,来表示同一个变量。我们知道,变量名称是给程序员使用的。原创 2022-06-12 21:51:10 · 1641 阅读 · 0 评论 -
【图片+代码】:GCC 链接过程中的【重定位】过程分析.md
文章目录示例代码sub.o 文件内容分析段信息符号表信息main.o 文件分析段信息符号表信息绝对寻址相对寻址重定位表信息可执行程序 main段信息符号表信息绝对地址重定位相对地址重定位总结别人的经验,我们的阶梯!最近因为项目上的需要,利用动态链接库来实现一个插件系统,顺便就复习了一下关于Linux中一些编译、链接相关的内容。在链接的过程中,符号重定位是比较麻烦的事情,特别是在动态链接的过程中,因为需要考虑到很多不同的情况。这篇文章作为第一篇,先来聊一聊静态链接中的重定位过程。按照惯例,还是以原创 2022-03-17 20:27:20 · 3665 阅读 · 0 评论 -
Linux驱动实践:中断处理中的【工作队列】 workqueue 是什么鬼?
文章目录工作队列的特点驱动程序示例代码全貌Makefile 文件编译、测试别人的经验,我们的阶梯!大家好,我是道哥,今天我为大伙儿解说的技术知识点是:【中断处理中的下半部分机制-工作队列】。在刚开始介绍中断处理的时候,曾经贴出下面这张图:图中描述了中断处理中的下半部分都有哪些机制,以及如何根据实际的业务场景、限制条件来进行选择。可以看出:这些不同的实现之间,有些是重复的,或者是相互取代的关系。也正因为此,它们之间的使用方式几乎是大同小异,至少是在API接口函数的使用方式上,从使用这的角度来看,原创 2022-01-10 20:39:12 · 1071 阅读 · 0 评论 -
Linux驱动实践:一起来梳理中断的前世今生(附代码)
文章目录Linux 中断的知识点梳理中断的分类中断号和中断向量中断服务例程 ISR中断处理的注册和注销 API实操:捕获键盘中断示例代码向驱动程序传参IO地址:IO端口和IO内存统一编制独立编址编译、验证别人的经验,我们的阶梯!大家好,我是道哥,今天我为大伙儿解说的技术知识点是:【Linux 中断的注册和处理】。在前两篇文章中,描述的是在应用层如何调用驱动函数来控制GPIO,以及在驱动中如何发送发送信号给应用层。假如存在这样一个需求:应用程序需要监控某个硬件GPIO口的电平状态,当发生变化时,应用程原创 2021-12-18 08:08:38 · 1135 阅读 · 0 评论 -
Linux驱动实践:驱动程序如何发送【信号】给应用程序?
作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++、嵌入式、Linux。关注下方公众号,回复【书籍】,获取 Linux、嵌入式领域经典书籍;回复【PDF】,获取所有原创文章( PDF 格式)。文章目录kill 命令和信号使用 kill 命令发送信号多线程中的信号信号注册和处理函数驱动程序代码示例:发送信号功能需求驱动程序驱动模块 Makefile编译驱动模块加载驱动模块应用程序代码示例:接收信号注册信号处理函数别人的经验,我们的阶梯!大家好,我是道哥,今天我为大伙儿解说的技术知识点是:【.原创 2021-12-15 08:08:52 · 1360 阅读 · 1 评论 -
Linux驱动实践:如何编写【 GPIO 】设备的驱动程序?
作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++、嵌入式、Linux。关注下方公众号,回复【书籍】,获取 Linux、嵌入式领域经典书籍;回复【PDF】,获取所有原创文章( PDF 格式)。文章目录示例程序目标编写驱动程序创建驱动目录和驱动程序创建 Makefile 文件编译驱动模块加载驱动模块设备节点应用程序卸载驱动模块别人的经验,我们的阶梯!大家好,我是道哥。在前几篇文章中,我们一块讨论了:在 Linux 系统中,编写字符设备驱动程序的基本框架,主要是从代码流程和 API 函数这.原创 2021-12-07 08:11:09 · 3303 阅读 · 0 评论 -
黑客级别的文章:把动态库的内存操作玩出了新花样
作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++、嵌入式、Linux。关注,回复【书籍】,获取 Linux、嵌入式领域经典书籍;回复【PDF】,获取所有原创文章( PDF 格式)。 目录 文章目录理论与实践开始新的动态库面临的问题怎么做?ELF概述ELF 文件头SHT(section header table)PHT(program header table)连接视图(Linking View)和执行视图(Execution View).dynamic section动态链接器(li.原创 2021-11-02 08:33:36 · 941 阅读 · 0 评论 -
多线程异步日志系统,高效、强悍的实现方式-双缓冲
作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++、嵌入式、Linux。 目录 文章目录单片机中常用的环形缓冲区多线程异步日志:双缓冲机制双缓冲机制为什么高效尽可能的降低 Lock 的时间参考代码可以继续优化的地方别人的经验,我们的阶梯!大家好,我是道哥,今天我为大伙儿解说的技术知识点是:【在多线程环境下,如何实现一个高效的日志系统】。在很久之前,曾经写过一篇文章《【最佳实践】生产者和消费者模式中的双缓冲技术》,讨论了:在一个产品级的日志系统中,如何利用双缓冲机制来解决生产者-消费.原创 2021-11-01 08:31:43 · 1422 阅读 · 0 评论 -
Linux从头学16:操作系统在加载应用程序时,是如何把【页目录和页表】当做普通物理页进行操作的?
作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++、嵌入式、Linux。 目录 文章目录问题描述处理器接收的是线性地址,不是物理地址对页目录进行操作一级查表:构造线性地址的前 10 位,来确定页表的物理地址二级查表:构造线性地址的中间 10 位,来确定“普通页”的物理地址三级查表:构造线性地址的最后 12 位,来确定页“普通页”的页内偏移量三个地址段合体对页表进行操作一级查表二级查表三级查表在 x86 系统中,内存管理中的分页机制是非常重要的,在Linux操作系统相关的各种书籍中,这部分内.原创 2021-10-19 09:04:16 · 824 阅读 · 0 评论 -
Linux从头学15:【页目录和页表】-理论 + 实例 + 图文的最完全、最接地气详解
作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++、嵌入式、Linux。文章目录页表的拆分过程页目录结构几个相关的寄存器加载用户程序时: 页目录、页表的分配和填充过程线性地址到物理地址的查找、计算实例在x86系统中,为了能够更加充分、灵活的使用物理内存,把物理内存按照4KB的单位进行分页。然后通过中间的映射表,把连续的虚拟内存空间,映射到离散的物理内存空间。映射表中的每一个表项,都指向一个物理页的开始地址。但是这样的映射表有一个明显的缺点:映射表自身也是需保存在物理内存中的。在 32.原创 2021-10-11 08:39:45 · 2798 阅读 · 0 评论 -
【分页机制】-看了这篇文章还没彻底搞懂?我自罚三杯!
目录 文章目录分段存储的坏处物理内存的管理映射表一个线性地址的寻址过程终于开始介绍分页机制了,作为一名 Linuxer,大名鼎鼎的分页机制必须要彻底搞懂!我就尽自己的最大努力,正确把我理解的分页机制,用图文形式彻底分解,希望对您有所帮助!一共分 3 篇文章:这篇文章主要介绍单映射表;下一篇介绍两级映射(页目录和页表);最后一篇介绍对映射表自身的操作。分段存储的坏处在之前的文章中,我们多次描写了一个段描述符的结构,其中就包括段的开始地址、界限和各种段的属性。经过分段处理单元的权限.原创 2021-09-30 08:35:58 · 1022 阅读 · 0 评论 -
Linux从头学13:想彻底搞懂“系统调用”的底层原理?建议您别错过这篇【调用门】
作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++、嵌入式、Linux。 目录 文章目录门描述符调用门特权级检查规则调用门的使用过程安装调用门把调用门的选择子告诉用户程序用户程序通过调用门进入系统函数栈的切换在之前的文章中Linux从头学10:三级跳过程详解-从 bootloader 到 操作系统,再到应用程序,由于当时没有引入特权级的概念,用户程序和操作系统都工作在相同的特权级,因此可以直接通过[段选择子:偏移量] 的方式,来调用属于操作系统代码段中的函数,如下所示:用户程序head.原创 2021-09-22 08:17:08 · 962 阅读 · 0 评论 -
Linux从头学12:读完这篇【特权级】文章,你就比别人更“精通”操作系统!
作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++、嵌入式、Linux。【IOT物联网小镇】 目录 文章目录CPL:当前特权级DPL:描述符特权级RPL:请求者特权级特权级检查规则代码段的特权级检查数据段的特权级检查栈段的特权级检查x86 处理器中,提供了4个特权级别:0,1,2,3。数字越小,特权级别越高!一般来说,操作系统是的重要性、可靠性是最高的,需要运行在0 特权级;应用程序工作在最上层,来源广泛、可靠性最低,工作在3 特权级别。中间的1 和 2两个特权级别,一般很少使用.原创 2021-09-16 08:39:24 · 862 阅读 · 0 评论 -
Linux从头学11:理解了这三个概念,才能彻底理解任务管理和任务切换
作 者:道哥,10+年的嵌入式开发老兵。转 载:欢迎转载文章,转载需注明出处。文章目录LDT:局部描述符表TSS: 任务状态段TCB: 任务控制块x86 系统中的保护模式,给系统的安全性提供了很大的保障,但是在我们之前的文章中,一直都淡化了特权级别这个概念。例如:在保护模式下的段选择器,我们一直都只把它看做一个段描述符的"索引号",用来在 GDT (全局描述描述符表) 中查找一个段描述符,例如:图中:代码段寄存器中的索引号是 4 ,GDT 中每一个表项占用 4 个字节,于是就在偏移量为 .原创 2021-09-09 08:21:12 · 837 阅读 · 0 评论 -
Linux从头学10:三级跳过程详解-从 bootloader 到 操作系统,再到应用程序
作 者:道哥,10+年的嵌入式开发老兵。转 载:欢迎转载文章,转载需注明出处。文章目录bootloader 跳转到操作系统操作系统的 header 布局建立操作系统的三个段描述符操作系统跳转到应用程序应用程序调用操作系统中的函数不论是在 x86 平台上,还是在嵌入式平台上,系统的启动一般都经历了 bootloader 到 操作系统,再到应用程序,这样的三级跳过程。每一个相互交接的过程,都是我们学习的重点。这篇文章,我们仍然以 x86 平台为例,一起来看一下:从上电之后,系统是如何一步一步的.原创 2021-09-03 08:18:38 · 934 阅读 · 0 评论 -
Linux从头学09:x86 处理器如何进行-层层的内存保护?
作 者:道哥,10+年的嵌入式开发老兵。转 载:欢迎转载文章,转载需注明出处。文章目录实模式:bootloader 为程序计算段的基地址保护模式:bootloader 为自己创建段描述符确定 GDT 的地址创建代码段描述符创建数据段描述符创建栈段描述符段描述符是如何确保段的安全访问的?段寄存器高速缓存对段寄存器本身的保护对段界限的检查在上一篇文章中,我们已经顺利的从实模式,过渡到了保护模式。保护模式与实模式最本质的区别就是:保护模式使用了全局描述符表,用来保存每一个程序(bootloader.原创 2021-08-30 08:28:40 · 856 阅读 · 0 评论 -
Linux从头学08:Linux 是如何保护内核代码的?【从实模式到保护模式】
作 者:道哥,10+年的嵌入式开发老兵。转 载:欢迎转载文章,转载需注明出处。文章目录从 16 位进入到 32 位8086 的 16 位模式80386 的 32 位模式从实模式进入到保护模式如何进入保护模式GDT 全局描述符表GDTR 全局描述符表寄存器段描述符的查找原理在之前的 7 篇文章中,我们一直学习的是最原始的 8086 处理器中的最底层的基本原理,重点是内存的寻址方式。也就是:CPU 是如何通过[段地址:偏移地址],来对内存进行寻址的。不知道你是否发现了一个问题:所有的程序都可.原创 2021-08-25 21:32:56 · 1066 阅读 · 0 评论 -
Linux从头学07:中断那么重要,它的本质到底是什么?
文章目录中断向量与中断描述符中断的分类内部中断外部中断中断号中断向量和中断处理程序中断向量的本质中断处理程序的安装中断现场的保护和恢复总结:中断的本质在软件开发中,中断是一个绕不开的重要话题,但是,不知道您是否遇到过这样的困惑:很多书籍、文章在介绍中断相关的知识点时,说的都挺有道理。这篇文章对中断的讲解很正确,那篇文章在描述中断的时候也挺对的,但是,这两篇文章中,怎么有些内容是矛盾的啊?!单独看任何一篇文章感觉都有道理,看的越多,反而越迷糊?好比在森林里迷路了,如果只有一个指南针,肯定能走出来。原创 2021-08-17 08:23:03 · 853 阅读 · 0 评论 -
Linux从头学06:16张结构图,彻底理解【代码重定位】的底层原理
作 者:道哥,10+年的嵌入式开发老兵。转 载:欢迎转载文章,转载需注明出处。文章目录程序的结构1. 程序头(Header)的描述信息2. 关于汇编地址bootloader 把程序从硬盘读取到内存1. 读取到内存中的什么位置?2. bootloader 设置数据段基地址3. bootloader 读取所有扇区4. 如果程序文件超过 64 KB 怎么办?代码重定位程序入口点重定位段表重定位跳转到程序的入口地址操作系统程序的执行在上一篇文章中Linux从头学05-系统启动过程中的几个神秘地址,你知.原创 2021-08-11 10:14:50 · 977 阅读 · 0 评论 -
Linux从头学05-系统启动过程中的几个神秘地址,你知道是什么意思吗?
作 者:道哥,10+年的嵌入式开发老兵。转 载:欢迎转载文章,转载需注明出处。文章目录0xFFFF:0x00000xF000:0xE05B0x0000:0x7C00在第一篇文章中,我们就提到,现代操作系统是从最古老的 8086 系统一步一步发展而来的。处理器厂商为了向后兼容,很多底层相关的原理都是一样的(如果不兼容,就会丢弃市场份额)。特别是从系统上电之后,一直到操作系统中第一个进程(Linux 下就是 init 进程)运行起来,这其中经历了 BIOS、引导程序、操作系统这三元大将的接力跑.原创 2021-08-03 09:37:49 · 1829 阅读 · 0 评论 -
所有编程语言中的栈操作,底层原理都在这里
作 者:道哥,10+年的嵌入式开发老兵。公众号:专注于:C/C++、Linux操作系统、应用程序设计、物联网、单片机和嵌入式开发等领域。转 载:欢迎转载文章,转载需注明出处。文章目录示例代码说明执行主程序初始状态执行代码前 5 句准备调用子程序1. call 的指令码和汇编代码2. 栈空间的数据调用子程序1. 寄存器的值2. 栈空间的数据子程序保护使用到的寄存器1. push bx2. push cx3. 计算字符串的长度4. 把字符串长度告诉主程序5. pop cx6. pop bx7. 返.原创 2021-07-30 08:28:02 · 965 阅读 · 0 评论 -
Linux从头学03:如何告诉 CPU,代码段、数据段、栈段在内存中什么位置?
作 者:道哥,10+年的嵌入式开发老兵。专注于:C/C++、Linux操作系统、应用程序设计、物联网、单片机和嵌入式开发等领域。 公众号回复【书籍】,获取 Linux、嵌入式领域经典书籍。转 载:欢迎转载文章,转载需注明出处。文章目录几个重要的段寄存器Linux 2.6 中的线性地址区间一个“完整”的 8086 汇编程序前两篇文章,我们一起学习了 8086 处理器中关于 CPU、内存的基本使用方式,重点对段寄存器和内存的寻址方式进行了介绍。可能有些小伙伴会对此不屑:现在都是多核的现代处理.原创 2021-07-15 08:15:11 · 1669 阅读 · 0 评论 -
Linux从头学02:x86中内存【段寻址】方式的来龙去脉
作 者:道哥,10+年的嵌入式开发老兵。公众号:【IOT物联网小镇】,专注于:C/C++、Linux操作系统、应用程序设计、物联网、单片机和嵌入式开发等领域。 公众号回复【书籍】,获取 Linux、嵌入式领域经典书籍。转 载:欢迎转载文章,转载需注明出处。文章目录什么是代码段?什么是数据段?数据的类型和长度寻址范围栈实模式和保护模式Linux 中的分段策略饭是一口一口的吃,计算机也是一步一步的发展,例如下面这张英特尔公司的 CPU 型号历史:为了利用性能越来越强悍的计算机,操作系统的..原创 2021-07-08 08:15:53 · 1472 阅读 · 3 评论 -
Linux 从头学 01:CPU 是如何执行一条指令的?
作 者:道哥,10+年的嵌入式开发老兵。公众号:【IOT物联网小镇】,专注于:C/C++、Linux操作系统、应用程序设计、物联网、单片机和嵌入式开发等领域。 公众号回复【书籍】,获取 Linux、嵌入式领域经典书籍。转 载:欢迎转载文章,转载需注明出处。文章目录【Linux 从头学】是什么古老的 Intel8086 处理器主存储器是什么?寄存器是什么?三个总线CPU 如何对内存进行寻址?我们是如何控制 CPU 的?CPU 执行指令流程【Linux 从头学】是什么这两年多以来,我的本职..原创 2021-07-02 08:22:43 · 2111 阅读 · 25 评论 -
一次脑残的记录: Linux 中实时任务调度与优先级
背景知识:Linux 调度策略关于进程的调度策略,不同的操作系统有不同的整体目标,因此调度算法也就各不相同。这需要根据进程的类型(计算密集型?IO密集型?)、优先级等因素来进行选择。对于 Linux x86 平台来说,一般采用的是 CFS:完全公平调度算法。之所以叫做完全公平,是因为操作系统以每个线程占用 CPU 的比率来进行动态的计算,操作系统希望每一个进程都能够平均的使用 CPU 这个资源,雨露均沾。我们在创建一个线程的时候,默认就是这个调度算法 SCHED_OTHER,默认的优...原创 2021-06-16 09:49:55 · 1616 阅读 · 0 评论 -
Linux系统中编译、链接的基石-ELF文件:扒开它的层层外衣,从字节码的粒度来探索
初次见面大家好,我是 ELF 文件,大名叫 Executable and Linkable Format。经常在 Linux 系统中开发的小伙伴们,对于我肯定是再熟悉不过了,特别是那些需要了解编译、链接的家伙们,估计已经把我研究的透透的。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eqQKroRf-1622162986560)(http://iottown.sewain100.cn/iot523_fun_look.png)]为了结识更多的小伙伴,今天呢,就是..原创 2021-05-28 08:51:28 · 982 阅读 · 0 评论 -
关于二进制表示和补码计算的来龙去脉,入门看了秒懂
文章目录一、前言二、从十进制到二进制1. 十进制2. 二进制3. 扩展到十六进制4. 扩展到任意进制三、从十进制加法到二进制加法1. 十进制加法2. 二进制加法3. 十六进制加法四、把负数计算转换成正数计算1. 原码2. 把负数计算变成正数计算3. 新问题:如何表示0?4. 补码的计算五、总结一、前言计算机最喜欢的数字就是 0 和 1,在 CPU 的世界中,它只认识这两个数字,即使是强大的操作系统,也都是由 0 和 1 组成的。作为一名软件开发者,入门学习的内容可能就是认识这 2 个既简单、又强大的数原创 2021-04-08 09:35:49 · 928 阅读 · 0 评论