# Linux学习记录

参照《Linux命令行大全》一书,对Linux以及Linux命令进行学习。

# 什么是Shell?

最早的计算机大神使用了很多原创术语来定义操作系统中的概念,在架构层次上,我们自顶向下来描述操作系统,可以很明显的看到,早期的程序员大概是把操作系统类比成了一个贝类,贝类则由Kernel (核心)以及保护核心的Shell(外壳)组成。

用户空间
    ↓
Shell (外壳) ← 用户在这里操作
    ↓
系统调用接口
    ↓
Kernel (核心) ← 真正的操作系统核心
    ↓
硬件资源

Shell(壳,区分于内核)是一个程序(一个特殊的进程),它接收由输入设备(键盘)输入的命令并将其传递给操作系统来执行。几乎所有的Linux系统都提供了来自GNU项目的Shell程序Bash(Bourne Again Shell 伯恩的又一个Shell)。以此表明Bash是sh的增强版。 而sh是由史蒂夫.伯恩(Steve Bourne)编写的最初的Unix Shell程序。

  • root用户登录系统
#使用root用户登录Linux系统,我们可以看到"[root@VM-8-5-centos ~]#"的shell命令提示,
# 其中root代表登录系统的用户,
# VM-8-5-centos代表主机名,
# @符号用于分割用户以及后面的主机名,
# ~代表当前工作的目录,
# #表示当前用户拥有超级用户权限。
[root@VM-8-5-centos ~]#
  • 非root用户登录系统
# 使用非root用户登录Linux系统,我们可以看到"[lighthouse@VM-8-5-centos ~]$"的shell命令提示,
# 其中lighthouse代表登录系统的用户,
# VM-8-5-centos代表主机名,
# @符号用于分割用户以及后面的主机名,
# ~代表当前工作的目录,
# $表示当前用户是普通用户,不具有超级用户权限。
[lighthouse@VM-8-5-centos ~]$

# 什么是软链接与硬链接?

  • 软链接

软链接与windows里的“快捷方式”概念一致。可以对文件夹以及文件创建软链接。软链接的内容与源文件保持一致。

[root@VM-8-5-centos test]# ln -s test1 test3
[root@VM-8-5-centos test]# ls
test1  test2  test3
[root@VM-8-5-centos test]# vim test1
[root@VM-8-5-centos test]# cat test1
abcdef
[root@VM-8-5-centos test]# cat test2
abcdef
[root@VM-8-5-centos test]# cat test3
abcdef
[root@VM-8-5-centos test]# ls -l
total 8
-rw-r--r-- 2 root root 7 Dec 14 10:14 test1
-rw-r--r-- 2 root root 7 Dec 14 10:14 test2
# 这里可以很明显的看到test3是一个软链接,指向的源文件是test1
lrwxrwxrwx 1 root root 5 Dec 14 10:14 test3 -> test1
[root@VM-8-5-centos test]#
  • 硬链接

硬链接与软链接对应,Linux只支持对文件创建硬链接(不支持对文件件创建),硬链接文件和源文件完全一致,类似克隆体,通过ls -li 指令可以看到文件的i节点号,节点号一致的文件互为硬链接。没办法区分谁是源文件,谁是硬链接。

[root@VM-8-5-centos danmu]# cd test
[root@VM-8-5-centos test]# ls
[root@VM-8-5-centos test]# ls
test1
# 这里将test1作为源文件创建了test2
[root@VM-8-5-centos test]# ln test1 test2
[root@VM-8-5-centos test]# ls
test1  test2
# 要想区分硬链接和源文件,只能通过ls -li指令,这里可以看到test1和test2的i节点号相同,
# 都是925154,因此他们是同一个文件,至于哪个是源文件,哪个是硬链接,则没办法区分,也没必要区分。
[root@VM-8-5-centos test]# ls -li
total 8
925154 -rw-r--r-- 2 root root 7 Dec 14 10:14 test1
925154 -rw-r--r-- 2 root root 7 Dec 14 10:14 test2
[root@VM-8-5-centos test]# ls
test1  test2
[root@VM-8-5-centos test]# vim test1
[root@VM-8-5-centos test]# cat test2
123451234512345123451234512345123451234512345123451234512345
[root@VM-8-5-centos test]#

# Linux中标准输入,标准输出分别指的是什么?

Linux系统中对输入以及输出做了抽象处理,在运行Linux程序的时候,秉持着“一切皆文件”的原则,Linux会将程序的运行结果和消息状态分别发送到stdout(标准输出Standard Output)以及stderr(标准错误Standard error)的特殊文件中。在默认情况下,标准输出以及标准错误都指向显示器Console,并不会保存为磁盘文件。
此外,许多程序从stdin(标准输入Standard Inoout)中获取输入,默认情况下,标准输入与键盘相关联。

# Linux中如何进行标准输入,标准输出的重定向操作?

标准输入/输出重定向允许我们修改输入的来源以及输出结果的去向。通常来讲,输出结果会显示在显示器,而输入则来自键盘,但有了标准输出/输出重定向,这两者我们都可以改变。

  • 重定向输出

使用>以及>>这两个特殊操作符可以重定向输出,>代表在输出对象的头部写入内容,而>>则代表在输出对象的尾部追加内容

重定向输出示例

使用>将标准输出重定向到文件中。

[root@VM-8-5-centos ~]# ls -l /usr/bin > ls-output.txt
[root@VM-8-5-centos ~]# ls
ls-output.txt
[root@VM-8-5-centos ~]# cat ls-output.txt
total 381668
-rwxr-xr-x    1 root root       41488 Nov 17  2020 [
-rwxr-xr-x    1 root root      107848 Feb  3  2021 a2p
-rwxr-xr-x    1 root root       11248 Oct  2  2020 abrt-action-analyze-backtrace
-rwxr-xr-x    1 root root       11240 Oct  2  2020 abrt-action-analyze-c
-rwxr-xr-x    1 root root        1345 Oct  2  2020 abrt-action-analyze-ccpp-local
-rwxr-xr-x    1 root root        6821 Oct  2  2020 abrt-action-analyze-core
-rwxr-xr-x    1 root root       11224 Oct  2  2020 abrt-action-analyze-oops
...

使用>创建一个新文件。

[root@VM-8-5-centos ~]# > ls-output1.txt
[root@VM-8-5-centos ~]# ls
ls-output1.txt  ls-output.txt

使用>>将重定向的标准输出追加到文件尾部。

# 查看文件大小
[root@VM-8-5-centos ~]# ls -l ls-output.txt
-rw-r--r-- 1 root root 347070 Dec 15 09:59 ls-output.txt
# 追加输出到文件的尾部
[root@VM-8-5-centos ~]# ls -l /usr/bin >> ls-output.txt
# 再一次查看文件大小,可以看到文件大小变大
[root@VM-8-5-centos ~]# ls -l ls-output.txt
-rw-r--r-- 1 root root 416484 Dec 15 09:59 ls-output.txt

使用>将标准错误重定向到文件中。

# 这条指令有问题,2和>中间包含了一个空格,所以这里变成了三条指令
# ls -l /bin/usr 执行之后会把错误信息打印在console里
# 2这个不知道是什么指令,所以执行报错了
# > ls-error.txt 则创建一个文件
[root@VM-8-5-centos ~]# ls -l /bin/usr 2 > ls-error.txt
ls: cannot access /bin/usr: No such file or directory
# 这里的2是当做了一条指令执行了
ls: cannot access 2: No such file or directory
# 可以看到创建了文件
[root@VM-8-5-centos ~]# ls
ls-error.txt
# 使用cat看不到文件里的内容,因为本身文件没内容
[root@VM-8-5-centos ~]# cat ls-error.txt
# 正确的指令
[root@VM-8-5-centos ~]# ls -l /bin/usr 2> ls-error.txt
# 使用cat可以看到文件里的内容
[root@VM-8-5-centos ~]# cat ls-error.txt
ls: cannot access /bin/usr: No such file or directory

使用&>以及&>>将标准输出以及标准错误重定向到文件中。

# 将标准输出以及标准错误重定向到文件中
[root@VM-8-5-centos ~]# ls -l /bin/usr &> ls-output.txt
[root@VM-8-5-centos ~]# ls
ls-output.txt
[root@VM-8-5-centos ~]# cat ls-output.txt
ls: cannot access /bin/usr: No such file or directory
# 将标准输出以及标准错误重定向并追加到文件中
[root@VM-8-5-centos ~]# ls -l /bin/usr &>> ls-output.txt
[root@VM-8-5-centos ~]# cat ls-output.txt
ls: cannot access /bin/usr: No such file or directory
ls: cannot access /bin/usr: No such file or directory

丢弃用不到的输出结果。

[root@VM-8-5-centos ~]# ls -l /bin/usr 2> /dev/null
[root@VM-8-5-centos ~]# cat /dev/null
[root@VM-8-5-centos ~]#
  • 重定向输入

重定向输入指令<一般不会直接使用,都是在使用cat指令的时候隐式调用。

重定向输入示例
# 使用cat指令将test.txt输入到控制台console中
[root@VM-8-5-centos ~]# cat test.txt
howl test
yes
# 使用cat指令+ < 输入重定向指令将输入重定向到test.txt,同时输出到控制台上
[root@VM-8-5-centos ~]# cat < test.txt
howl test
yes

# 什么是管道?

在linux中,管道是一种进程间通信机制,使用管道可以把一个程序的输出直接连接到另一个程序的输入。从本质上说,管道也是一种文件(虚文件)。如果两个进程需要通信,就必须提前设置管道。

管道操作符“ | ”如何使用

Shell的管道特性利用了命令能够从标准输入读取数据并将数据发送到标准输出的能力。通过管道操作符“ | ”,可以将一个命令的标准输出传递到另一个命令的标准输入。

# 基础语法

command1 | command2

# 常见示例

将ls指令的输出结果写入到less指令的输入。

# 使用这个指令可以在less里查看/usr/bin文件夹下的文件清单。
[root@VM-8-5-centos ~]# ls -l /usr/bin | less

# Linux中属主,属组,其他用户具体指什么?

我们都知道,现代计算机有一个很重要的功能就是支持多用户同时访问。Linux当然也支持多用户同时访问。这就涉及到多用户(属主)以及用户组(属组)的概念了。

  • 属主

Linux里,每一个用户(user)称作一个属主,每个属主必定存在于一个主属组(group)中,此外,他还可以存在于其他属组中。

  • 属组

属组对应的就是用户组group的概念,一个属组里可以有零到多个用户。

  • 其他用户

Linux中一个文件一定属于一个属主(用户),该属主可以分配文件的权限是仅自己可操作(读写执行),还是自己的属组中所有用户都可操作(读写执行),或者其他用户也可操作(读写执行)。

# Linux中文件的权限怎么查看?

这里我们以下面的示例来讲解一下Linux中文件的权限要怎么查看。

[root@VM-8-5-centos data]# ls -l
total 4
# 可以看到这里有一串字符"drwxr-xr-x",字符有10个

# 第一个字符:代表文件类型,d代表文件夹,详细的文件类型见下表
# - 普通文件。
# d 目录文件。
# l 软链接。对于软链接来说,文件属性使用是rwxrwxrwx,它是个伪属性。软链接所执行的文件属性才是真正的文件属性。
# c 字符设备文件。常见的字符设备有终端以及调制解调器。
# b 块设备文件。常见的块设备有光盘驱动以及硬盘驱动。

# 第二到四个字符:所有者权限,
# 其中第二个字符为r代表有读权限,为-代表不具有读权限
# 第三个字符为w代表有写权限,为-代表不具备写权限
# 第四个字符为x代表具有执行权限(允许把文件当做程序来执行),为-代表不具有执行权限

# 第五到七个字符:组权限

# 第八到十个字符:其他用户权限
drwxr-xr-x 4 root root 4096 Dec  5 14:34 kieoo

# Linux环境变量都有哪些?

Linux中环境变量分两个级别,分别是用户级别(对应/.bashrc以及/.bash_profile文件),系统级别(对应/etc/bashrc,/etc/environment,/etc/profile,/etc/profile.d文件)。

# Linux中环境变量的执行顺序是什么?

环境变量的执行先后顺序为/etc/enviroment –> /etc/profile –> /etc/profile.d –> ~/.bash_profile –> /etc/bashrc –> ~/.bashrc。

# Linux中环境变量如何修改?

这里以jdk的环境变量为例讲解一下如何配置环境变量。

使用vim指令修改/etc/profile,使用i键修改文件,将export JAVA_HOME=/app/java/jdk-17.0.8以及export PATH=$JAVA_HOME/bin:$PATH配置到环境变量中。然后使用Esc键结束修改,然后使用:wq保存修改。

# java environment
export JAVA_HOME=/app/java/jdk-17.0.8
export PATH=$JAVA_HOME/bin:$PATH

# System wide environment and startup programs, for login setup
# Functions and aliases go in /etc/bashrc

# It's NOT a good idea to change this file unless you know what you
# are doing. It's much better to create a custom.sh shell script in
# /etc/profile.d/ to make custom changes to your environment, as this
# will prevent the need for merging in future updates.
pathmunge () {
    case ":${PATH}:" in
        *:"$1":*)
            ;;
        *)
            if [ "$2" = "after" ] ; then
                PATH=$PATH:$1
            else
                PATH=$1:$PATH
            fi
    esac
}
...

使用source /etc/profile指令刷新配置文件,使配置立刻生效。

[root@VM-8-5-centos ~]# source /etc/profile

# Linux中有哪些常用的快捷键?

以下表格列出了Linux中常用的快捷键。

  • 光标移动
组合键 操作
Ctrl+A 将光标移动到行首。
Ctrl+E 将光标移动到行尾。
Alt+F 将光标向前移动一个单词。
Alt+B 将光标向后移动一个单词。
Ctrl+L 清除屏幕,将光标移动到左上角。等同于clear指令。
Ctrl+F 将光标向前移动一个字符,相当于→方向键。
Ctrl+B 将光标向后移动一个字符,相当于←方向键。
  • 修改文本
组合键 操作
Ctrl+D 删除光标处的字符。
Ctrl+T 将光标处字符与其之前的字符对调。
Alt+T 将光标处的单词与其之前的单词对调。
Alt+L 将从光标处到单词结尾的字符替换为小写。
Alt+U 将从光标处到单词结尾的字符替换为大写。
  • 剪切和粘贴文本
组合键 操作
Ctrl+K 剪切从光标处到行尾的文本。
Ctrl+U 剪切行首到光标处的文本。
Alt+D 剪切从光标处到当前单词结尾的文本。
Alt+BackSpace 剪切从光标处到当前单词开头的文本。如果光标已处于单词开头,则剪切上一个单词。
Ctrl+Y 将kill-ring缓冲区内的文本粘贴到光标处。
  • 补全功能
组合键 操作
Tab 文本补全。
Alt+$ 显示可能的补全结果。在多数系统中,你也可以通过按两次Tab键实现相同的功能。
Alt+* 插入所有可能的补全结果。当你想使用多个结果的时候,该组合键就能派上用场了。

# Linux中程序如何在后台运行?

在Linux系统中,使用&符号可以让程序在后台运行,如下:

# 可以看到这里以守护进程的方式启动了一个jar包
[root@VM-8-5-centos back]# java -jar movie-0.0.1-SNAPSHOT.jar &
[1] 31097
[root@VM-8-5-centos back]#
  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v3.1.0)

2023-12-18T17:22:01.621+08:00  INFO 31097 --- [           main] com.kieoo.movie.KieooMovieApplication    : Starting KieooMovieApplication v0.0.1-SNAPSHOT using Java 17.0.8 with PID 31097 (/app/back/movie-0.0.1-SNAPSHOT.jar started by root in /app/back)
2023-12-18T17:22:01.624+08:00  INFO 31097 --- [           main] com.kieoo.movie.KieooMovieApplication    : No active profile set, falling back to 1 default profile: "default"
2023-12-18T17:22:03.392+08:00  INFO 31097 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 7000 (http)
2023-12-18T17:22:03.403+08:00  INFO 31097 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2023-12-18T17:22:03.404+08:00  INFO 31097 --- [           main] o.apache.catalina.core.StandardEngine    : Starting Servlet engine: [Apache Tomcat/10.1.8]
2023-12-18T17:22:03.490+08:00  INFO 31097 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/api]    : Initializing Spring embedded WebApplicationContext
2023-12-18T17:22:03.492+08:00  INFO 31097 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1685 ms
2023-12-18T17:22:04.475+08:00  INFO 31097 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 7000 (http) with context path '/api'
2023-12-18T17:22:04.505+08:00  INFO 31097 --- [           main] com.kieoo.movie.KieooMovieApplication    : Started KieooMovieApplication in 3.581 seconds (process running for 4.169)
# 使用ctrl+C退出shell占用
[root@VM-8-5-centos back]# ps aux | grep java
# 可以看到 31097进程依然在守护进程状态下执行
root     31097 13.8  8.6 3232616 177360 pts/0  Sl   17:21   0:08 java -jar movie-0.0.1-SNAPSHOT.jar
root     31403  0.0  0.0 112812   972 pts/0    S+   17:23   0:00 grep --color=auto java

# Linux中如何编译安装程序?

在Linux中编译安装程序一般需要经过如下步骤:

  • 下载并解压缩源代码包
    一般我们可以通过wget指令下载到源代码包,也可以下载完成后手动上传到服务器上,源码包一般是.tar后缀的归档文件。将tar包上传到服务器上之后,我们需要首先解压缩tar包。

  • 执行./configure脚本
    在解压缩后的源代码包文件夹下,我们可以看到configure脚本,执行该脚本,如执行成功,会看到生成一个名为Makefile的文件。如执行失败,需要根据提示调整后重新执行该脚本。

  • 执行make指令
    在./configure脚本执行成功后,执行make指令,make指令执行成功后,可以在当前路径看到insatll文件。

  • 执行make install指令
    执行make install指令即可完成程序的编译安装。

提示

1.安装过程中如需回退,可以使用make clean指令。
Nginx安装 (opens new window)

nginx安装后的路径信息

nginx path prefix: "/usr/local/nginx" nginx binary file: "/usr/local/nginx/sbin/nginx" nginx modules path: "/usr/local/nginx/modules" nginx configuration prefix: "/usr/local/nginx/conf" nginx configuration file: "/usr/local/nginx/conf/nginx.conf" nginx pid file: "/usr/local/nginx/logs/nginx.pid" nginx error log file: "/usr/local/nginx/logs/error.log" nginx http access log file: "/usr/local/nginx/logs/access.log" nginx http client request body temporary files: "client_body_temp" nginx http proxy temporary files: "proxy_temp" nginx http fastcgi temporary files: "fastcgi_temp" nginx http uwsgi temporary files: "uwsgi_temp" nginx http scgi temporary files: "scgi_temp"

nginx相关脚本指令

#启动脚本是在 #/usr/local/nginx/sbin/nginx #启动, /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf #停止 /usr/local/nginx/sbin/nginx -s stop #重载 /usr/local/nginx/sbin/nginx -s reload #杀掉nginx /usr/local/nginx/sbin/nginx -s quit

# Nginx默认的配置路径分别是哪些?

在yum安装Nginx之后,默认执行/usr/sbin/nginx启动nginx,在/etc/nginx中存放了nginx的配置文件,而nginx的静态资源则存放在/usr/share/nginx/html目录。

# HTTP状态码都有哪些,有什么规律?

比较常见的HTTP状态码有500,404,403,401,302,301,201,200。
可以看到,数字越大,问题越严重,500代表服务器问题,404代表找不到服务,403代表找得到服务,但是服务不返回(一般是Nginx没有文件的读写权限导致),403(请求带了token,但是token无效),401(请求过程没有携带token),304(静态资源没有做过修改),302(临时重定向,常见于SD单点登录系统),301(永久重定向,一个比较常见的案例就是老站迁移到新站,老站直接关闭后,老站的页面已经被搜索引擎收录了,这个时候使用永久重定向方案。),201(请求成功并且服务器创建了新的资源),200状态码(请求成功)。

# 补充资料

# 现代微计算机(PC机)的两大基石是什么?

现代操作系统的两大基石指的是操作系统(最早的PC机操作系统是由加里·基尔代尔开发实现)以及微处理器(CPU,最早的微处理器由特德·霍夫发明,他也被称为微处理器之父)。

# 什么是操作系统?

操作系统是负责将我们对输入设备的输入信号转交给微处理器(CPU)/其他设备处理,同时将微处理器的输出信号转交给输出设备显示的软件。比如我现在就在操作鼠标和键盘这两个输入设备, 向其中写入输入信号,windows操作系统将我的输入信号转交CPU处理后,输出信号展示在我的显示器上。 现代操作系统中如此定义操作系统:操作系统是计算机的一个软件,它的任务是为用户程序提供一个更好,更简单,更清晰的计算机模型,用于管理处理器,主存,磁盘,鼠标,键盘,网络接口等输入/输出设备。

# 操作系统有哪些功能?

  • 处理器管理
    计算机系统中最重要的资源是中央处理机,任何计算都必须在CPU上运行。在处理机管理中最核心的问题是CPU时间的分配,这涉及分配的策略和方法。处理机管理的功能主要有:确定进程调度的策略;给出进程调度算法;进行处理机分派。这里主要强调的是CPU的时间片管理(CPU的时间管理)。
  • 存储器管理(内存分配与管理)
    任何程序的执行都必须从主存中获取数据信息。现代操作系统非常重视主存的存储调度和处理机调度的结合,在主存分配时,将程序中当前最需要的分布调入主存,这样这部分程序马上可以投入运行。即只有当程序在主存时,它才有可能到处理机上执行,而且仅当它可以到处理机上运行时才把它调入主存,这种调度能实现最大化的主存使用。存储管理的功能主要有:内存地址映射;内存分配与回收;内存保护;内存扩充。这里主要强调的是多个程序的内存管理。即多个程序都可以同时使用内存,每个程序使用内存的不同空间(内存的空间管理)。
  • 设备管理
    设备(如IO)映射,设备分配,设备传输控制。
  • 文件操作
    为用户提供一种简便的,统一的存取和管理信息的方法,并要解决信息的共享、数据的存取控制和保密等问题。文件系统主要功能为:实现用户的信息组织;提供存取方法;实现文件的共享和文件安全,还要保证文件的完整性;完成磁盘空间分配任务。对磁盘进行分块使用以及管理。
  • 程序装载
    操作系统需要可以将程序装载到内存并且执行。
  • 提供API用于操作硬件
    为程序提供方便访问计算机硬件(主要是CPU)的手段是操作系统的第三个主要功能。操作系统提供的这种访问手段称之为应用程序接口,即API(application programming interface)。
  • 并行运行多道程序
    也就是说操作系统要提供进程的特性。

# Nginx配置反向代理,去除特定前缀

Nginx反向代理配置去除前缀 (opens new window)

# Spring中通过Map/List注入对象

在Spring中,我们可以在声明泛型的List属性上添加@Resource注解,如List,这样Spring会将A类及子类的bean注入到集合中。

# Nginx报错413

Nginx出现“ 413 (499 502 404) Request Entity Too Large”错误解决方法 (opens new window)

# 现代计算机的两个核心组件分别是什么?

现代化计算机的两个核心组件分别是微处理器(CPU)以及操作系统

# 微处理器

CPU(‌中央处理器)‌是计算机硬件系统的核心,‌负责执行各种指令和进行数据处理。‌它包括算术逻辑单元(‌ALU)‌、‌控制单元(‌CU)‌和寄存器等组件,‌CPU的性能直接影响到计算机系统的运行速度和处理能力。

微处理器之父-特德·霍夫

特德·霍夫 (opens new window)

# 操作系统

操作系统是计算机系统的核心软件,‌负责管理和控制计算机的硬件资源,‌并提供用户与计算机系统之间的接口。‌常见的操作系统有Windows、‌Linux、‌macOS等。‌操作系统通过提供用户界面和系统服务,‌使得用户可以更加方便地使用计算机硬件资源。

操作系统之父-加里·基尔代尔

加里·基尔代尔 (opens new window)

# 软件,硬件,固件之间的区别?

# 软件

软件是指计算机系统中的各种程序和操作系统,它们通过一系列指令来执行特定任务。软件分为系统软件和应用软件两类。系统软件包括操作系统(如Windows、Linux)和系统工具(如驱动程序),它们负责管理计算机硬件资源并提供基础运行环境。应用软件则是为用户提供特定功能的程序,例如办公软件、浏览器和游戏等。
软件的主要特点是其易变性和可更新性。用户可以随时安装、卸载和升级软件,以满足不同的需求或修复问题。

# 硬件

硬件是指构成计算机系统的物理设备和组件,包括中央处理器(CPU)、内存、硬盘、显示器和输入设备(如键盘、鼠标)等。硬件是计算机系统的基础,提供了运行软件所需的物理资源。
硬件的特点是其物理实体性和持久性。硬件设备的更换和升级通常需要实际的物理操作,并且硬件的使用寿命相对较长。

# 固件

固件介于软件和硬件之间,是嵌入在硬件设备中的特定程序。这些程序通常存储在只读存储器(ROM)或闪存(Flash Memory)中,用于控制硬件设备的基本功能。固件是硬件的“操作系统”,在设备启动和运行过程中起到关键作用。
与软件不同,固件不易变更,通常只有在设备厂商提供更新时才会进行升级。固件的稳定性和可靠性至关重要,因为它直接影响设备的基本功能和性能。计算机中比较常见的固件是BIOS引导程序及其硬件。

# 操作系统如何运行

当按下电脑开机键(专业术语叫加电)后,BIOS会执行引导程序,此时操作系统的代码会被加载到内存中执行,操作系统执行会进入while循环的代码,如进行操作,如按下键盘鼠标,就会触发中断,执行中断事件。此外CPU在加电之后也是一直在做运算,如果当前没有任务,CPU也会进入while循环,做一个无意义的重复计算,有点像是人的睡眠动作。

void main(void) {
    ROOT_DEV = ORIG_ROOT_DEV;
    drive_info = DRIVE_INFO;
    memory_end = (1<<20) + (EXT_MEM_K<<10);
    memory_end &= 0xfffff000;
    if (memory_end > 16*1024*1024)
        memory_end = 16*1024*1024;
    if (memory_end > 12*1024*1024) 
        buffer_memory_end = 4*1024*1024;
    else if (memory_end > 6*1024*1024)
        buffer_memory_end = 2*1024*1024;
    else
        buffer_memory_end = 1*1024*1024;
    main_memory_start = buffer_memory_end;

    mem_init(main_memory_start,memory_end);
    trap_init();
    blk_dev_init();
    chr_dev_init();
    tty_init();
    time_init();
    sched_init();
    buffer_init(buffer_memory_end);
    hd_init();
    floppy_init();

    sti();
    move_to_user_mode();
    if (!fork()) {
        // 在这个初始化方法里会初始化中断事件
        init();
    }
    // 这里就是关键的while循环部分
    for(;;) pause();
}
品读 Linux 0.11 核心代码

品读 Linux 0.11 核心代码 (opens new window)