.

  1. 如何学习

有压力才有动力,前面也是小打小闹

学linux不能和单片机一样,先要跑通,有精力再研究细节。

  1. esp 与 bsp

esp是栈指针,是cpu机制决定的,push、pop指令会自动调整esp的值;

ebp只是存取某时刻的esp,这个时刻就是进入一个函数内后,cpu会将esp的值赋给ebp,此时就可以通过ebp对栈进行操作,比如获取函数参数,局部变量等,实际上使用esp也可以;

既然使用esp也可以,那么为什么要设定ebp呢?

答案是为了方便程序员。

因为esp在函数运行时会不断的变化,所以保存一个一进入某个函数的esp到ebp中会方便程序员访问参数和局部变量,而且还方便调试器分析函数调用过程中的堆栈情况。前面说了,这个ebp不是必须要有的,你非要使用esp来访问函数参数和局部变量也是可行的,只不过这样会麻烦一些。原文链接

  1. 一些文件夹

根目录下的很多文件夹都只是个索引,都指向usr(unix system resource)里面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
lrwxrwxrwx   1 root root      7 Feb 20  2021 bin -> usr/bin
drwxr-xr-x 2 root root 4096 Feb 20 2021 boot
drwxr-xr-x 8 root root 2740 Sep 28 13:26 dev
drwxr-xr-x 104 root root 4096 Sep 28 13:26 etc
drwxr-xr-x 4 root root 4096 Mar 24 2023 home
-rwxr-xr-x 4 root root 644432 Dec 14 2022 init
lrwxrwxrwx 1 root root 7 Feb 20 2021 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Feb 20 2021 lib32 -> usr/lib32
lrwxrwxrwx 1 root root 9 Feb 20 2021 lib64 -> usr/lib64
lrwxrwxrwx 1 root root 10 Feb 20 2021 libx32 -> usr/libx32
drwx------ 2 root root 16384 Apr 11 2019 lost+found
drwxr-xr-x 2 root root 4096 Feb 20 2021 media
drwxr-xr-x 8 root root 4096 Aug 26 2021 mnt
drwxr-xr-x 2 root root 4096 Feb 20 2021 opt
drwxr-xr-x 3 root root 4096 Apr 2 2023 path
dr-xr-xr-x 156 root root 0 Sep 28 13:26 proc
drwx------ 7 root root 4096 Sep 20 23:13 root
drwxr-xr-x 9 root root 180 Sep 28 16:45 run
lrwxrwxrwx 1 root root 8 Feb 20 2021 sbin -> usr/sbin
drwxr-xr-x 6 root root 4096 Feb 20 2021 snap
drwxr-xr-x 2 root root 4096 Feb 20 2021 srv
dr-xr-xr-x 11 root root 0 Sep 28 13:26 sys
drwxrwxrwt 75 root root 86016 Sep 28 16:49 tmp
drwxr-xr-x 15 root root 4096 May 15 2022 usr
drwxr-xr-x 13 root root 4096 Feb 20 2021 var

/etc/passwd可以查看系统的用户,以及登陆的方式,/etc/shadow则保存了用户的密码,群组名称都纪录在/etc/group内

var/log可以查看很多日志

SATA接口的硬盘对应的文件名字:/dev/sd[a-d]

虚拟机中的磁盘文件是: /dev/vd[a-p]

man 指令的手册存放位置:/usr/share/man,info指令的存放到/usr/share/info,指令的更多相关信息也可以存放到/usr/share/doc下面

3.linux发行版异同

相同的FHS(文件系统)和LSB,同样使用 http://www.kernel.org 所释出的核心,几乎相同的操作接口

不同:各开发商加入的应用工具不同,使用的套件管理模式不同(dpkg 与 RPM)

4.多用户&多任务

​ 何谓多用户 ( Multi-user ) 多任务 ( Multitask )?Multiuser 指的是 Linux 允许多人同时连上主机之外,每个使用者皆有其各人的使用环境,并且可以同时使用系统的资源! Multitask 指的是多任务环境,在 Linux 系统下, CPU 与其他例如网络资源可以同时进行多项工作, Linux 最大的特色之一即在于其多任务时,资源分配较为平均!

5.MBR&gpt

MBR:第一个扇区 512Bytes 会有这两个数据:

  • 主要开机记录区(Master Boot Record, MBR):可以安装开机管理程序的地方,有446 Bytes
  • 分区表(partition table):记录整颗硬盘分区的状态,有64 Bytes

按照常理分区表只能记录四个分区,但其中可以有拓展分区(类似指针),就可以达到无限个分区

GPT

磁盘尾有备份,可以用128Bytes来标识一个分区,总共可以表示32 * 4 个分区。

如何开机

启动也需要执行命令,这些命令在主板的BIOS上,一些硬件参数在主板的CMOS上。

  1. BIOS:开机主动执行的固件,会认识第一个可开机的设备;
  2. MBR:第一个可开机设备的第一个扇区内的主要开机记录区块,内含开机管理程序;
  3. 开机管理程序(boot loader):一支可读取核心文件来执行的软件;
  4. 核心文件:开始操作系统的功能…

BIOS与MBR都是硬件本身会支持的功能,至于Boot loader则是操作系统安装在MBR上面的一套软件了。由于MBR仅有446 Bytes而已,因此这个开机管理程序是非常小而美的。 这个boot loader的主要任务有下面这些项目:

  • 提供菜单:使用者可以选择不同的开机项目,这也是多重开机的重要功能!
  • 载入核心文件:直接指向可开机的程序区段来开始操作系统;
  • 转交其他loader:将开机管理功能转交给其他loader负责。

通用shell指令

一般是这样的:

1
command  [-options]  parameter1  parameter2 ...
  • 第一个一定是指令名称

  • 第二个是选项名称,一般是 单横线+名字首字母,或者是双横线+名字全称。如下:

    1
    2
    3
    4
    5
    6
    Usage: objdump <option(s)> <file(s)>
    Display information from object <file(s)>.
    At least one of the following switches must be given:
    -a, --archive-headers Display archive header information
    -f, --file-headers Display the contents of the overall file header
    -p, --private-headers Display object format specific file header contents
  • 然后跟着参数,参数1,参数2,参数3.。。

  • 可以使用\来换行

  • 可以使用;来分隔不同命令,并依次执行。

  • ctrl+c:停止当前指令

  • ctrl+d:输入结束,EOF

  • 通常出现“command not found”的可能原因为:

    • 这个指令不存在,因为该软件没有安装之故。解决方法就是安装该软件;
    • 这个指令所在的目录目前的用户并没有将他加入指令搜寻路径中,请参考第十章bash的PATH说明;
    • 很简单!因为你打错字!
  • 一般命令都有个--help选项,输入后可以查看该命令相关的说明。

  • 通过man可以查看指令对应的手册,手册第一个可能有一个数字,他代表着

    1
    READ(2)                                       Linux Programmer's Manual

    代号 代表内容
    1 使用者在shell环境中可以操作的指令或可可执行文件
    2 系统核心可调用的函数与工具等
    3 一些常用的函数(function)与函数库(library),大部分为C的函数库(libc)
    4 设备文件的说明,通常在/dev下的文件
    5 配置文件或者是某些文件的格式
    6 游戏(games)
    7 惯例与协定等,例如Linux文件系统、网络协定、ASCII code等等的说明
    8 系统管理员可用的管理指令
    9 跟kernel有关的文件

一些常见的命令

  • who:看谁在线上

  • netstat -a:查看网络的连接状态

  • ps -aux: 查看后台程序

  • chgrp,chown,chmod,改变群组,所有者,权限

    *

    • 元件 内容 叠代物件 r w x
      文件 详细数据data 文件数据夹 读到文件内容 修改文件内容 执行文件内容
      目录 文件名 可分类抽屉 读到文件名 修改文件名 进入该目录的权限(目录一般要给r,x权限)
  • cp source destination,

    • 复制时有些文件权限可能会变,加上-a可以避免
    • -s可以创建文件的链接文件,复制成为符号链接文件 (symbolic link),亦即“捷径”文件;
    • -l :进行硬式链接(hard link)的链接文件创建,而非复制文件本身;(hard link 只是在某个目录下的 block 多写入一个关连数据而已,既不会增加 inode 也不会耗用 block 数量哩!)(新建一个目录,他的hard link 数量为2,分别是该目录与 .
  • pwd,显示当前的工作目录

    • pwd -P 显示实际的工作目录,会不以链接文件的数据显示,而是显示正确的完整路径啊

      1
      2
      3
      4
      (yolo) tangjie.zhang@moveai415:lock$ pwd
      /var/lock
      (yolo) tangjie.zhang@moveai415:lock$ pwd -P
      /run/lock
  • mkdir -mp, m代表可以直接设置文件的权限,p代表可以递归创建目录

  • od -t x 文件名,可按照16进制读取文件显示,由于认为文件是数字,会将字节序反转一下。(如果本身是字符串文件,但按照数字读,会导致顺序相反)

  • which -a 命令,会显示该命令的所以路径,本质上根据“PATH”这个环境变量所规范的路径,去搜寻“可执行文件”的文件名

  •  搜索文件,优先使用whereis 或者 locate(3090没有,就没管) ,不行再来用find

    • whereis,只搜索部分路径,可通过 -l参数来查看。

      1
      2
      3
      4
      5
      6
      7
      wher,eis [-bmsu] 文件或目录名
      选项与参数:
      -l :可以列出 whereis 会去查询的几个主要目录而已
      -b :只找 binary 格式的文件
      -m :只找在说明文档 manual 路径下的文件
      -s :只找 source 来源文件
      -u :搜寻不在上述三个项目当中的其他特殊文件
    • find, find [PATH] [option] [action]

      • 与时间相关,find / -mtime 0
      • 与使用者相关,find /home -user dmtsai
      • 与文件权限相关,如 -name, -size, -type [fdlsp], 如,find / -size +1M,find /etc -name ‘*httpd*‘
  • df 列出文件系统的整体磁盘使用量;

  • du:评估文件系统的磁盘使用量(常用在推估目录所占容量)

  • vim相关

    • 一般指令模式
      • 30j,30k代表向下向上移动30行
      • Ctrl f,Ctrl b代表向下向上翻一页
      • ^, $代表移动至一行的第一个,最后一个字符
      • 10 Enter,代表向下移动几行
      • :1,$s/word1/word2/gc,从第一行到最后一行,将word1替换为word2,最后的c代表替代前需要确认​
      • x,delete代表向后删除一个字符,backspace代表向前删除一个字符,前面可以加数字,代表删除多少个。
      • yy复制当前的这一列,nyy代表复制如下的n列,p代表粘贴,
      • u代表复原,撤销,Ctrl r代表重做,.代表重复前一个动作
  • shell,

    • 双引号内的特殊字符如 $ 等,可以保有原本的特性

    • 单引号内的特殊字符则仅为一般字符 (纯文本)

    • 反单引号包围的是一个指令, `ls`与 $(ls)含义都是相同的

    • export让变量可以在当前bash的子进程中生效

    • 可通过env或export查看环境变量。可通过set指令查看环境变量以及bash内的变量

      • shell内的变量,比如PS1可以控制提示字符的形式,$表示线程pid,?表示上个命令的返回值

      • 可以使用export将自定义变量变为全局变量,这个该变量可以被子进程(不是所有进程)所访问。

    • 可以通过ulimit显示和设置一些限制

关机

shutdown,reboot,poweroff,init 0,但其实这些都是通过调用systemctl来实现的(现在好像是systemd)

文件相关

常用的扩展名:

  • *.sh : 脚本或批处理文件 (scripts),因为批处理文件为使用shell写成的,所以扩展名就编成 .sh 啰;
  • Z, .tar, .tar.gz, .zip, *.tgz: 经过打包的压缩文件。这是因为压缩软件分别为 gunzip, tar 等等的,由于不同的压缩软件,而取其相关的扩展名啰!
  • .html, .php:网页相关文件,分别代表 HTML 语法与 PHP 语法的网页文件啰! .html 的文件可使用网页浏览器来直接打开,至于 .php 的文件, 则可以通过 client 端的浏览器来 server 端浏览,以得到运算后的网页结果呢!

FHS定义了很多linux文件夹规范,可查看Linux目录配置 [参考数据 (gitbooks.io)], 官方文档(https://wizardforcel.gitbooks.io/vbird-linux-basic-4e/Text/index.html#reference),摘取部分内容如下:

依据FHS的基本定义,**/usr**里面放置的数据属于可分享的与不可变动的(shareable, static)

目录 应放置文件内容
第一部份:FHS 要求必须要存在的目录
/usr/bin/ 所有一般用户能够使用的指令都放在这里!目前新的 CentOS 7 已经将全部的使用者指令放置于此,而使用链接文件的方式将 /bin 链接至此! 也就是说, /usr/bin 与 /bin 是一模一样了!另外,FHS 要求在此目录下不应该有子目录!
/usr/lib/ 基本上,与 /lib 功能相同,所以 /lib 就是链接到此目录中的!
/usr/local/ 系统管理员在本机自行安装自己下载的软件(非distribution默认提供者),建议安装到此目录, 这样会比较便于管理。你可以自行到/usr/local去看看,该目录下也是具有bin, etc, include, lib…的次目录喔!

如果/usr是安装时会占用较大硬盘容量的目录,那么/var就是在系统运行后才会渐渐占用硬盘容量的目录。 因为/var目录主要针对常态性变动的文件,包括高速缓存(cache)、登录文件(log file)以及某些软件运行所产生的文件, 包括程序文件(lock file, run file),或者例如MySQL数据库的文件等等。常见的次目录有:

目录 应放置文件内容
第一部份:FHS 要求必须要存在的目录
/var/cache/ 应用程序本身运行过程中会产生的一些暂存盘;
/var/lib/ 程序本身执行的过程中,需要使用到的数据文件放置的目录。在此目录下各自的软件应该要有各自的目录。 举例来说,MySQL的数据库放置到/var/lib/mysql/而rpm的数据库则放到/var/lib/rpm去!
/var/log/ 重要到不行!这是登录文件放置的目录!里面比较重要的文件如/var/log/messages, /var/log/wtmp(记录登陆者的信息)等。
/var/run/ 某些程序或者是服务启动后,会将他们的PID放置在这个目录下喔!至于PID的意义我们会在后续章节提到的。 与 /run 相同,这个目录链接到 /run 去了!

常见特殊目录

1
2
3
4
5
.         代表此层目录
.. 代表上一层目录
- 代表前一个工作目录
~ 代表“目前使用者身份”所在的主文件夹
~account 代表 account 这个使用者的主文件夹(account是个帐号名称)

特殊变量

PATH: 指出了文件的路径,他是linux中的一个环境变量,当一个终端打开时时,对应用户的.bashrc等文件被执行,环境变量等被加载到内存中(本身是个变量),供程序使用。这么定义的也是变量,只是名字不同:

1
2
3
(yolo) tangjie.zhang@moveai415:~$ ztj=666
(yolo) tangjie.zhang@moveai415:~$ echo $ztj
666

默认权限

  • 若使用者创建为“文件”则默认“没有可执行( x )权限”,亦即只有 rw 这两个项目,也就是最大为 666 分,默认权限如下:-rw-rw-rw-

  • 若使用者创建为“目录”,则由于 x 与是否可以进入此目录有关,因此默认为所有权限均开放,亦即为 777 分,默认权限如下:drwxrwxrwx

然后,还要计算umask,文件或文件夹对应的三个数字要减去umask的三个数字才会得到默认的权限:(root umask 一般为022,禁止同组写入,而一般用户通常为002,可参考/etc/bashrc内容)

1
2
3
4
5
6
7
8
9
(yolo) tangjie.zhang@moveai415:Software$ umask
0002
(yolo) tangjie.zhang@moveai415:Software$ touch test1
(yolo) tangjie.zhang@moveai415:Software$ mkdir test2
(yolo) tangjie.zhang@moveai415:Software$ ls -l
drwxrwxr-x 28 tangjie.zhang tangjie.zhang 4096 11月 7 2023 anaconda3
-rw-rw-r-- 1 tangjie.zhang tangjie.zhang 0 10月 6 13:03 test1
drwxrwxr-x 2 tangjie.zhang tangjie.zhang 4096 10月 6 13:03 test2
drwxrwxr-x 30 tangjie.zhang tangjie.zhang 4096 9月 27 20:27 valgrind

suid,让普通用户临时拥有该文件的属主的执行权限,suid权限只能应用在二进制可执行文件(命令)上.

sgid,sgid权限一般应用在目录上,当一个目录拥有sgid权限时,任何用户在该目录下创建的文件的属组都会继承该目录的属组。

文件系统特性

分完区后,还需要格式化后才能使用该文件系统。

比如linux,除了数据本身外,还有权限信息和文件属性,文件系统会将这两部分的数据存放在不同的区块,权限与属性放置到 inode 中,至于实际数据则放置到 data block 区块中,还有一个超级区块 (superblock) 会记录整个文件系统的整体信息,包括 inode 与 block 的总量、使用量、剩余量。 一般格式化时会分为若干个组,每个组都有inode,block,superblock等。(每个文件系统都只有一个superblock,说是每个组可能有只是因为可能某些组的是备份)

  • inode,记录文件属性以及block位置等,inode大小为128,256Bytes,系统读取文件时需要先找到inode,判断权限是否满足。每个inode支持存储12个直接指向地址,1个间接,双间接,三间接地址。
  • block,每个文件至少占用一个block
  • superblock,存储整个文件系统相关信息的地方。
    • 未使用与已使用的 inode / block 数量;
    • block 与 inode 的大小 (block 为 1, 2, 4K,inode 为 128Bytes 或 256Bytes);
    • 是否已挂载,挂载时间
  • 文件系统描述,可以描述每个 block group 的开始与结束的 block 号码
  • 区块对照表,可以知道那些块是空的

新建一个文件如要如下步骤:

  1. 确定目录是否有wx权限,有的话才新增
  2. 根据inode bitmap找没有使用的inode号码,
  3. 根据block bitmap 找到没有使用中的 block 号码,并将实际的数据写入 block 中,且更新 inode 的 block 指向数据;
  4. 将inode和block同步至inode bitmap 与 block bitmap,并更新 superblock 的内容。

如果产生了中断导致数据不一致,可以通过日志系统来解决

压缩

常见拓展名:

1
2
3
4
5
6
7
8
9
*.Z         compress 程序压缩的文件;
*.zip zip 程序压缩的文件;
*.gz gzip 程序压缩的文件;
*.bz2 bzip2 程序压缩的文件;
*.xz xz 程序压缩的文件;
*.tar tar 程序打包的数据,并没有压缩过;
*.tar.gz tar 程序打包的文件,其中并且经过 gzip 的压缩
*.tar.bz2 tar 程序打包的文件,其中并且经过 bzip2 的压缩
*.tar.xz tar 程序打包的文件,其中并且经过 xz 的压缩

tar, -j代表bzip2,-z代表gzip,

1
2
3
4
压 缩:tar -jcv -f filename.tar.bz2 要被压缩的文件或目录名称
查 询:tar -jtv -f filename.tar.bz2
解压缩:tar -jxv -f filename.tar.bz2 -C 欲解压缩的目录
jie'ya一个文件:tar -jxv -f /root/etc.tar.bz2 etc/shadow