重要笔记

用typedef定义结构时可以省略结构名。用typedef为结构创建别名,需要决定别名是什么。别名就是类型名,也就是说结构有两个名字:一个是结构名(struct...),一个是类型名。


存储器泄漏是指存储器分配出去以后,再也访问不到。valgrind可以帮助追踪存储器泄漏。


t->age  表示“由t指向的结构体中的age字段”


想快速地插入数据,需要链表;想直接访问元素,需要数组。


指针常量:指针类型的常量char* const p.
常量指针:指向常量的指针,指针的值可以改变,
指针所指的地址中的内容为常量不能改变,const char* p.


绝大多数流是完全缓冲的,这意味着。。。实际是从一块被称为缓冲区的内存区域来回复制数据,从内存中来回复制数据是非常快速的,用于输出流的缓冲区只有当它写满时才会被刷新(flush,物理写入)到设备或文件中。
输入缓冲区当它为空时通过从设备或文件读取下一块较大的输入,重新填充缓冲区。
从实现者的角度观察,系统调用和库函数之间有重大区别;但从用户角度来看,其区别并不非常重要。必要时我们可以替换库函数,而通常却不能替换系统调用。
对于内核而言,所有打开的文件都通过文件描述符引用。当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符。
当读或写一个文件时,使用open或create返回的文件描述符标识该文件,将其作为参数传送给read或write。


UNIX所使用的技术是为每个系统调用在标准C库中设置一个具有同样名字的函数
所有的操作系统都提供多种服务的入口点,程序由此向内核请求服务。这些入口点称为系统调用。


文件描述符通常是一个小的非负整数,内核用它标识一个特定进程正在访问的文件。当内核打开一个已有文件和创建一个新文件时,它返回一个文件描述符。


每个进程都有一个非负整数表示的唯一进程ID。因为进程ID标识符总是唯一的,常将其用作其他标识符的一部分以保证其唯一性。
ID为0的进程通常是调度进程,又称为交换进程。该进程是内核的一部分,它并不执行任何磁盘上的程序,因此也被称为系统进程。
每个UNIX系统实现都有它自己的一套提供操作系统服务的内核进程。




信号是软件中断,信号提供了一种处理异步事件的方法


一个现有进程可以调用fork函数创建一个新进程,这个新进程被称为子进程。fork函数被调用一次,但返回两次。


当内核执行C程序时,使用一个exec函数,在调用main前先调用一个特殊的启动例程
可执行程序文件将此启动例程指定为程序的起始地址——这是由连接编辑器设置的,启动例程从内核取得命令行参数和环境变量值,然后调用main函数做好安排。


启动例程由汇编语言编写exit(main(argc,argv))


ISO C规定,一个进程可以登记多达32个函数,这些函数将由exit自动调用。我们称这些函数为终止处理程序,并调用atexit函数来登记这些函数


POSIX.1扩展了ISO C标准,他指定如若程序调用exec函数族中的任一函数,则将清除所有已安装的终止处理程序。


内核使程序执行的唯一方法是调用一个exec函数。进程自愿终止的唯一方法是显式或隐式的调用_exit或_Exit。








每个程序都会接收到一张环境表。环境表是一个字符指针数组,其中每个指针包含一个以NULL结束的C字符串的地址。全局变量environ则包含了该指针数组的地址:
extern char **environ;


open,read,write,close,lseek
不带缓冲指的是每个read个write都调用内核中的一个系统调用


fork创建子进程的代码执行方式:
a.fork之前的代码父进程执行一次
b.fork之后的父子进程各执行一次
c.fork函数的返回值,父子进程各返回一次


使用fork创建出来的子进程会复制进程中除了代码区之外的其他内存区域,代码区和父进程共享


信号的处理方式:
1、默认处理,绝大多数信号的处理方式都是终止进程
2、忽略处理
3、自定义处理


当最后一个访问管道的进程终止时,管道就被完全删除了


目录(文件夹)文件:这种文件包含了其他文件的名字以及指向与这些文件相关信息的指针。
对一个目录文件具有读权限的任意进程都可以读该目录的内容,但只有内核可以直接写目录文件。


与一个进程相关联的ID有6个或更多
每个文件有9个访问权限位。S_IRUSR S_IROTH


注意,对于目录的读权限和执行权限的意义是不同的。
读权限允许我们读目录,获得在该目录中所有文件名的列表。
当一个目录是我们要访问文件的路径名的一个组成部分时,对该目录的执行权限是我们可通过该目录。


为了在一个目录中创建一个新文件,必须对该目录具有写权限和执行权限


wait()函数用于挂起正在运行的进程进入阻塞状态,直到有一个子进程终止。


点分十进制表示IP地址。
IP地址主要分为两部分:网络地址+主机地址
子网掩码用于判断两个IP地址是否在同一个子网中


端口号:主要用于定位该主机中具体的某一个进程。
网络字节序:主要描述数据在网络中传递时的字节顺序。


socket()用于创建一个通信点,成功返回一个描述符


A.通用的通信地址
struct sockaddr
{
sa_family;//协议簇
sa_data[14];//数据内容
}
该通信地址通常用于函数的参数类型,用于各种通信地址之间的转换


B.网络通信的结构体类型
struct sockaddr_in
{
sin_family;//AF_INET
sin_port;//端口号
struct in_addr sin_addr;//IP地址
}
struct in_addr
{
in_addr_t s_addr;
}


errno的值只在函数发生错误时设置


地址标识了特定通信域中的套接字端点,地址格式与特定的通信域相关。为使不同格式地址能够被传入到套接字函数,地址被强制转换成通用的地址结构sockaddr表示。


使用管道实现进程间的通信


有名管道:一般采用命令创建管道文件,实现任意两个进程之间的通信
无名管道:一般采用系统函数来创建管道文件,用于父子进程之间的通信


int pipe(int pipefd[2])
函数功能:
主要用于创建管道文件,利用参数返回两个文件描述符,其中pipefd[0]---管道读端


在使用套接字与客户端程序通信前,服务器需要历经四个阶段:
绑定(bind)
监听(linsten)
接受(accept)
开始(begin)
BLAB


注意:一定要检查系统调用的返回值,错误随处可见。


system()函数是在代码中运行其它程序的捷径,特别是建立快速原型时,与其写很多C代码,不如调用外部程序


标准输出是三大默认数据流之一。顾名思义,数据流就是流动的数据,数据从一个进程流出,然后流入另一个进程。除了标准输出、标准输入和标准错误,还有其他形式的数据流,例如文件连接和网络连接也属于数据流。


文件描述符是一个数字,它代表一条数据流
所有向标准输出发送数据的函数会先查看描述符表,看1号描述符指向哪条数据,然后再把数据写到这条数据流中,printf()便是如此


如果一个结构包含一个链向同种结构的链接,那么这个结构就被称为递归结构


为什么字符要从0开始编号?
字符的索引值是一个偏移量:它表示当前要引用的这个字符到数组中第一个字符之间有多少个字符


当需要多次检查同一变量时,使用switch语句会更方便。


一个数据如果没有定义在任何名字空间中,则这个数据属于无名名字空间
还有一种叫显式的无名名字空间namespace{}
不属于任何名字空间的标识符,访问方式为:“::标识符”




只有类型没有变量名的形参称为哑元。


可以将函数返回类型声明为引用,避免函数返回值带来的内存开销;
如果一个函数返回类型被申明为引用,那么该函数的返回值就是一个左值。


通过对象的属性(名词、形容词、数量词)和行为(动词)表达对象。
类就是将多个对象共性提取出来,定义的一种数据类型,类是对对象的属性和行为的抽象描述,对象是类的实例化


构造函数负责确定对象的初始状态以及分配必要的内存
构造函数在对象创建时自动被调用


如果一个类没有定义构造函数,编译器会提供一个缺省的构造函数(无参构造函数),使成员变量获得定义。
如果定义了构造函数,无论是否有参数,编译器都不会再提供无参构造函数。




拷贝构造函数:
1)用一个已经存在的对象构造同类型的副本对象时,会调用该类的拷贝构造函数
2)以对象的形式向函数传递参数


必须使用初始化表的地方:
a 如果有成员子对象,而该类又没有无参构造函数,则必须通过初始化表初始化该成员变量


左值:可以放在赋值运算符号的左边,可以修改,可以被取地址。
右值:只能放在赋值运算符右边,不可以被修改,不可以被取地址。


静态成员变量:
1)非静态成员变量属于对象,静态成员变量属于类。
2)不能在构造函数中被定义和初始化,需要在类的外部单独定义并初始化
3)可以通过类名直接访问,也可以通过对象访问
4)静态的成员变量在该类的多个实例对象间共享
5)静态成员变量存放在全局区域
6)静态成员变量使用也受到访问属性影响


静态成员函数与类相联系,而不与类中的对象相联系


常函数:
在一个成员函数参数表后面加const,这个成员函数就称为常函数。
常函数中this指针是一个常指针,不能在常函数中修改成员变量的值。
函数名和形参表相同的成员函数,其常版本和非常版本可以构成重载关系


析构函数:
析构函数是特殊的成员函数;
一个类只能有一个析构函数;
析构函数主要负责清理对象声明周期内动态产生的资源。


继承:
通过一种机制表达类型与类型之间共性和特性的方式,利用已有数据类型定义新的数据类型,这种机制叫做继承
继承的特性:
1)任何时候子类对象都可以看作是基类对象
2)向上和向下造型
a.向上造型:将子类 类型的指针或引用转换为 基类类型的的指针或引用。这种操作性缩小的类型转换,在编译器看来是安全的,可以隐式转换


常函数中this指针是一个常指针,不能在常函数中修改成员变量的值


如果一个类包含指针形式的成员变量,缺省拷贝构造函数只是复制指针成员变量本身,而没有复制指向的内存,这种拷贝构造被称为浅拷贝。(double free)


通俗的讲,在类中,函数名与类名相同的函数称为构造函数。


当一个类的对象离开作用域时,析构函数将被调用(系统自动调用)。


如果一个构造函数的第一个参数是自身类类型的引用,且任何额外的参数都有默认值,则此构造函数是拷贝构造函数


引用本身不占存储单元,系统也不给引用分配存储单元,所以对引用求地址,就是对目标变量求地址。
int a = 1;
int& ra = a;
&ra == &a;


如果既要利用引用提高程序的效率,又要保护传递给函数的数据不再函数中被改变,就应使用常引用。
用引用比用一般变量传递参数的效率和所占空间都要好
用引用返回一个函数值得最大好处是,在内存中不产生返回值的副本


引用的总结:
1)在引用的使用中,单纯给某个变量取个别名是毫无意义的,
引用的目的主要用于在函数参数传递中,
解决大块数据或对象的传递效率和空间不如意的问题。
2)引用和指针的区别:
指针通过某个指针变量指向一个对象后,对它所指向的变量间接操作。程序中使用指针,程序的可读性差;
而引用本身就是目标变量的别名,对引用的操作就是对目标变量的操作。


this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行。


类的特征:封装(public和private作用就是实现这一目的)和继承(protected)
封装:用户代码(类外)可以访问public成员而不能访问private成员;private成员只能由类成员(类外)和友元访问。
继承:protected成员可以被派生类对象访问,不能被用户代码(类外)访问。


private成员只能被本类成员(类内)和友元访问,不能被派生类访问。




静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可以改变其值。静态变量或静态函数只有本文件内的代码才能访问它,它的名在在其他文件中不可见。


 守护进程运行在后台的一种特殊进程,独立于控制终端,常用于服务器程序
进程组:一个或者多个进程的集合
会话:一个或者多个进程组的集合


setsid()函数可以创建一个新的会话,但是调用的进程不能是组长进程。


创建步骤:
1、在父进程执行fork()并exit退出父进程
2、在子进程调用setsid创建新的会话
3、切换工作目录为"/"  chdir("/");
4、设置权限屏蔽码为0
5、关闭并不需要的文件描述符


Web服务器工作原理:
1、Web服务器指驻留于因特网上某种类型计算机的程序,当Web浏览器(客户端)连到服务器上并请求文件时,服务器将处理该请求并将文件反馈到该浏览器上,附带的信息会告诉浏览器如何查看该文件(即文件类型)。服务器使用HTTP与该客户端浏览器进行信息交流,这就是人们常把它们称为HTTP服务器的原因。


WEB服务器不仅能够存储信息,还能在用户通过WEB浏览器提供的信息的基础上运行脚本和程序。


HTML是用来制作超文本文档的一种标记语言。HTML一直都是WWW的信息表示语言。使用HTML语言描述的文件,需要通过浏览器显示效果,是一种最为基础的语言。


所谓超文本,因为它可以加入图片、声音、动画、影视等内容,并可以从一个文件跳转到另外一个文件,与世界各地主机上的文件连接。


HTML的作用是用来展示页面的表现形式,如页面的布局、页面的颜色、页面中的内容等。
所谓标记,是因为它采用了一系列的指令和符号来控制输出效果,这些指令符号用<标签名字和属性>来表示。
HTML的焦点主要集中在信息如何显示上,而不是信息的内容和结构。


首页文件名默认为index.htm或者index.html。


设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。


Http协议定义了很多与服务器交互的方法,最基本的有4种,分别是GET,POST,PUT,DELETE。一个URL地址用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查,改,增,删4个操作。GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。


HTTP协议的特点:
1、灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
2、无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据流增大。另一方面,在服务器不需要先前信息时它的应答就较快。
3、无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。


什么是超文本:
包含有超链接和各种多媒体元素标记的文本。这些超文本文件彼此链接,形成网状,因此又被称为网页。这些链接被称为网页。这些链接使用URL表示。最常见的超文本格式是超文本标记语言HTML。


什么是URL:
URL即统一资源定位符(Uniform Resourse Locator),用来唯一的标识万维网中的某一个文档。URL由协议、主机和端口号(默认为80)、文件名三部分构成。
(http://www.baidu.com:80/news/index.html)


TCP/IP模型是系列网络协议的总称,这些协议的目的,就是使计算机之间可以进行信息交换。
TCP/IP模型一共包括几百种协议,对互联网上交换信息的各个方面都做了规定。


TCP/IP模型的四层结构:
从上到下的四层,分别为:
连接层
网络层
传输层
应用层
上一层的协议都以下一层的协议为基础。


它们的作用:
1)连接层(linker layer)负责建立电路连接,是整个网络的物理基础,典型的协议包括以太网、ADSL等,单纯的0和1没有任何意义,连接层规定了解读方式,确定了0和1的分组方式。
2)网络层(network layer)负责分配地址和传送二进制数据,主要协议是IP协议。
3)传输层(transport layer)负责传送文本数据,主要协议是TCP协议。
4)应用层(application layer)负责传送各种最终形态的数据,是直接与用户打交道的层,典型协议是HTTP、FTP等。
5)物理层(physical layer)电脑连接起来的物理手段,网络的一些电气特性,作用是负责传送0和1的电信号
6)


计算机网络体系结构的通信协议划分为七层,自上而下依次为:
应用层
表示层
会话层
传输层
网络层
数据链路层
物理层




以太网规定,一组电信号构成一个数据包,叫做“帧”,每一帧分为两部分:标头(head)和数据(data)。
“标头”包含数据包的一些说明项,比如发送者、接收者、数据类型等。“数据”则是数据包的具体内容。


上面提到,以太网数据包的“标头”,包含了发送者和接收者的信息。那么,发送者和接收者是如何标识的?


计算机中CPU和外设进行硬件通信的方式:
通信接口有以下几种:
1、GPIO方式,例如:LED,蜂鸣器等
2、UART串口通信方式,例如:GPS,GPRS,BT等
3、I2C总线通信方式,例如:重力传感器,三轴
4、SPI总线通信方式,例如:Norflash闪存,触摸屏
5、1-Wire(一线式)总线通信方式,例如:温度


UART串口的定义:通用串行异步收发器。
"串行":CPU和外设进行通信时,只需要一根信号线即可
此信号线又称数据线。
 切记:UART数据传输从低位开始!


“并行”: CPU和外设数据传输时,需要多根信号线。
“数据同步”:CPU向设备发送数据以后,要确保外设能正常的将数据接收到,接收完整!
计算机中数据同步的方法有两种:同步、异步
“异步”:双方在数据正式传输时,只要保证数据同步即可。


交叉编译就是在一个平台上生成在另一个平台上执行的代码。这里的平台包括体系结构和操作系统。同一个体系结构可以运行不同的操作系统,同样,同一个操作系统还可以在不同的体系结构上运行。


为什么要用交叉编译?
(1)目标平台所需要的bootloader以及OS核心还没有建立时,需要做交叉编译。
(2)目标机设备不具有一定的处理器能力和存储空间,即单独在目标板上无法完成程序开发,所以只好求助宿主机。这样可以在宿主机上对即将在目标机上运行的应用程序进行编译,生成可以在目标机上运行的代码


将和程序编译链接等相关的gcc,ld等工具按照先编译后链接等相关的编译程序的内在逻辑串起来,就称为“工具链”。


ctags是可以根据文件的扩展名以及文件名的形式来确定该文件中是何种语言,从而使用正确的分析器。
ctags -R *:这条命令会在当前目录下产生一个“tags”文件,当用户在当前目录中运行vi时,会自动载入此tags文件。
tags文件中包括这些对象的列表:
1.用#define定义的宏
2.枚举型变量的值
3.函数的定义、原型和声明
4.名字空间等
vi用这个“tags”文件来定位上面这些做了标记的对象。


Bootloader就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。
通常,Bootloader是严重依赖于硬件而实现的,特别是在嵌入式世界。因此在嵌入式世界里建立一个通用的Bootloader几乎是不可能的。


每个不同的CPU体系结构都有不同的Bootloader。有些Bootloader也支持多种体系结构的CPU,比如U-Boot就同时支持ARM体系结构和MIPS体系结构。除了依赖于CPU的体系结构外,Bootloader实际上也依赖于具体的嵌入式板级设备的配置。这也就是说,对于两块不同的嵌入式板而言,即使他们是基于同一种CPU而构建的,要想让运行在一块板子上的Bootloader程序也可以运行在另一块板子上,通常也都需要修改Bootloader的源程序。


系统加电或复位后,所有的CPU通常都从某个由CPU制造商预先安排的地址上取指令。基于CPU构建的嵌入式系统通常都有某种类型的


指令集是存储在CPU内部,对CPU运算进行指导和优化的硬程序。拥有这些指令集,CPU就可以更高效的运行。


C和C++中的重要关键字:
auto:自动变量。(不写则隐含确定为“自动存储类别”)
break:不能用于循环语句和switch语句之外的任何其他语句中,作用为结束循环。
extern:外部变量声明。
catch:catch和try语句一起用于异常处理。
const_cast<type_is>(expression):该运算符用来修改类型的const或volatile属性。除了const或olatile修饰之外,type_id和expression的类型是一样的。常量指针被转化成非常量指针,并且仍然指向原来的对象;常量引用被转换成非常量引用,并且仍然指向原来的对象。


dynamic_cast:动态转换,允许在运行时刻进行类型转换,从而使程序能够在一个类层次结构安全的转换类型。dynamic_cast提供了两种转换方式,把基类指针转换成派生类指针,或者把指向基类的左值转换成派生类的引用。
inline:内联函数的定义将在编译时在调用处展开。inline函数一般由短小的语句组成,可以提高程序效率。
typeid:指出指针或引用指向的对象的实际派生类型。
try:用于实现C++的异常处理机制,可以在try中调用可能抛出异常的函数,然后在try后面的catch中捕获并进行处理。




关键字volatile是与const决然对立的。它指示一个变量也许会被某种方式修改,这种方式按照正常程序流程分析是无法预知的。变量如果加了volatile修饰,则会从内存重新装载内容,而不是直接从寄存器拷贝内容。
编译器优化:
由于内存访问速度远不及CPU处理速度,为提高机器整体性能,在硬件上引用硬件高速缓存Cache,加速对内存的访问。




流水线的方式是把一个重复的过程分解为若干个子过程,每个子过程可以与其他子过程同时进行。流水线的实质就是在明显制约系统速度的那条长路径上插入几级寄存器,使信号在时钟的作用下到达目的地,这样由于用寄存器截断了长路径,使得寄存器的最大延时缩短,因而提高了整个系统的速度。


3级流水线的指令分3个阶段执行:
1)取指:从存储器装载一条指令。
2)译码:识别将要执行的指令。
3)执行处理指令并将结果写回寄存器。
以前学过的51单片机,因为比较简单,所以它的处理器只能在完成一条指令的读取和执行后,才会执行下一条指令。这样,PC始终指向正在“执行”的指令。


无论处理器处于何种状态,程序计数器R15(PC)总是指向“正在取值”的指令,而不是指向“正在执行”的指令或者正在“译码”的指令。




MBR(master boot record),即主引导记录,有时也称为主引导扇区。位于整个硬盘的0柱面0磁头1扇区(可以看作是硬盘的第一个扇区),bios在执行自己固有的程序以后就会跳到mbr中的第一条指令,将系统的控制权交给mbr来执行。
MBR不随系统的不同而不同,即不同的操作系统可能会存在相同的MBR,即使不同,MBR也不会夹带操作系统的性质,具有公共引导的特性。


MAC(Media Access Control/Medium Access Control)地址,用来定义网络设备的位置。
MAC地址共6个字节,前3个字节是由IEEE的注册管理机构RA负责给不同厂家分配的代码,后3个字节由各厂家自行指派给生产的适配器接口。


IP地址专注于网络层,将数据包从一个网络转发到另外一个网络;
而MAC地址专注于数据链路层,将一个数据帧从一个节点传送到相同链路的另一个节点。


Socket(套接字):一种通讯机制,它包含了一整套调用接口和数据结构的定义,它给应用进程提供了使用如tcp/ip等网络协议通讯的手段。
linux中的网络编程通过socket接口实现,Socket是一种特殊的I/O,提供对应的文件描述符。
一个完整的Socket都有一个(五元组)相关描述(协议,本地地址,本机端口,远程地址(ip),远程端口),每一个socket有一个本地的唯一socket,由操作系统来进行分配。


TCP/IP协议是一个协议簇,里面包含很多协议。TCP、UDP都只是其中的一个。之所以命名为TCP/IP协议,因为TCP、IP协议是两个很重要的协议。


TCP简介:
提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。在收发数据前,必须和对方建立可靠的连接。一个TCP连接必须要经过3次“对话”才能建立起来,其中的过程非常复杂,3次“对话”的目的是使数据包的发送和接收同步,经过3次“对话”之后,主机A才向主机B正式发送数据。


TCP支持的应用协议:Telnet(远程登录)、FTP(文件传输协议)。
UDP支持的应用协议:NFS(网络文件系统)、DNS(主域名称系统)、TFTP(通用文件传输协议)。


UDP特点:
1)UDP是一个非连接的协议,传输数据之前源端和终端不建立连接,当他想传送时就简单的抓取来自应用程序的数据,并尽可能快的把它扔到网络上。
2)在发送端,UDP传送数据的速度仅仅受应用程序生成数据的速度、计算机的能力和传输带宽的限制。
3)在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。


我们经常使用的“ping”命令来测试两台主机之间TCP/IP通信是否正常,其实它的原理就是向对方主机发送UDP数据包。






编程编到一定时候,就需要了解底层系统的机制,否则知其然不知所以然。
如果想要了解底层机制,学习C语言、操作系统。




ARM指令之数据处理指令:
数据传送指令
算数运算指令
位运算指令
比较测试指令
ARM核内部玩


ARM指令之加载存储指令:ldr/str
ARM核和外设数据通信


ARM指令之栈操作指令:push/pop(满减栈)


ARM伪指令:adr/ldr,带方括号([])就为真
ARM伪操作:各种
ARM混合调用之函数传递参数的两种方法:
默认寄存器:r0/r1/r2/r3,返回值用r0
强制使用栈:asmlinkage


编程是一种非常单调枯燥的工作,长时间、全身心、独自一人地与机器打交道,人际交往和日常生活难免会受到影响。
为什么要学脚本语言,因为他们实在是太方便了,很多时候我们需要写点小工具或是脚本来帮我们解决问题,你就会发现正规的编程语言太难用了。


跟完一个名校的网络编程课程。


所谓的插件其实就是一个脚本。


linux内核包含7大功能:
内存管理子系统:
进程管理子系统
文件系统
系统调用
设备驱动
网络协议栈
平台相关代码


NFS(网络文件系统),一种使用于分散式文件系统的协定,功能是通过网络让不同的机器、不同的操作系统能够彼此分享各自的数据,让应用程序在客户端通过网络访问位于服务器磁盘中的数据,是在类Unix系统间实现磁盘文件共享的一种方法。


NFS的基本原则是“容许不同的客户端及服务端通过一组RPC分享相同的文件系统”,它是独立于操作系统,容许不同硬件及操作系统的系统共同进行文件的分享。


NFS在文件传送或信息传送过程中依赖于RPC协议。RPC(remote procedure call)远程过程调用是能使客户端执行其他系统中程序的一种机制。
NFS是一个文件系统,而RPC是负责信息的传输。


嵌入式linux系统的启动流程:
上电CPU运行uboot
->uboot根据bootcmd加载启动内核并且通过bootargs给内核传递参数


编译时,编译器需要的是语法的正确,函数与变量的声明的正确。对于后者,通常是你需要告诉编译器头文件的所在位置(头文件应该只是声明,而定义应该放在C文件中)。一般来说,每个源文件都应该对应于一个中间目标文件。


链接时,主要是链接函数和全局变量。所以,可以使用中间目标文件(.o文件)来链接应用程序。链接器并不管函数所在的源文件,只管函数的中间目标文件,在大多数时候,由于源文件太多,编译生成的中间目标文件太多,而在链接时需要显式的指出中间目标文件名,这对于编译很不方便,所以要给目标文件打个包,即“库文件”。


make命令执行时,需要一个makefile文件,以告诉make命令需要怎样的编译和链接程序。


makefile规则:
target...:prerequisites....
command
...
...
target:目标文件,可以是一个或多个。
prerequisites:产生target所需的依赖文件。
command:make执行的命令


makefile的核心:prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。(make会比较targets文件和prerequisites文件的修改日期,如果prerequisites文件的日期要比targets文件的日期要新,或者targets不存在的话,那么make就会执行后续定义的命令)。




wine(wine is not an Emulator)

































































































































































































































































































































































































  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值