基础知识
1.三个文件:引导程序(bootloader):uboot.bin/uboot.imx;Linux内核镜像:zImage;文件系统镜像:system.img/rootfs.tar.ba2

2.Linux驱动架构经历了三个阶段,首先是Linux v2.4之前的原始架构:

然后是从Linux v2.6开始的平台总线架构,如下图所示:

最后是当前的设备树架构:

3.打开终端会出现形如saj@dev:~$的命令提示符,各部分含义如下:
- saj:"@"符号的左侧,它表示的是当前登录用户。
- @:分隔符号,可理解为at,表示saj用户at主机dev上。
- dev:当前系统的主机名。
- ":":分隔符号。
- "~":冒号后表示用户当前所在的目录,此处的波浪线表示当前用户的家目录,即"~"的含义为/home/saj目录。
- "":命令提示符,Linux用这个符号标识登录的用户权限等级。如果是超级用户,提示符就是"#",如果是普通用户,提示符就是""。
4.用户登录时,系统会先根据用户名去/etc/passwd文件中查找相应的UID,然后根据UID去/etc/group文件中查找用户所在GID,然后去/etc/shadow文件中核对用户密码,如果上述每一步都成功,则用户登录成功。/etc/passwd文件中信息格式为:用户:密码(x):UID:GID:用户信息说明栏:用户家目录:用户默认shell,其中密码部分并没有提供密码,只是一个x,密码加密存储在/etc/shadow文件中,示例如下:

/etc/group文件中信息格式为:组名:群组密码:GID:此群组包含的账号名称,示例如下:

/etc/shadow文件中信息格式为:用户名:加密密码:最后一次修改时间:最小修改时间间隔:密码有效期:密码需要变更前的警告天数:密码过期后的宽限时间:账号失效时间:保留字段,最后一次修改时间是以自1970年1月1日起的天数为单位,示例如下:

对于UID,一般有以下约定:管理员(root)的UID为0;系统用户,即管理系统运行服务的用户的UID为1~999;普通用户,即只具有系统一部分权限的用户的UID为1000以上。
5.df命令用于显示文件系统的磁盘空间使用情况。它显示每个已挂载文件系统的总空间、已用空间、可用空间以及挂载点。下面是df的基本用法和常用选项:df [选项] [文件或挂载点]。如果直接输入df而不加选项,它将显示所有挂载文件系统的空间使用情况。下面是该命令的一些选项:-h(human-readable)以易读的方式显示磁盘使用情况(自动换算成KB、MB、GB等);-T显示文件系统的类型(例如ext4、xfs、tmpfs);-i显示inode使用情况,而不是磁盘空间使用情况;-a:显示所有文件系统,包括系统自动创建的特殊文件系统(如/proc、/dev等)。
6.du 命令用于显示目录或文件的磁盘使用情况。它可以递归地遍历目录,显示每个目录或文件所占的空间大小。下面是du的基本用法和常用选项:du [选项] [目录或文件],若不带参数,du命令默认会对当前目录进行操作。下面是该命令的一些选项:-a(all):显示目录中每个文件和子目录的大小。默认情况下,du只显示每个目录的大小,而不显示每个文件的大小;-h(human-readable):以易读的方式显示文件和目录大小(自动换算成KB、MB、GB等);-s(summary):只显示指定目录或文件的总大小,而不是列出每个子目录;-d<层级数>:指定目录深度,显示特定深度的目录大小。
7.!!命令用于重复执行上一条命令,它等价于再次输入上一条命令,尤其在需要重新执行一条较长的命令时很有用。还可以使用sudo !!以管理员权限重新执行上一条命令。
8.mount 命令用于将文件系统挂载到特定的目录:mount [选项] <设备> <挂载点>,直接输入mount将列出所有当前挂载的文件系统。卸载已挂载的文件系统时使用 umount 命令,该命令用于安全地断开设备和系统之间的连接,以确保数据不会因强制断开而丢失:umount [选项] <挂载点或设备>。
9.type命令用于显示给定命令的类型,告诉你该命令是一个内置命令、外部程序、别名或函数。它可以帮助了解命令的来源,以及系统如何解析命令的执行路径。内置命令是由 shell 本身提供和管理的命令。这些命令在shell启动时加载,直接在shell内部执行,因此执行时非常快速。外部程序是存储在文件系统中的可执行文件,通常位于某些目录中(如/bin, /usr/bin)。外部程序是通过启动一个新进程来执行的,shell会根据命令名称查找相应的可执行文件,并启动一个新的进程来执行该文件。/etc/shells文件是一个文本文件,用于列出系统上可用的合法shell程序路径。通常,它包含系统允许用户使用的所有shell程序的路径,并且每一行列出一个shell的完整路径。
10.vim和vi的区别:vim是vi的升级版本,vi按u只能撤销上一次的操作,而vim可以无限制撤销;vi只能运行在类unix系统中,而vim可以运行于多个平台;vim可以用不同颜色来高亮代码;vim可通过vimrc文件配置更高级的功能。
11.在 Shell 中,脚本可以通过以下三种方式启动,每种方式的行为和影响范围不同:1将脚本设置为可执行,然后直接运行脚本路径;2显式指定解释器(如 /bin/bash 或 /bin/sh)运行脚本;3使用source或.命令加载脚本。三种方式的区别可以总结如下:直接执行需要赋予脚本执行权限并依赖脚本顶部的Shebang指定解释器,它会在一个新的子Shell中运行,当前环境不受影响;指定解释器执行(如bash script.sh)不需要执行权限和Shebang,同样会在子Shell中运行,对当前环境也无影响;而source或.执行则直接在当前Shell中运行脚本,修改脚本中的变量和环境会影响当前Shell,因此通常用于加载环境配置或定义函数。
12.shell的基本语法:定义变量variable=value、variable='value'、variable="value",使用变量variable、(variable);将命令的结果赋值给变量:variable=`command`、variable=$(command)。上述内容区别如下:

unset用来删除变量。在Shell脚本中,有许多特殊变量用于表示脚本的状态、参数、PID等信息。以下是Shell中所有常用的特殊变量及其含义:

其中,在for循环中,"\*"会将所有参数合并成一个字符串作为一个单独的迭代项;而"@"会将每个参数作为独立的迭代项。因此,"\*"适合将所有参数作为整体处理,而"@"适合逐一处理每个参数。(())是一种用于在Shell脚本中进行算术运算的语法。它用于表达式求值,并返回结果。(())主要用于整数运算,支持加法、减法、乘法、除法、取余、位运算等操作。test和[]用于检测某个条件是否成立。
13.export命令在shell中用于设置环境变量并使其对当前shell会话及其子进程可见。当通过export设置一个变量时,变量的值不仅在当前shell内部有效,还能被该shell启动的子进程访问,常用于设置环境变量(如PATH、HOME)或配置程序运行环境。若不使用export,变量仅对当前shell有效,子进程无法继承,可以通过export来修改环境变量,确保子进程共享特定的配置或信息。export命令导出的环境变量仅在当前shell会话中有效,当退出当前shell时,所有在该会话中设置的环境变量都会失效,不再可用,也就是说环境变量不会被保留到下次启动的shell中。
14.与Bash Shell有关的配置文件主要有:/etc/profile、/etc/bashrc、/etc/bash.bashrc、/etc/profile.d/*.sh、~/.bashrc、~/.profile、~/.bash_login、~/.bash_profile,这些配置文件的具体命名还和具体的linux系统有关,例如对于ubuntu,一般有/etc/profile、/etc/bash.bashrc、/etc/profile.d/*.sh、~/.profile、~/.bashrc,系统启动时会按照/etc/profile->~/.profile的顺序执行这些配置文件,/etc/profile中会调用/etc/bash.bashrc和/etc/profile.d/*.sh,如下图:

~/.profile文件会调用~/.bashrc。/etc目录下的配置文件是所有用户共享的,如果想设置所有用户共享的环境变量,可以将其放在/etc/bash.bashrc文件中,/etc目录下的配置文件在任何用户登录时(例如在终端中切换到任意用户)都会被执行。家目录下的配置文件是属于单个用户的,只有在对应用户登录时才会被执行,可以在~/.bashrc文件中设置只针对当前用户的环境变量。
15.deb包:Debian、Ubuntu、Deepin等linux发行版的软件安装包。dpkg工具可用来管理deb包,其常用命令如下:sudo dpkg -i package_name.deb:该命令用于安装指定的.deb包。安装过程中,dpkg会检查包的依赖关系,但不会自动解决依赖问题;sudo dpkg -r package_name:删除指定的软件包,但不会删除配置文件;sudo dpkg --purge package_name:删除软件包及其配置文件;dpkg -s package_name:显示指定已安装包的详细信息,包括版本、描述、依赖关系等;dpkg -L package_name:显示指定包中包含的所有文件安装的完整路径。在.deb包的结构中,DEBIAN目录包含一些用于包管理和安装过程的控制文件:control文件:包含包的基本信息,如包名、版本、依赖关系、描述等,它是.deb包的核心元数据文件;preinst文件:在包安装之前执行的脚本,用于做一些安装前的准备工作,例如检查系统状态、处理配置文件等,如果文件存在,它会在dpkg安装包前执行;postinst文件:包安装后执行的脚本;prerm文件:在包卸载之前执行的脚本;postrm文件:在包卸载之后执行的脚本;copyright文件:提供有关该软件包的版权信息、许可证以及维护者的相关信息;changelog文件:记录了该软件包的版本历史和每个版本所做的更改。DEBIAN这个目录对每个.deb包来说都是必须的,并且它决定了该包在安装、升级、删除等过程中如何与系统进行交互。创建.deb软件包过程如下:可以创建一个目录,例如helloworld目录,在helloworld目录下创建DEBIAN目录并创建上述DEBIAN目录下的文件,然后在helloworld目录下创建脚本helloworld/usr/bin/helloworld.sh,然后就可以用命令dpkg -b <package_directory> <deb_file>(此处先切换到helloworld目录的上一级目录,然后使用命令dpkg -b helloworld helloworld.sh)构建一个.deb软件包,然后用命令sudo dpkg -i <deb_file>安装,这会将该软件安装到/ usr/bin/helloworld.sh处,安装规则就是将dpkg -b <package_directory> <deb_file>安装命令中的package_directory换成根目录,并将软件安装到对应位置。安装完成后就可以直接使用helloworld.sh命令了。