第一章--linux基础

(一):linux系统根文件夹结构

Unix-like系统中的”文件系统”的概念包含两个意思,第一个是”根文件系统”,第二个是”存储类文件系统”.后者的概念基本等同于windows操作系统,而前者与windows区别较大,他并非用于存储实际文件的.根文件系统简称rootfs,他的特点为:

 1:"文件"不仅是指硬盘上的数据,他还包含不论什么设备资源.在Unix-like系统中,全部的硬件设备都被看作是文件,"文件"是内核范畴的概念,磁盘,U盘,内存,网络,甚至cpu都被内核抽象成文件.为了区别一般意义上的文件按,内核级文件被称为"设备文件"或"设备虚拟文件".这些设备文件在rootfs中能够被看到.

2:并非全部的文件夹或文件都相应磁盘上的存储空间.比方,sys,proc,dev这三个文件夹,他们相应的不是存储空间,而是设备文件,这三个文件夹中的内容由内核及相应的驱动程序维护.

3:存储类我呢见系统不能和rootfs并列存在,而仅仅能挂载到rootfs的一个子文件夹上

4:Unix-like中的"存储类文件系统"内部等同于windows的文件系统,包含文件系统类型.windows系统常见的文件系统类型包含FAT16,FAT32,NTFS,linux中也支持这些文件系统类习惯,但更常见的却是ext2,ext3,ext4,yaffs等.

Unix-like系统中,操作系统仅仅能有一个根文件系统,但能够包含多个”存储类文件系统”.运行挂载,卸载”存储类文件系统”的操作能够在terminal下使用mount和umount命令.

(二):linux启动过程

从计算机系统的角度来看,启动过程一般分为三个步骤

首先是开机,开机就是开系统開始供电,此时,硬件电路会产生一个确定的复位时序,保证CPU是最后一个被复位的器件.CPU要最后被复位的原因就是,假设CPU第一个被复位,则当CPU复位后開始运行时,其它硬件内部的寄存器状态可能还没有准备好,比方磁盘或者内存,那么就可能出现外围硬件初始化错误.

当正确完毕复位之后,CPU開始运行第一条指令,该指令所在的内存地址是固定的,这由CPU的制造者指定.不同的CPU可能由不同的地址获取指令,可是这个地址必须是固定的,这个固定地址所保存的程序往往被称为”引导程序(bootloader)”,其作用是装载真正的用户程序.

至于怎样装载,是一个策略问题,不同的CPU会提供不同的装载方式,比方有的通过普通的并口存储器,有的则通过SD卡,还有的是通过RS232接口.不管是硬件上使用何种接口装载,装载过程必须提供下面信息,详细包含:

1:从哪里读取用户程序

2:用户程序的长度是多少

3:装载完毕用户程序之后,应该跳转到哪里,即用户程序的运行入口在哪里

第二步是运行内核程序,这里所说的内核程序在上一步中指的就是”用户程序”.由于从CPU的角度来看,除bootloader之外的全部程序都是用户程序,仅仅是从软件的角度来看,用户程序被分为”内核程序”和”应用程序”,而本步运行的是”内核程序”.

内核程序初始化的时候运行的操作包含,初始化各种硬件,包含内存,网络接口,显示器,输入设备,然后建立各种内部数据结构,这些数据结构将用于多线程调度及内存的管理等.当内核初始化完毕之后,就開始运行详细的应用程序了.在普通情况下,习惯于将第一个应用程序称为”Home程序”.

第三步就是运行Home程序,比方windows的系统桌面,就是一个典型的Home程序.之所以称其为Home程序,是由于通过该程序能够方便的启动其它应用程序.

下面看一下android的启动过程.

多数基于ARM的实际硬件系统,会从并口NADN Flash芯片中的0x00000000地址处装载程序.对于一些小型嵌入式系统而言,该地址处的程序就是终于要运行的用户程序,而对于android而言,该地址出的程序还不是android程序,而是一个叫做uboot或者fastboot的程序,其作用是初始化硬件设备,比方网口,SDRAM,RS232等,并提供一些调试功能.当uboot被装载后便開始运行,他通常会先检測用户是否按下了某些特别的按键,这些特别按键是uboot在编译的时候预先约定好的,用于进入调试模式.假设用户没有按这些特别的button,则uboot就会从NAND Flash中装载linux内核,装载的地址是在编译uboot的时候预先约定好的.

linux内核被装载之后,就開始进行内核初始化的过程,步骤例如以下:

(三):Make脚本备忘

Linux系统中包含一个Make脚本的解释器,他能够读取Make脚本的内容,并运行之,Make脚本多用于自己主动编译过程,但并非说Make脚本仅仅能拥有自己主动编译.

Make脚本的基本的语法例如以下:

目标(target): 条件(prerequest)

(Tab按键) 命令

在该语法中。目标能够是随意一个字符串名称,也能够是详细文件的名称.条件能够是其它目标的名称,也能够是详细文件的名称.运行Make脚本的时候,Make解释器会检查目标和文件里包含的文件时间戳是否同样,假设不同的话,解释器就会运行Tab键后面的’命令’,命令能够是不论什么可运行程序.

自己主动编译的基本原理就是将目标文件作为”目标”,将源文件作为”条件”,因此,当源文件改动之后,目标文件的时间戳会早于源文件,于是Make解释其就会自己主动运行相关指定”命令”.此时能够将运行编译的命令作为这里的”命令”,从而达到自己主动编译的目的.

1:一个简单的Makefile文件

源代码例如以下:

#FileName Makefile
#this file is used for showing how to use makefile
$(info start working)
hello: hello.c
    echo "nothing"
hello.bin: hello.c
    @echo "now make hello.bin"
    gcc hello.c -o hello.bin
.PHONY: he
he: hello.c
    @echo "now make he"
    gcc hello.c -o hello.bin

这段代码有下面特点:

1:#符号是凝视符,可用在代码中不论什么地方
2:$是函数调用符号,info是一个函数名称,作用是输出一段信息.相似的信息输出函数还包含warning,error两个函数,只是error按书运行后会终止运行并退出
3:目标定曾经不能加不论什么空格,而命令前面必须以Tab键開始
4:.PHONY关键字用于声明一个目标,被.PHONY声明的目标将总是运行其指定的命令,而假设不声明的话,则仅当目标后面的条件变动之后才运行
5:命令前面的@符号的作用是,不显示被运行的命令.由于默认情况下,Make解释器在运行命令的时候会打印出运行的命令
6:对于hello.bin目标,该目标本身就是一个文件,其依赖的文件是hello.c文件.因此当hello.c文件被改动后,将会运行gcc命令又一次对该c文件编译,并输出hello.bin文件.

要运行以上脚本,能够运行下面命令:

$make -f Makefile hello

在该命令中,-f用于指定要运行的脚本文件名.假设不指定文件名,则解释器会自己主动从当前文件夹下寻找名称为Makefile的脚本文件.

2:变量的定义和赋值

Makefile中的变量不须要单独定义,可直接赋值,常见的赋值方式有:

Make解释器运行脚本的过程可分为两个步骤:

1:装载Makefile及Makefile中include的其它Makefile.装载全然部相关的脚本文件之后,系统内部会创建一个图,该图描写叙述了各个Makefile的依赖关系.

2:依据用户指定的target找出该target的全部依赖关系,并推断依赖条件中的文件的时间戳.假设时间戳较新,就開始运行taget中所相应的命令.

而对于变量定义和赋值,解释器会依据不同的赋值方式选择是马上赋值还是延迟赋值,赋值过程也成为展开过程.所谓马上赋值,是指在读取脚本的时候就给变量进行赋值。而延迟赋值,是指读取的时候暂不赋值,仅仅有在运行脚本的时候用到了该变量,才对其进行赋值.不同的赋值方式相应的展开时机:

3:条件控制语句

Make脚本的条件控制可分为两类,一类是在解释器解析脚本文件的时候处理,还有一类是在运行脚本的时候处理.

下面看第一类条件控制语句的语法模型,例如以下代码:

if-condition
   text if the condition is true
endif
//或者
if-condition
    text if the condition is true
else
    text if the condition is false
endif 

当中,condition仅仅能进行两种推断,一种是推断表达式是否相等,还有一种是推断表达式是否被定义,例如以下:

1: ifdef var:推断变量是否被定义过.

2:ifndef var:与ifdef相反,推断变量是否还没有被定义

3:ifeq test:推断表达式test是否相等,表达式可写成”a” “b”或(a,b)

4:ifneq test,与ifeq相反

4:宏定义

Make 脚本中的函数,按被调用的方式分为三类:

第一类是内置函数,即Make解释器内部定义好的函数,在不论什么脚本文件里可直接调用,调用的格式为:

$(fname,param...)

fname是函数的名称,param是參数,多个參数用逗号隔开

第二类是用户定义的,带參数的函数,使用define关键字进行定义,调用的格式为:

$(call fname.param...)

call是调用的关键字, fname代表函数的名称,param是函数參数,多个參数使用逗号分隔.

第三类也是用户定义的,但不带參数,该类函数也称之为宏,其调用格式为:

$(fname)

既不使用call关键字,也不包含參数.

用户函数的定义方式例如以下:

define fname
//各种详细的命令
endef

在自己定义函数中,命令钱不须要加Tab键,由于当宏被展开的时候,Make解释器会自己主动在没一行命令前加Tab键.函数内部使用(n)代表调用函数时的參数,n代表自然数,(0)代表函数名称本身,$(1)代表第一个參数.

举个样例:

define showFirstName
  @echo $(1)
endef
.PHONY: name
name:
    $(call showFirstName,yuandan,ferr)

这段代码中定义了函数showFirstName,其作用是将传入的第一个參数返回给调用者.使用make name命令运行以上脚本,运行结果为:

$ make name
yuandan

经常使用的内置函数:

?(1):字符串操作函数

内置的经常使用的字符串函数如表:

(2):文件名操作

用于处理文件路径,名称的经常使用函数:

(3):过程控制函数

在C语言中if/else是语法本身定义的关键字,而脚本的过程控制确实由函数完毕的.

过程控制函数表:

5:内置符号和变量

Make解释器内部定义了一些特别的符号和一些特别名称的变量,在编写用户脚本时,能够直接使用这些符号,变量,而不须要定义.

(1):内置符号

(2):内置变量

由于Make脚本主要是用于对C/C++源代码的编译,因此,其内部也定义了一些专用于C/C++编译的变量.

6:模板目标

假设当前有一个C源代码的项目,当中包含3个C源文件,名称分别为f1.c,f2.c,main.c,当中f1和f2中定义了两个函数,main.c中会使用这两个函数,然后能够编写一个脚本文件,脚本源代码例如以下:

.PHONY: test
test: f1.o f2.o main.o
    gcc -o main.bin f1.o f2.o main.o
f1.o: f1.c
    gcc f1.c f1.o
f2.o: f2.c
    gcc f2.c f2.o
main.o: main.c
    gcc main.c -c main.o

当源代码数量较多,则脚本文件的定义就会变得繁琐起来.这样我们使用一种”模板”来定义目标,使用模板目标后,以上的脚本能够简化为:

OBJ = f1.o f2.o f3.o
.PHONY: test
test: $(OBJ)
    gcc $(OBJ) -o main.bin
%.o: %.c
    gcc -c -o [email protected] $<

7:目标特定的变量赋值

在脚本文件里,当给某个变量赋值后,则之后不管Make哪个目标,该变量的值都是同样的,例如以下面代码所看到的:

CFLAGS = -c
.PHONY: tar1
tar1:
    gcc $(CFLAGS) main.c
tar2 : CFLAGS=
tar2:
    gcc $(CFLAGS) main.c

CFLAGS被赋值为-c,其值在整个脚本文件范围内都是有效的.比方当Make tar1的时候,就会运行gcc -c main.c.可是在tar2目标中,我们希望能够运行gcc main.c,因此能够在tar2目标中对CFLAGS变量又一次赋值,该赋值仅在tar2目标的命令中有效,这就是所谓的”目标特定”变量赋值.由于该赋值仅针对该目标.

语法上须要注意,对tar2目标的赋值不能直接写成下面形式:

tar2 : CFALGS =
    gcc $(CFLAGS) main.c

而是必须分开写,即把目标变量赋值和目标规则分开写.

时间: 2024-10-20 09:01:13

第一章--linux基础的相关文章

APUE学习笔记:第一章 UNUX基础知识

1.2 UNIX体系结构 从严格意义上,可将操作系统定义为一种软件(内核),它控制计算机硬件资源,提供程序运行环境.内核的接口被称为系统调用.公用函数库构建在系统调用接口之上,应用软件即可使用公用函数库,也可使用系统调用.shell是一种特殊的应用程序,它为运行其他应用程序提供了一个接口 从广义上,操作系统包括了内核和一些其他软件,这些软件使得计算机能够发挥作用,并给予计算机以独有的特性(软件包括系统实用程序,应用软件,shell以及公用函数库等) 1.3  shell shell是一个命令行解

第一章计算机基础

第一章 计算机基础 1.1 硬件 计算机基本的硬件由:CPU / 内存 / 主板 / 硬盘 / 网卡 / 显卡 等组成,只有硬件但硬件之间无法进行交流和通信. 人用程序通过编程语言解释器,指令操作系统,最终控制电脑硬件来做符合人们需求的过程 1.2 操作系统 操作系统用于协同或控制硬件之间进行工作,常见的操作系统有那些: windows linux centos [公司线上一般用] mac 1.3 解释器或编译器 编程语言的开发者写的一个工具,将用户写的代码转换成010101交给操作系统去执行

Linux内核分析——第一章 Linux内核简介

第一章   Linux内核简介 一.Unix的历史 1.Unix系统成为一个强大.健壮和稳定的操作系统的根本原因: (1)简洁 (2)在Unix中,很多东西都被当做文件对待.这种抽象使对数据和对设备的操作都是通过一套相同的系统调用借口来进行的:open(),read(),write(),lseek()和close(). (3)Unix的内核和相关的系统工具软件是用C语言编写而成.(移植能力) (4)进程创建非常迅速,并且有一个非常独特的fork()系统调用. (5)Unix提供了一套非常简单但又

萌新向Python数据分析及数据挖掘 第一章 Python基础 (上)未排版

因word和博客编辑器格式不能完全对接,正在重新排版,2019年1月1日发出第一章完整版 本文将参考<Python编程 从入门到实践>的讲述顺序和例子,加上自己的理解,让大家快速了解Python的基础用法,并将拓展内容的链接添加在相关内容之后,方便大家阅读. 好了!我们开始第一章的学习. 第一章 Python基础 python安装以及环境搭建 python的安装和环境变量的配置通过百度查询即可解决,这里不作赘述. IDE的选择:因为后期需要用来做数据分析,所以直接安装Anaconda会是一个不

萌新向Python数据分析及数据挖掘 第一章 Python基础 第一节 python安装以及环境搭建 第二节 变量和简单的数据类型

本文将参考<Python编程 从入门到实践>的讲述顺序和例子,加上自己的理解,让大家快速了解Python的基础用法,并将拓展内容的链接添加在相关内容之后,方便大家阅读. 好了!我们开始第一章的学习. 第一章 Python基础 第一节 Python安装以及环境搭建 Python的安装和环境变量的配置通过百度查询即可解决,这里不作赘述. IDE的选择:因为后期需要用来做数据分析,所以直接安装Anaconda会是一个不错的选择. Anaconda详细安装使用教程 https://blog.csdn.

萌新向Python数据分析及数据挖掘 第一章 Python基础 第八节 函数

第一章 Python基础 第八节 函数 定义函数 函数 其实就可以理解为外挂,把一些常用的.重复率比较多你又不想重复写的东西写进函数,加上开关实现简化操作 举个简单的例子 1 def greet_user(username): 2 #定义一个叫做"迎接用户"的外挂,让他能直接打印一个问候语,括号里面是函数需要输入的东西,也就是个性化的东西 3 """先是简单的问候语""" 4 print("Hello! "

萌新向Python数据分析及数据挖掘 第一章 Python基础 第九节 类

第一章 Python基础 第九节 类 面向对象编程时,都会遇到一个概念,类,python也有这个概念,下面我们通过代码来深入了解下. 其实类 和函数都是为了节省代码,有了类的的概念,就可以把相同的代码写在父类,子类继承后就可以直接使用,而且通过选择对应的父类就可以直接使用对应父类的内容. 创建和使用类 1 class Dog(): #认识狗这类东西 2 def __init__(self, name, age): #狗是肯定有名字和年龄的,是个狗就有,要用户填写 3 self.name = na

萌新向Python数据分析及数据挖掘 第一章 Python基础 第十节 文件和异常

第一章 Python基础 第十节 文件和异常 从文件中读取数据 读取文件.文件路径   1 filename = 'pi_digits.txt' #文件名取个代号 2 #读取整个文件 3 with open(filename) as file_object: 4 contents = file_object.read()# 给内容取个代号 5 print(contents.rstrip()) 6 #逐行读取 7 with open(filename) as file_object: 8 for

第一章 计算机基础知识

第一章 计算机基础知识 第一部分 概述 1.1946年2月15日,第一台计算机 ENIAC 2.物理原件(电子原件) 第一代:电子管.第二代:晶体管.第三代:中小规模集成电路.第四代:超大规模集成电路.第五代:超导材料.第六代:人工智能.#考试考到第四代. 3.计算机的分类 巨型机,大型机,中型机,小型机,微型机 现在的巨型机也是存在的 4.微处理器(CPU.中央处理器)由控制器.寄存器.运算器组成 第二部分 微机系统的组成 CPU>内存>外存 #速度 CPU和内存之间有一个CACHE,叫做高