什么是Linux?
不知道大家是什么时候开始接触Linux,我记得我是大三的时候,那时候通过国嵌、韦东山的教学视频,跟着搭bootloader,修改内核,制作根文件系统,一步步,视频真的很简单,没什么异常,但是自己就是搞不了,那个痛苦,现在都记忆犹新。现在工作五年多了,对Linux的认识还是很片面,很肤浅,很多东西看不懂,摸不透,需要持续学习。回头看之前的Linux过程,真的很陡峭,一个小白,需要搞bootloader、内核、根文件系统,太难了,哪有这样子学的,分分钟劝退大家,所以这个时候,就想通过自己对Linux的一些理解,给大家介绍一下,希望可以给大家带来一点帮助。下面通过我对Linux的理解,给大家介绍Linux的浅层面貌,更深处需要各自探讨、摸索了。
名词解释
硬件
百度百科对硬件的介绍就是计算机硬件的简称,是指计算机系统中由电子、机械和光电元件等组成的各种物理装置的总称。这些物理装置按系统结构的要求构成一个有机整体为计算机软件运行提供物质基础。
我们理解它就是一个看得见摸得着的实体,各种程序可以在上面运行并得到相应结果的物理载体。
软件
软件,一系列按照特定顺序组织的计算机数据和指令的集合。看不见、摸不着的东西,需要在硬件上执行,提供特定的功能的计算机程序。软件离开硬件,啥也不是,硬件没有软件,也不过是废铁。
IP
懂网络的可能知道IP是一种网络协议,但是在半导体中,IP是指IP核心。在集成电路设计中,提供特定功能的集成电路模块,比如可以提供I2C通信功能的I2C控制器电路等。
ARM
ARM既是指ARM这家公司,也是指ARM公司提供的IP。ARM公司是全球知名半导体知识产权(IP)提供商,提供ARM IP相应的指令集,也会设计相应的处理器,将这些IP(比如ARMCortex-A53、Cortex-M3等)打包出售给各个芯片厂商。
CPU
CPU,中央处理器,主要由控制器、运算器组成,主要功能是处理指令、执行操作、处理数据。
SOC
SOC,片上系统,一般的我们理解它是各种IP的集合,比如有CPU、GPU、I2C控制器、GPIO、存储控制器等,SOC上包含了各种各种的功能,基于它进行相应的产品开发。
操作系统
什么是操作系统?首先我们需要知道操作系统是个软件程序,运行在计算机芯片上,如PC上使用的因特尔处理,嵌入式使用的板端SOC等。操作系统简单理解就是一个管理员,向下负责调度、处理SOC上的各种资源,向上提供公共服务,处理用户交互等,包括处理器管理、存储器管理、设备管理、文件管理、作业管理。我们仅介绍嵌入式操作系统,常用的Linux系统。
Linux
它是一个免费使用的类UNIX操作系统,由大大佬Linus Benedict Torvalds
创建,基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统。
Ubuntu:
Ubuntu是Linux的一个发行版,以桌面应用为主的Linux操作系统,一般我们都是基于Ubuntu进行开发和学习。
GCC
一般是指GNU编译器套件,提供C、C++等预研的编译器,Linux开发一般使用GCC进行相应的编译开发。
设备
怎么理解设备呢?平常可以说我们的手机是一个设备,而在嵌入式开发中,板子(PCBA板)上的触摸屏、flash存储芯片、wifi芯片等也是一个设备。设备可以是真实存在的物体,也可以是需要出来的,不存在的一个物体。
驱动
嵌入式经常会听到说什么驱动、驱动。驱动实际上就是一些代码,初始化设备的代码,使设备可以正常工作的代码。
总线
总线应该比较好理解,从自来水厂迁一条管道到镇上,然后再通过各种小管道连接到各家各户。嵌入式开发中,总线有芯片内的总线,比如CPU和各种外设控制器进行数据、命令传输的总线,一个管道;也有软件层面虚拟出来的总线,虚拟上面挂载了各种设备,进行相互的通信和操作。
字符设备
字符设备是指在I/O传输过程中以字符为单位进行传输的设备,比如键盘,触摸屏等。
块设备
块设备是i/o设备中的一类,是将信息存储在固定大小的块中,每个块都有自己的地址,还可以在设备的任意位置读取一定长度的数据,例如硬盘,U盘,SD卡等。
网络设备
网络设备使用套接字来实现网数据的接受和发送。
进程
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。程序是指令、数据及其组织形式的描述,进程是程序的实体。
线程
线程(thread)是操作系统能够进行运算调度的最小单位,是独立调度和分派的基本单位。它被包含在进程之中,是进程中的实际运作单位。
在了解上述的基本名词后,那么,在深入学习之前,最起码应该先了解LInux长什么样,会提供的操作吧,下面一起看看。
初识Linux
Windows会有系统盘C盘,其他盘D、E、F等供用户使用,在Linux中,没有这样的,以Ubuntu为例,主要目录结构如下:
/ // 根目录
├── bin // 存放可执行的二进制文件,一般我们执行的命令都会在这个文件夹
├── boot // 启动相关的文件
├── dev // Linux系统的设备文件,访问该目录下的文件相当于访问某个设备
├── etc // 系统配置文件
├── home // 系统默认的用户目录,一般我们的文件都在保存在该目录下
├── lib // 库相关
├── lib32
├── lib64
├── root // 系统管理员root的目录
└──usr // 该目录下也会存在一些库和可执行文件
Linux系统中,任何的设备都是一个文件,在Linux系统中,文件有三种属性:可读®、可写(w)、可执行(x)。
实例:
-rw-rw-r-- 1 chengwei chengwei 5757 11月 13 19:26 什么是Linux.md`-rw-rw-r--`一共10位,文件类型1位,文件拥有者的访问权限、文件所属组用户访问权限以及其他用户访问权限各3位,第一个 `-` 代表的是普通文件,`l`则是链接文件,`d`则是文件夹。
Linux框架
在学习Linux的过程中,给我印象最深刻的一句话就是,任何的设备都是一个文件,而Linux则是管理这些文件。
设备驱动模型,怎么理解呢?
底层芯片各种各样,而产品的应用开发的时候也不想考虑底层的差异,所以必须要一个统一的接口对外,Linux这边就是将设备配置为文件。在软件界,遇到解决不了的问题,给它加一层。所以Linux对接应用的就是VFS(Virtual File System),通过VFS屏蔽底层的差异,应用都是使用同样的接口进行配置。而在内核中,也需要管理各种各样的设备驱动,所以内核提供一套接口,各个平台的驱动按照内核提供的接口进行注册驱动和设备,当驱动和设备一致时,则代表该硬件可用,将会注册节点透给用户层,此时用户将可以使用该设备。如果设备和驱动不一致,则代表不可用。
C语言基础
基本构成
数据类型
C的数据类型包括:整型(short、int、long、long long)、字符型(char)、实型或浮点型(单精度float和双精度double)、枚举类型(enum)、数组类型、结构体类型(struct)、共用体类型(union)、指针类型和空类型(void)。
数组
如果一个变量名后面跟着一个有数字的中括号,这个生命就是数组声明。
指针
一个变量声明时在前面使用*号,表明这是个指针型变量。该变量存储一个地址,而*则是取内容操作符,意思是取这个地址里存储的内容。
关键字
数据类型关键字
关键字 | 作用 |
---|---|
short | 修饰int,短整型数据,可省略被修饰的int |
long | 修饰int,长整型数据,可省略被修饰的int |
long long | 修饰int,超长整型数据,可省略被修饰的int |
signed | 修饰整型数据,有符号数据类型 |
unsigned | 修饰整型数据,无符号数据类型 |
restrict | 用于限定和约束指针,并表明指针是访问一个数据对象的初始且唯一的方式 |
复杂类型关键字
关键字 | 作用 |
---|---|
struct | 结构体声明 |
union | 联合体声明 |
enum | 枚举声明 |
typedef | 声明类型别名 |
sizeof | 得到特定类型或特定类型变量的大小 |
inline | 内联函数用于取代宏定义,会在任何调用它的地方展开 |
存储级别关键字
关键字 | 作用 |
---|---|
auto | 指定为自动变量,由编译器自动分配及释放。通常在栈上分配。与static相反。当变量未指定时默认为auto |
static | 指定为静态变量,分配在静态变量区,修饰函数时,指定函数作用域为文件内部 |
register | 指定为寄存器变量,建议编译器将变量存储到寄存器中使用,也可以修饰函数形参,建议编译器通过寄存器而不是堆栈传递参数 |
extern | 指定对应变量为外部变量,即标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义 |
const | 指定变量不可被当前线程改变(但有可能被系统或其他线程改变) |
volatile | 指定变量的值有可能会被系统或其他线程改变,强制编译器每次从内存中取得该变量的值,阻止编译器把该变量优化成寄存器变量 |
流程控制关键字
关键字 | 作用 |
---|---|
return | 用在函数体中,返回特定值 |
continue | 结束当前循环,开始下一轮循环 |
break | 跳出当前循环或switch结构 |
goto | 无条件跳转语句 |
if | 条件语句,后面不需要放分号 |
else | 条件语句否定分支,与if连用 |
switch | 开关语句,多重分支语句 |
case | 开关语句中的分支标记,与switch连用 |
default | 开关语句中的“其他”分支,可选 |
函数
C程序是由一组变量或是函数的外部对象组成的。函数是一个自我包含的完成一定相关功能的执行代码段。