学习总结
文章平均质量分 92
溯源守拙
这个作者很懒,什么都没留下…
展开
-
深入理解Linux内核(学习笔记)_第八章内存管理
RAM的某些部分永久地分配给内核,并用来存放内核代码以及静态内核数据结构。RAM的其余部分称为动态内存,这不仅是进程所需的宝贵资源,也是内核本身所需的宝贵资源,实际上,整个系统的性能取决于如何有效地管理动态内存。一.页框管理...原创 2020-11-15 22:13:19 · 178 阅读 · 0 评论 -
深入理解Linux内核(学习笔记)_第七章进程调度
Linux与任何分时系统一样,通过一个进程到另一个进程的快速切换,达到表明上看来多个进程同时执行的神奇效果。原创 2020-11-15 17:42:07 · 147 阅读 · 0 评论 -
深入理解Linux内核(学习笔记)_第六章定时测量
Linux内核必需完成两种主要的定时测量,我们可以对此加以区分:(1)保存当前的时间和日期,以便能通过time()、ftime()和gettimeofday()系统调用把它们返回给用户程序,也可以由内核本身把当前时间作为文件和网络包的时间戳;(2)维持定时器,这种机制能够告诉内核或用户程序某一时间间隔已经过去了。定时测量是基于固定频率振荡器和计数器的几个硬件电路完成的。一.时钟和定时器电路...原创 2020-11-14 19:54:45 · 146 阅读 · 0 评论 -
深入理解Linux内核(学习笔记)_第五章内核同步
可以把内核看作是请求进行响应的服务器,这些请求可能来自在CPU上执行的进程,也可能来自发出中断请求的外部设备。这些请求可能引起竞争条件,因此需要采用适当的同步机制对这种情况进行控制。一.内核如何为不同的请求提供服务...原创 2020-10-24 21:46:27 · 178 阅读 · 0 评论 -
深入理解Linux内核(学习笔记)_第四章中断和异常
中断通常被定义为一个事件,该事件改变处理器执行的指令顺序,这样的事件与CPU芯片内外硬件电路产生的电信号相对应。中断通常分为同步中断和异步中断:1)同步中断是当指令执行时由CPU控制单元产生的,之所以称为同步,是因为只有在一条指令终止执行后CPU才会发出中断;2)异步中断是由其他硬件设备依照CPU时钟信号随机产生的。 中断是由间隔定时器和I/O设备产生的。异常是由程序错误产生的,或者是由内核必须处理的异常条件产生的。一.中断信号的作用...原创 2020-10-11 16:42:57 · 228 阅读 · 0 评论 -
深入理解Linux内核(学习笔记)_第三章进程
进程是任何多道程序设计的操作系统中的基本概念。通常把进程定义为程序执行的一个实例。在Linux源代码中,常把进程称为任务(task)或线程(thread)。一.进程、轻量级进程和线程二.进程描述符...原创 2020-09-26 23:16:01 · 222 阅读 · 0 评论 -
深入理解Linux内核(学习笔记)_第二章内存寻址
值得庆幸的是,操作系统自身不必完全了解物理内存,如今的微处理器包括的硬件线路使内存管理既高效又健壮,所以编程错误就不会对该程序之外的内存产生非法访问。本章将详述80x86微处理器怎么进行芯片级的内存寻址。一.内存寻址程序员偶尔会引用内存地址作为访问内存单元内容的一种方式,但是,当使用80x86微处理器时,必须区分以下三种不同的地址:逻辑地址:包含在机器语言指令中用来指定一个操作数或一条指令的地址。每个逻辑地址都由一个段和偏移量组成,偏移量指明了从段开始的地方到实际地址之间的距离。 线性地址(虚原创 2020-09-20 21:12:00 · 224 阅读 · 0 评论 -
深入理解LINUX内核(学习笔记)_第一章绪论
Linux与其他类Unix内核的比较:单块结构的内核:它是一个庞大、复杂的自我完善程序,由几个逻辑上独立的成分构成。 编译并静态链接的传统Unix内核:大部分现代操作系统内核可以动态地装载和卸载部分内核代码(典型的例子如设备驱动程序),通过把这部分代码称做模块(module)。Linux对模块的支持是很好的,因为它能自动按需装载或卸载模块。 内核线程:一些Unix内核,被组织成一组内核线程(kernel thread)。内核线程是一个能被独立调度的执行环境(context);也许它与用户程序有关,也原创 2020-09-13 00:23:58 · 216 阅读 · 0 评论 -
C专家编程(学习笔记)_第11章 你懂得C,所以C++不在话下
1.初识OOP原创 2020-08-18 22:53:14 · 384 阅读 · 0 评论 -
C专家编程(学习笔记)_第10章 再论指针
1.多维数组的内存布局原创 2020-08-16 18:28:43 · 219 阅读 · 0 评论 -
C专家编程(学习笔记)_第9章 再论数组
1.什么时候数组与指针相同声明本身还可以进一步分成3种情况:1.外部数组的声明;2.数组的定义(定义是声明的一种特殊情况,它分配内存空间,并可能提供一个初始值);3.函数参数的声明;所有作为函数参数的数组名总是可以通过编译器转换为指针。对于编译器而言,一个数组就是一个地址,一个指针就是一个地址的地址。 extern,如extern char a[];不能改写成指针形式 声明 —————————↗→定义,如ch原创 2020-08-16 00:16:42 · 169 阅读 · 0 评论 -
C专家编程(学习笔记)_第8章 为什么程序员无法分清万圣节和圣诞节
1.Portzebie度量衡系统 关于程序员无法分清万圣节和圣诞节的笑话也依赖于编号系统的内部知识。程序员无法分清万圣节和圣诞节的原因是八进制的31等于十进制的25,也就是说10月30日等于12月25日。2.根据位模式构筑图图形 图标(icon)或者图形(glyph)是一种小型的位模式映射于屏幕产生的图像。一个位代表图像上的一个像素,如果一个位被设置,那么它代表的像素就是“亮”的,如果一个位被清除,那么它所代表的像素就是“暗”的。3.在等待时类型发生变化 ...原创 2020-08-13 00:06:37 · 395 阅读 · 0 评论 -
C专家编程(学习笔记)_第7章 对内存的思考
1.Intel 80x86系列 4004(4位)—>8008(8位)—>8080(8位)—>8085(8位)—>8086(16位)—>80186(16位)—>80286(32位)—>80386(32位)—>80486(32位)—>Pentium(32位)—>P6 64位?——>......2.Intel 80x86内存模型以及它的工作原理在UNIX中,段就是一块以二进制形式出现的相关内容。在Intel 80x86内存模...原创 2020-08-10 00:19:01 · 192 阅读 · 0 评论 -
C专家编程(学习笔记)_第6章 运动的诗章:运行时数据结构
编程语言理论的经典对立之一就是代码和数据的区别,有的语言把两者视为一体,其他语言(例如C语言)通常维持两者的区别。代码和数据的区别也可以认为是编译时和运行时的分界线。编译器的绝大部分工作都是跟翻译代码有关;必要的数据存储管理的绝大部分都在运行时进行。 学习运行时系统,主要有3个理由:(1)它有助于优化代码,获得最佳的效率;(2)它有助于理解更高级的材料;(3)当陷入麻烦时,它可以使分析问题更加容易。1.a.out及其传说 a.out -汇编程序和链接编辑输出...原创 2020-08-07 00:24:15 · 247 阅读 · 0 评论 -
C专家编程(学习笔记)_第5章 对链接的思考
1.函数库、链接和载入 链接器的基础知识:编译器创建一个输出文件,这个文件包含了可重定位的对象,这些对象就是与源程序对应的数据和机器指令。编译器驱动器:预处理器——>语法和语义检查器——>代码生成器——>汇编程序——>优化器——>链接器;驱动器程序。2.动态链接的优点 可执行文件的体积可以非常小,虽然运行速度稍慢一些,但动态链接能够更加有效地利用磁盘空间,而且链接器-编辑阶段的时间也会缩短(因为链接器的有些工作被推迟到载入时)。...原创 2020-08-02 21:50:38 · 238 阅读 · 0 评论 -
C专家编程(学习笔记)_第4章 令人震惊的事实:数组和指针并不相同
1.数组并非指针 本章将完整地解释数组什么时候等同于指针,什么时候又不等同于指针及原因所在。2.我的代码为什么无法运行文件1:int mango[100];文件2:extern int *mango; 对数组的引用总是可以写成对指针的引用,而且确实存在一种指针和数组定义完全相同的上下文环境。不幸的是,这只是数组的一种极其普通的用法,并非所有情况下都是如此。但是,人们却自然而然地归纳并假定在所有的情况下数组和指针都是等同的,包括上面完全错误的“数组定义等同于指针...原创 2020-07-19 13:20:30 · 190 阅读 · 0 评论 -
Linux设备驱动开发(学习笔记)_第一章 Linux设备驱动概述及开发环境构建
在嵌入式系统的设计中,LED一般直接由CPU的GPIO(通用可编程I/O)口控制。GPIO一般由两组寄存器控制,即一组控制寄存器和一组数据寄存器。屏蔽具体 CPU 的差异,假设在 GPIO_REG_CTRL 物理地址中控制寄存器处的第 n 位写入 1 可设置 GPIO 口为输出,在地址 GPIO_REG_DATA 物理地址中数据寄存器的第 n 位写入 1 或 0 可在引脚上产生高或低电平,则在无操作系统的情况下,设备驱动代码如下://无操作系统时的LED驱动#define reg_gpio_c原创 2020-07-29 22:50:18 · 177 阅读 · 0 评论 -
C专家编程(学习笔记)_第3章 分析C语言的声明
1.只有编译器才会喜欢的语法 “声明的形式和使用的形式相似”这种用法可能是C语言的独创,其它语言并没有采取这种方法。C语言的声明所存在的最大问题是你无法以一种人们所习惯的自然方式从左向右阅读一个声明,在ANSI C引入volatile和const关键字后,情况就更糟糕。2.声明是如何形成的 声明器——它是所有声明的核心。简单的说,声明器就是标识符以及与它组合在一起的任何指针、函数括号、数组下标等。 函数的返回值不能是一个函数,所以像foo()()这样是...原创 2020-07-08 00:12:01 · 501 阅读 · 0 评论 -
C专家编程(学习笔记)_第2章 这不是Bug,而是语言特性
1.这关语言特性何事 分析编程语言缺陷的一种方法就是把所有缺陷归于3类:不该做的做了(多做之过);该做的没做(少做之过);该做但做得不合适(误做之过)。 一个‘L’的NUL和两个‘L’的NULL——牢记下面的话,它有助于回忆指针和ASCII零码的正确术语:一个‘L’的NUL用于结束一个ACSII字符串;两个‘L’的NULL用于表示什么也不指向(空指针)。2.多做之过 “多做之过”,就是语言中存在某些不应该存在的特性。这些特性包括容易出错的switch语...原创 2020-07-05 22:28:22 · 349 阅读 · 0 评论 -
C专家编程(学习笔记)_第1章 C:穿越时空的迷雾
C诡异离奇,缺陷重重,却获得了巨大的成功——Dennis Ritchie1.C语言的史前阶段 C语言的产生竟然源于一个失败的项目,1969年——Multics工程。 编译器设计者的金科玉律:效率(几乎)就是一切。编译器的效率包括两个方面:运行效率(代码的运行速度)和编译速度(产生可执行代码的速度)。除了一些开发和学习环境之外,运行效率起决定性作用。2.C语言的早期体验 根据编译器设计者的思路而发展形成的语言特性:1)数组下标从0而不是1开...原创 2020-07-05 01:11:03 · 212 阅读 · 0 评论 -
C和指针(学习笔记)_第10章 结构和联合
1.结构基础知识原创 2020-07-02 00:12:11 · 202 阅读 · 0 评论 -
C和指针(学习笔记)_第9章 字符串、字符和字节
1.字符串基础原创 2020-07-01 00:03:15 · 197 阅读 · 0 评论 -
C和指针(学习笔记)_第8章 数组
1.一维数组 1)数组名:原创 2020-07-04 20:18:35 · 235 阅读 · 0 评论 -
C和指针(学习笔记)_第7章 函数
1.函数定义原创 2020-06-23 23:45:27 · 240 阅读 · 0 评论 -
C和指针(学习笔记)_第6章 指针
1.内存和地址 计算机的内存由数以亿计的位(bit)组成,每个位可以容纳值0或1。每个字节(byte)包含8个位,为了存储更大的值,把两个或更多个字节合在一起作为一个更大的内存单位。许多机器以字为单位存储整数,每个字一般由2个或4个字节组成。注意,尽管一个字包含了4个字节,它仍然只有一个地址,至少它的地址是它最左边那个字节的位置还是最右边那个字节的位置,不同的机器有不同的规定。另一个需要注意的硬件事项是边界对齐。对于C程序员,只需对:1)内存中的每个位置由一个独一无二的地址标识;2)内存中...原创 2020-06-23 00:26:48 · 268 阅读 · 0 评论 -
C和指针(学习笔记)_第5章 操作符合表达式
C被许多人诟病的一个缺点就是它品种繁多的操作符,同时也正是许多操作符具有其他语言的操作符无法抗衡的价值,这也是C适用于开发范围极广的应用程序的原因之一。1.操作符 1)算术操作符: + - * / %; 2)移位操作符:左移位操作符<<,右移位操作符>>; 3)位操作符:与(&)、或(|)、异或(^); 4)赋值:复合赋值符 +=、-=、*=、/=、%=、<<=、>&g...原创 2020-06-22 23:06:19 · 241 阅读 · 0 评论 -
C和指针(学习笔记)_第4章 语句
1.空语句 C最简单的语句就是空语句,它本身只包含一个分号。2.表达式语句 赋值操作,"副作用"。3.代码块 代码块就是位于一对花括号之内的可选的声明和语句列表。4.if语句 C语言的if语句与其他语言的if语句相差不大。5.while语句 C的while语句也和其他语言的while语句有许多相似之处,唯一真正存在差别的地方就是它的expression部分。 1)break语句:在while循环...原创 2020-06-21 23:29:50 · 186 阅读 · 0 评论 -
C和指针(学习笔记)_第3章 数据
本章描述数据的各种类型,描述它的特点以及如何声明它,还将描述变量的三个属性——作用域、链接属性和存储类型。1.基本数据类型 C语言中仅有四种基本数据类型——整型、浮点型、指针和聚合类型(如数组和结构等)。 1)整型家族:字符、短整型、整型和长整型,它们都分为有符号和无符号两种版本。规定整型值相互之间大小的规则很简单——长整型至少应该和整型一样长,而整型至少应该和短整型一样长。 整型字面值 & 枚举类型。 2)指针:指针可以有效地实现诸如tree和list...原创 2020-06-21 21:59:19 · 767 阅读 · 0 评论 -
C和指针(学习笔记)_第2章 基本概念
1.环境 在ANSI C的任何一种实现中,存在不同的环境。第一种是翻译环境__在这个环境里,源代码被转换为可执行的机器指令。第二种是执行环境__它用于实际执行代码。 1)翻译:翻译阶段由几个步骤组成,组成一个程序的每个(有可能多个)源文件通过编译过程分别转换为目标代码。然后各个目标文件由链接器(linker)捆绑在一起,形成一个单一而完整的可执行程序。链接器同时也会引入标准C函数库中任何被执行该程序所用到的函数,而且它也可以搜索程序个人的程序库,将其中需要使用的函数也链接到程序中...原创 2020-06-21 11:21:52 · 208 阅读 · 0 评论 -
C和指针(学习笔记)_第1章 快速上手
1.简介 1)空白和注释 2)预处理指令 3)main函数 4)read_column_numbers函数 5)rearrange函数2.补充说明 putchar与getchar函数,strcpy与strncpy函数,strcat和strchr函数。3.编译 你编译和运行C程序的方法取决于你所使用的系统类型。4.警告的总结 1)在scanf函数的标量参数未添加&...原创 2020-06-21 10:15:58 · 199 阅读 · 0 评论 -
C和指针(学习笔记)_第18章 运行时环境
1.判断运行时环境 第一步骤是从你的编译器获得一个汇编语言代码列表。 1)测试程序 2)静态变量和初始化 3)堆栈帧 一个函数分成三个部分:函数序、函数体、函数跋。 4)寄存器变量 5)外部标识符的长度 6)判断堆栈帧布局 运行时堆栈保存了每个函数运行时所需要的数据,包括它的自动变量和返回地址。 a.传递函数参数 b.函数序 c.堆栈中的参数次序 d.最终的堆栈帧布局 e.函数跋 f.返回值 g.表达式的副作用2.原创 2020-06-21 00:54:37 · 299 阅读 · 1 评论 -
C和指针(学习笔记)_第17章 经典抽象数据类型
1.内存分配 所有的ADT(抽象数据类型)都必须确定意见事情--如何获取内存来存储值。有三种可选的方案:静态数组、动态分配的数组和动态分配的链式结构。静态数组要求结构的长度固定,而且这个长度必须在编译时确定,但这个方案最为简单且最不容易出错;动态分配需要在增加的复杂性和随之产生的灵活性之间作一番权衡;链式结构提供了最大程度的灵活性,每个元素在需要时才单独进行分配,所以除了不能超过机器的可用内存之外,这种方式对元素的数量几乎没有什么限制,但是链式结构的链接字段需要消耗一定的内存,在链式结构中访...原创 2020-06-18 23:48:14 · 225 阅读 · 0 评论 -
C和指针(学习笔记)_第16章 标准函数库
1.整型函数<stdlib.h> 这组函数返回整型值,这些函数分为三类:算术、随机数和字符串转换。 1)算术int abs(int value);long int labs(long int value);div_t div(int numerator,int denominator);ldiv_t ldiv(long int number,long int denom); 2)随机数(伪随机数)int rand(void);void s...原创 2020-06-05 00:30:22 · 262 阅读 · 0 评论 -
C和指针(学习笔记)_第15章 输入/输出函数
1.错误报告 perror函数以一种简单、统一的方式报告错误。标准库函数在一个外部整型变量errno(在errno.h中定义)中保存错误代码之后把这个信息传递给用户程序,提示操作失败的准确原因。perror函数简化向用户报告这些特点错误的过程。它的原型定义与stdio.h: void perror(char const *message) 如果message不是NULL并且指向一个非空的字符串,perror函数就打印出这个字符串,后面跟一个分号和一...原创 2020-06-04 01:03:13 · 299 阅读 · 0 评论 -
C和指针(学习笔记)_第14章 预处理器
C预处理器在源代码编译之前对其进行一些文本性质的操作。它的主要任务包括删除注释、插入被#include指令包含的文件的内容、定义和替换由#define指令定义的符号以及确定代码的部分内容是否应该根据一些条件编译指令进行编译。1.预定义符号 预处理器定义的符号,它们的值或者是字符串常量,或者是十进制数字常量。__FILE__和__LINE__在确认调试输出的来源方面很有用处,__DATE__和__TIME__常常用于在被编译的程序中加入版本信息,__STDC用于哪些在ANS...原创 2020-05-31 23:46:56 · 376 阅读 · 0 评论 -
C和指针(学习笔记)_第13章 高级指针话题
1.进一步探头指向指针的指针int i;int *pi;int **ppi;若有如下打印:1.printf("%d\n",ppi);2.printf("%d\n",&ppi);3.*ppi=5 1)若ppi是自动变量,它未被初始化,这条语句将打印一个随机值。若是个静态变量,这条语句将打印0; 2)这条语句将把存储ppi的地址作为十进制整数打印出来,这个值并不是很有用; 3)这条语句的结果是不可预测的,对ppi不应该执行间接访问的操作,因为它...原创 2020-05-31 00:20:46 · 288 阅读 · 0 评论 -
C和指针(学习笔记)_第12章 使用结构和指针
1.链表 链表是包含数据的独立数据结构(通常称为节点)的集合。链表中的每个节点通过链或指针连接在一起,程序通过指针访问链表中的节点,通常节点是动态分配的,但有时也能看到由节点数组构建的链表。2.单链表 在单链表中,每个节点包含一个指向链表下一节点的指针,链表最后一个结点的指针字段的值为NULL,提示链表后面不再有其它结点。链表的起始位置可以使用一个根指针,根指针指向链表的第一个节点,注意根结点只是一个指针,它不含任何数据。type struct NODE{ ...原创 2020-05-28 23:59:41 · 345 阅读 · 0 评论 -
C和指针(学习笔记)_第11章 动态内存分配
1.为什么使用动态内存分配 当声明数组时,必须用一个编译时常量指定数组的长度,但数组长度往往运行时才知道,这时所需的内存空间取决于输入数据。通常采取声明一个较大的数组的方式,它可以容纳可能出现的最多元素。这种方法优点是简单,缺点为: 1)这种声明在程序中引入了人为的限制,为了尽可能包含所有情况,往往声明大小较大: 2)如果程序实际需要的元素比较少时,巨型数组的绝大部分内存空间都被浪费了; 3)如果程序超过容纳范围时,程序必须以一种合理的方式作出相应;2.malloc与fr...原创 2020-05-27 00:37:20 · 322 阅读 · 0 评论