202101笔记

VFS
Linux所支持的文件系统高达十几个,除了为它量身打造的Ext2之外,它还支持了Minix,FAT,VFAT,NFS,NTFS…等等。
VFS就是这些所有文件格式的抽象接口。

Linux内核的主要模块(或组件)分以下几个部分:存储管理、CPU和进程管理、文件系统、设备管理和驱动、网络通信,以及系统的初始化(引导)、系统调用等。----------------------------------------------------------------
demsg
显示开机信息

软件安装及配置
软件安装在/opt中,
使用ln -s将二进制链接到/usr/bin中

Linux命令格式

[root@localhost ~]# 命令[选项][参数]

选项:没有选项只会执行基本命令,有了选项会执行具体命令。
参数:参数是命令的操作对象,一般文件、目录、用户和进程等可以作为参数被命令操作。


挂载
linux操作系统将所有的设备都看作文件,
它将整个计算机的资源都整合成一个大的文件目录。
我们要访问存储设备中的文件,必须将文件所在的分区挂载到一个已存在的目录上,
然后通过访问这个目录来访问存储设备。


内存对齐方式
字符串是从下标0开始向右递增,a[0],a[1],a[2];
二进制是从最末尾向左依次递增,1100011;


常用的linux目录
/opt:用户安装程序
/bin:用户放置二进制
/etc:用户放置配置文件


查看DNS

nslookup baidu.com

简单地说,aarch64是armv8-A架构的一种运行时状态。arm64是aarch64在gnu/linux文档中的一种别称,两者几乎是混用的。

https://www.zhihu.com/question/63627218


gcc命令
-c,编译,生成.o文件
-o 目标文件 依赖文件,生成可执行文件
-l 添加依赖的库
-L 添加搜索的动态库
-I 添加搜索的静态库


使用tarball方式安装的软件建议放在/usr/local/目录下


在linux中为什么要用mount 进行挂载
简单说下bai,比如你插入了一个duU盘,LINUX系统zhi需要执行挂载命令,指定dao这个设备的类型zhuan,以shu确定用什么方式去访问和控制。不然就像WINDOWS98不能自动识别U盘一样,需要自己安装USB驱动。
不挂载LINUX系统就无法访问这个磁盘设备。挂载相当于是把这个设备注册到系统的文件树中,然后有了这个设备文件,系统才可以对它进行相应的通用fopen, fclose等操作。


cpu架构区别,
指令集,大小端对齐
架构不同,指令集就不同,机器码就不同,但最后的效果相同,因此,如果操作系统没有兼容某个指令集,就不能兼容相应架构的CPU


DDR 是所谓的双倍数据传送速度(Double
Data Rate), 他可以在一次工作周期中进行两次数据的传送,感觉上就好像是CPU 的倍频啦!


带宽:频率x位数


为什么固态硬盘比机械硬盘快?
因为读取bai方式不一样,固态是du编码方式保存文件,机械的zhi是轨道方dao式保存文件,固态的我们输入一个指令zhuan通过编码直接找到文件,而轨道的是在碟片上要找到才能读取,因为机械碟片的转速有限,所以读取速度也会受限,所以固态硬盘的读取速度要快它几倍,

除了性能上的差异之外,在内部构造方面二者也是有着基本的差异。SSD的储存介质是闪存颗粒,内部没有任何可以活动的零部件,而及机械硬盘内部有磁盘、转头等多种复杂的零部件,所以对于震动、掉落等外来伤害基本没有保护作用,SSD则完全没有这些困扰。


主板可接受的插槽接口(SATA/SAS)


前面内存的地方我们有提过 CMOS 与 BIOS 的功能,在这里我们再来强调一下: CMOS 主要的功能
为记录主板上面的重要参数, 包括系统时间、CPU 电压与频率、各项设备的 I/O 地址与 IRQ 等,由
于这些数据的记录要花费电力,因此主板上面才有电池。 BIOS 为写入到主板上某一块 flash 或
EEPROM 的程序,他可以在开机的时候执行,以加载 CMOS 当中的参数, 并尝试呼叫储存装置中
的开机程序,进一步进入操作系统当中。BIOS 程序也可以修改 CMOS 中的数据,每种主板呼叫 BIOS
设定程序的按键都不同,一般桌面计算机常见的是使用[del]按键进入 BIOS 设定画面。


在早期想要让计算机执行程序就得要参考一堆硬件功能函数,并且学习机器语言才能够撰写程序。
每个 CPU 都有独特的微指令集,同样的,每个硬件都有其功能函数。 因此,你为 A
计算机写的程序,理论上是没有办法在 B 计算机上面运作的!而且程序代码的修改非常困难! 因为是机器
码,并不是人类看的懂得程序语言啊!


操作系统的核心层直接参考硬件规格写成, 所以同一个操作系统程序不能够在不一样的硬件架构下运作。
举例来说,个人计算机版的 Windows 8.1 不能直接在 ARM 架构 (手机与平板硬件) 的计算机下运作。

应用程序的开发都是参考操作系统提供的开发接口, 所以该应用程序只能在该操作系统上面运作而已,不
可以在其他操作系统上面运作的。 现在您知道为何去购买在线游戏的光盘时,光盘上面会明明白白的写着
该软件适合用于哪一种操作系统上了吧? 也该知道某些游戏为何不能够在 Linux 上面安装了吧?


内核的作用:

  • 系统调用接口
  • CPU调度
  • 内存管理
  • 文件系统管理
  • 硬件驱动

事实上,驱动程序的提供应该是硬件厂商的事情!硬件厂商要推出硬件时,应该要自行参考操作系统的驱动程序开发接口, 开发完毕后将该驱动程序连同硬件一同贩卖给用户才对!举例来说,当你购买显示适配器时,显示适配器包装盒都会附上一片光盘,让你可以在进入 Windows 之后进行驱动程序的安装啊!

老实说,驱动程序可以说是操作系统里面相当重要的一环了!不过,硬件可是持续在进步当中的! 包括主板、显示适配器、硬盘等等。那么比较晚推出的较新的硬件,例如显示适配器,我们的操作系统当然就不认识啰! 那操作系统该如何驱动这块新的显示适配器?为了克服这个问题,操作系统通常会提供一个开发接口给硬件开发商,让他们可以根据这个接口设计可以驱动他们硬件的『驱动程序』,如此一来,只要使用者安装驱动程序后,自然就可以在他们的操作系统上面驱动这块显示适配器了。


新的 CPU 设计中,已经将北桥的内存控制芯片整合到 CPU 内,而 CPU 与主存储器、显示适配器沟通的总线通常称为系统总线。 南桥就是所谓的输入输出(I/O)总线,主要在联系硬盘、USB、网络卡等接口设备;


Windows 操作系统本来就是针对个人计算机 x86 架构的硬件去设计的,所以他当然只
能在 x86 的个人计算机上面运作, 在不同的硬件平台当然就无法运行了。也就是说,每种操作系统都是在他专门
的硬件机器上面运行的喔!这点得要先了解。 不过,Linux 由于是 Open Source 的操作系统,所以他的程序代码可
以被修改成适合在各种机器上面运行的, 也就是说,Linux 是具有『可移植性』,这可是很重要的一个功能喔!


CPU架构是什么?
简单说说架构是什么。如果把处理器看成是一个各个部件协同工作的整体,架构就代表了各部件的排列组合方式,或者说是采用了何种部件,以什么样的方式运行,拿主流的桌面级CPU来说,广义的架构就是指X86,还有IA-64、RISC等架构,单就英特尔CPU而言还分为安腾、至强以及经典的酷睿架构,AMD则多采用X86统一架构,没有具体的命名,需要注意的是至强、酷睿等架构也隶属于X86架构,简单来说X86架构是一种总体,是行业统一的规范标准,处理器厂商开发新架构是必须遵循的统一标准,就如同楼主所说的ARM架构一样,有很多的隶属分支架构。而按照处理器厂商的接口不同,架构也可分为英特尔:LGA478、LGA775、LGA1156、LGA1155,AMD:Socket 939、Socket 940、SocketAM2、AM2+、AM3等等······这里打个比喻:把CPU的架构比作是一座楼房,砖瓦油漆等建筑材料就是组成部分,架构的意义就在于把所有的建筑材料按一定的规则、最优化的布局顺序排列组合,形成一座楼房,X86架构是楼房的地基,是桌面CPU这座楼房的基础,而其他分支架构就如同楼房的种类一样,普通民房、别墅、摩天大楼等等,因为采用了不同的建筑材料和建筑方式所以各有侧重。这样说就好理解了,拿我们熟知的英特尔酷睿架构的CPU举例来说,新架构的应用就相当于建筑材料的品质提升,如采用了更坚固的钢筋混凝土和更快速的电梯,更轻薄的三合板,更节能的灯泡以及更环保的涂料等等,使建筑的档次得到根本性的提升,加强建筑物的耐用性、舒适性以及环保等性质,转换到CPU来看就是更强劲的性能(更多的核心带来更强的多任务处理能力、环形总线提升数据转化效率等)、更好的使用体验(智能加速的睿频技术、更快的视频转码速度等),更低的功耗(更深层得节能技术、新制程带来的低发热量和低功耗等)。总的来说,架构的升级代表了CPU性能的得到提升,功耗降低,楼主所说的制程其实也包含在架构之中了,同时期同一架构的CPU采用的制程是一样的,应该说制程只是新架构的一个部分(英特尔有在几乎同时期不更新架构,只进行小的优化,同时提升工艺制程的发展策略,简称Tick-Tock模式)。同时,架构还能区分CPU的类型,用于衡量CPU的性能提升,是CPU的重要指标之一。以上就是我的理解了,希望能帮到你。


BIOS:开机主动执行的韧体,会认识第一个可开机的装置;
CMOS 是记录各项硬件参数且嵌入在主板上面的储存器;
MBR:第一个可开机装置的第一个扇区内的主要启动记录区块,内含开机管理程序;

BIOS 与 MBR 都是硬件本身会支持的功能,至于 Boot loader 则是操作系统安装在 MBR 上面的一套软件了。

这个 boot loader 的主要任务有底下这些项目:

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

那现在请你想一想,为什么人家常常说:『如果要安装多重引导,最好先安装 Windows 再安装 Linux』呢?这是因为:

  • Linux 在安装的时候,你可以选择将开机管理程序安装在 MBR 或各别分区槽的启动扇区, 而且 Linux 的loader 可以手动设定选单(就是上图的 M1, M2...),所以你可以在 Linux 的 boot loader 里面加入 Windows 开机的选项;
  • Windows 在安装的时候,他的安装程序会主动的覆盖掉 MBR 以及自己所在分区槽的启动扇区,你没有选择的机会, 而且他没有让我们自己选择选单的功能。

SATA 硬盘:/dev/sd[a-d]
CDROM:/dev/cdrom
打印机:/dev/lp[0-2]
软盘驱动器:/dev/fd[0-1]

目前在个人计算机上面常见的硬盘与主板的连接接口有哪两个?
有内建的 SATA 界面与外接式的 USB 界面


/proc
这个目录本身是一个『虚拟文件系统(virtual filesystem)』喔!他放置的数据都是在内存当中, 例如系
统核心、行程信息(process)、周边装置的状态及网络状态等等。因为这个目录下的数据都是在内存当
中, 所以本身不占任何硬盘空间啊!比较重要的文件例如:/proc/cpuinfo, /proc/dma, /proc/interrupts,
/proc/ioports, /proc/net/* 等等。

很多读者都会误会/usr 为 user 的缩写,其实 usr 是 Unix Software Resource 的缩写, 也就是『Unix 操
作系统软件资源』所放置的目录,而不是用户的数据啦!这点要注意。 FHS 建议所有软件开发者,
应该将他们的数据合理的分别放置到这个目录下的次目录,而不要自行建立该软件自己独立的目录。

使用od命令可以按指定格式读取二进制文件

touch修改文件的时间

umask文件预设权限,如
umask 022
指的是去除群组和其他用户的写权限

file命令可以查看文件属性


ctrl + r
终端,历史记录,搜索
history
历史命令


元数据matedata就是属性信息


当系统加载一个文件到内存后,如果该文件没有被更动过,则在内存区段的文件数据会被设定为干净(clean)的。 但如果内存中的文件数据被更改过了(例如你用 nano 去编辑过这个文件),此时该内存中的数据会被设定为脏的 (Dirty)。此时所有的动作都还在内存中执行,并没有写入到磁盘中! 系统会不定时的将内存中设定为『Dirty』的数据写回磁盘,以保持磁盘与内存数据的一致性。
也可以使用sync命令强制进行同步。


挂载点的意义 (mount point)
每个 filesystem 都有独立的 inode / block / superblock 等信息,这个文件系统要能够链接到目录树才能被我们使用。 将文件系统与目录树结合的动作我们称为『挂载』。


VFS (Virtual Filesystem Switch)
了解了我们使用的文件系统之后,再来则是要提到,那么 Linux 的核心又是如何管理这些认识的文件系统呢? 其实,整个 Linux 的系统都是透过一个名为 Virtual Filesystem Switch 的核心功能去读取 filesystem 的。 也就是说,整个 Linux 认识的 filesystem 其实都是 VFS 在进行管理,我们使用者并不需要知道每个 partition 上头的 filesystem 是什么~ VFS 会主动的帮我们做好读取的动作呢~
假设你的 / 使用的是 /dev/hda1 ,用 ext3 ,而 /home 使用 /dev/hda2 ,用 reiserfs , 那么你取用/home/dmtsai/.bashrc 时,有特别指定要用的什么文件系统的模块来读取吗? 应该是没有吧!这个就是 VFS 的功能啦!透过这个 VFS 的功能来管理所有的 filesystem, 省去我们需要自行设定读取文件系统的定义啊~方便很多!


日志文件系统
因为数据由内存写入硬盘不是即时的,而是定期的,因此使用日志系统先记录所有操作,待由内存写入到磁盘后该日志记录才失效,因此日志文件系统用于恢复数据。通常为几十M大小。


关于目录的 link 数量:
或许您已经发现了,那就是,当我们以 hard link 进行『文件的连结』时,可以发现,在 ls -l 所显示的第二字段会增加一才对,那么请教,如果建立目录时,他默认的 link 数量会是多少? 让我们来想一想,一个『空目录』里面至少会存在些什么?呵呵!就是存在 . 与 .. 这两个目录啊! 那么,当我们建立一个新目录名称为 /tmp/testing 时,基本上会有三个东西,那就是:

  • /tmp/testing
  • /tmp/testing/.
  • /tmp/testing/..

而其中 /tmp/testing 与 /tmp/testing/. 其实是一样的!都代表该目录啊~而 /tmp/testing/.. 则代表 /tmp 这个目录,所以说,当我们建立一个新的目录时, 『新的目录的 link 数为 2 ,而上层目录的 link 数则会增加 1 』


为什么要对磁盘进行分区?
主要是为了对该 partition 进行格式化 (format),以建立系统可用的 filesystem;


blkid
查询挂载信息


映像文件:
将文件作为光盘来使用。


由于linux下的打包命令通常只能处理一个文件,因此会出现了tar归档文件


终端默认使用utf-8,如果要读取big5格式的文件:

LANG=zh_TW.big5
export LC_ALL=zh_TW.big5

我们在第六章里面谈到 cat 这个指令时,曾经提到过 DOS 与 Linux 断行字符的不同。 而我们也可以利用 cat -A 来观察以 DOS (Windows 系统) 建立的文件的特殊格式, 也可以发现在 DOS 使用的断行字符为 ^M$ ,我们称为 CR 与 LF 两个符号。 而在 Linux 底下,则是仅有 LF ($) 这个断行符号。这个断行符号对于 Linux 的影响很大喔! 为什么呢?
我们说过,在 Linux 底下的指令在开始执行时,他的判断依据是 『Enter』,而 Linux 的 Enter 为LF 符号, 不过,由于 DOS 的断行符号是 CRLF ,也就是多了一个 ^M 的符号出来, 在这样的情况下,如果是一个 shell script 的程序文件,呵呵~将可能造成『程序无法执行』的状态~ 因为他会误判程序所下达的指令内容啊!这很伤脑筋吧!
此时可以使用如下命令转换:

dos2unix -n old new

编码转换

iconv -f 原本编码 -t 新编码 filename [-o newfile]

环境变量即全局变量,方便跨shell使用

# 普通变量设定
var="sd ds"

# 显示变量
echo $var

# 设定环境变量,即全局变量
export NAME=chendeqiang

# 显示环境变量
echo $NAME

在默认情况下,bash中的变量类型是字符串型,如果需要定义其他类型,就要使用declare


/etc/passwd用于管理UID和GID
如果密码忘记了,可以使用root账户将该文件下的账户密码的x删掉,就可以免密登录了。
个人理解,x代表可执行需要密码的意思,空代表不需要密码
而密码真正存在的地方是:/etc/shadow
需要注意的是,uid为0代表具有root权限,因此如果某个账号想具有root权限,可以将其uid设置为0.
不过,默认情况下,root账户是不显示在登录界面的。

因为我的 dmtsai 账号同时支持 dmtsai, wheel 与 users 这三个群组, 因此,在读取/写入/执行文件时,针对群组部分,只要是 users, wheel 与 dmtsai这三个群组拥有的功能,我dmtsai 这个使用者都能够拥有喔!

有效群组

groups

显示的第一个即为有效群组,当创建文件时,即以有效群组的权限进行创建。
切换有效群组:

newgrp 群组名

添加用户
只有管理员可以添加账户。

useradd 用户名
  • 在 /etc/passwd 里面建立一行与账号相关的数据,包括建立 UID/GID/家目录等;
  • 在 /etc/shadow 里面将此账号的密码相关参数填入,但是尚未有密码;
  • 在 /etc/group 里面加入一个与账号名称一模一样的组名;
  • 在 /home 底下建立一个与账号同名的目录作为用户家目录,且权限为 700

修改密码
所有人可以修改自己的密码。

passwd

管理员可以修改所有人的密码:

passwd 用户名

删除用户

userdel 用户名

#连同家目录一起删除
userdel -r 用户名

用户的数据有:

  • 用户账号/密码相关参数:/etc/passwd, /etc/shadow
  • 使用者群组相关参数:/etc/group, /etc/gshadow
  • 用户个人文件数据: /home/username, /var/spool/mail/username.

acl
文件访问控制,可以对特定用户制定特定的访问权限,getfacl和setfacl

设置user
setfacl -m u:chendeqiang:rx 文件名
设置groiup
setfacl -m g:chendeqiang:rx 文件名

getfacl 文件名

配置sudo权限

编辑visudo

visudo
#添加一行sudo权限
chendeqiang ALL=(ALL) ALL

其中,%代表群组,因此使用群组功能也可以添加sudo权限,只要将该用户添加到sudo组中:

sudo : x : 27 :chendeqiang test1

数据流重定向
标准输入
< 会覆盖原文件
<< 会在原文件下继续累加
标准输出

标准错误输出
2>

如下案例中将会同时重定向标准输出和标准错误输出
find /home -name .bash >listright 2>listerror

拆分文件
split -b 300k /etc/services services


/proc
这个目录本身是一个『虚拟文件系统(virtual filesystem)』喔!他放置的数据都是在内存当中, 例如系
统核心、行程信息(process)、周边装置的状态及网络状态等等。因为这个目录下的数据都是在内存当
中, 所以本身不占任何硬盘空间啊!比较重要的文件例如:/proc/cpuinfo, /proc/dma, /proc/interrupts,
/proc/ioports, /proc/net/* 等等。

很多读者都会误会/usr 为 user 的缩写,其实 usr 是 Unix Software Resource 的缩写, 也就是『Unix 操
作系统软件资源』所放置的目录,而不是用户的数据啦!这点要注意。 FHS 建议所有软件开发者,
应该将他们的数据合理的分别放置到这个目录下的次目录,而不要自行建立该软件自己独立的目录。

使用od命令可以按指定格式读取二进制文件

touch修改文件的时间

umask文件预设权限,如
umask 022
指的是去除群组和其他用户的写权限

file命令可以查看文件属性


终端job control管理

终端执行背景任务

在命令后边加 & 符号,如

cp file1 file2 &

还可以使用ctrl+z暂停工作

可以使用jobs -l显示工作项目

使用 fg %工作号 可以将背景工作拿到前景来使用

为了避免背景工作的输出影响前景,可以使用数据流重定向将输出重定向到文件

使用bg %工作号 可以将暂停的任务继续运行

结束任务,kill -15 % 任务号

脱机执行

要想在关闭终端后还能执行,可以使用 at或者nohup命令,不过nohup不能执行bash内置命令,得执行脚本,
nohup ./sleep600.sh &

查看进程

静态查看
ps,pstree,

#查看系统所有进程
ps aux

#查看当前bash的进程
ps -l

动态查看
top

#监控所有进程
top 

#监控单一进程
top -p 进程号

查看登录信息

who

tty是当前终端机,
pts/n 是虚拟终端机和远程终端机。

防火墙

iptable

显示自己bash的pid

echo $$

进程控制

kill 可以帮我们将这个 signal 传送给某个工作 (%jobnumber) 或者是某个 PID (直接输入数字),为了区别工作号和PID号,在号前添加%代表工作号。
Kill,1(重启进程),9(杀死进程),15(正常结束进程)

为什么什么都没干内存也被耗尽了

使用free -m可以以M为单位查看内存情况,
通常,系统会充分榨干内存,通过cache缓存最近信息,当有需要的时候,cache的部分内容会被释放,因此available就是可以被交换出来的内存用量,因此即使什么也没干,内存还是被用光了是正常的。
如果您发现 swap 的用量超过 20% ,那么,最好还是买物理内存来插吧!

监控系统资源变化

#每秒一次,一共三次
vmstat 1 3

查看一个文件被哪些进程使用

fuser -mvu 文件目录

查看进程开启了哪些文件

lsof  

查看某个进程的pid

pidof 进程名

查看是否启用SELinux

getenforce

服务

服务可以理解为一直运行,如服务程序,服务器
deamon和server是同一个东西。
一般服务名后边都加d作为标示,如systemd,atd,
查看所有服务:

systemctl

Systemd的配置文件放置目录
实际服务文件:/usr/lib/systemd/system
实际启用设定:/etc/systemd/system,这里放的都是要启用的服务的链接。

查看一个服务的启用状态

Systemctl status atd.server(服务名)

其他命令有:
command 主要有:
start :立刻启动后面接的 unit
stop :立刻关闭后面接的 unit
restart :立刻关闭后启动后面接的 unit,亦即执行 stop 再 start 的意思
reload :不关闭后面接的 unit 的情况下,重载配置文件,让设定生效
enable :设定下次开机时,后面接的 unit 会被启动
disable :设定下次开机时,后面接的 unit 不会被启动
status :目前后面接的这个 unit 的状态,会列出有没有正在执行、开机预设执行否、登录等信息等!
is-active :目前有没有正在运作中
is-enable :开机时有没有预设要启用这个 unit

查看服务所用的端口号:

cat /etc/servers

服务、daemon 与函数名称

syslog是函数,
rsyslogd是deamon,
rsyslog.server是加入服务的配置项

Linux 定期执行一次任务

at

job1.bash

#! /usr/bin/shell
echo "'date +%Y%m%d'       Hello Kitty!" >> ~/桌面/myjobs
at now + 5 minutes
at> ~/job1.bash
#查询当前有多少任务需要执行
atq
# 2   Mon Jan 11 16:37:00 2021 a chendeqiang

#移除任务
atrm 工作号
# atrm 2

注1:使用ctrl+d可以结束输入,此时会出现文件结尾符<EOF>
注2:最小时间单位是1分钟

batch

在CPU的工作负载小于0.8的时候,才运行任务。


系统日志

系统日志的配置文件在/etc/rsyslog.d/50-default.conf中,共有8个等级:

等级数值 等级名称 说明
7 debug 用来 debug (除错) 时产生的讯息数据;
6 info 仅是一些基本的讯息说明而已;
5 notice 虽然是正常信息,但比 info 还需要被注意到的一些信息内容;
4 warning(warn) 警示的讯息,可能有问题,但是还不至于影响到某个 daemon 运作的信息;基本上,info, notice, warn 这三个讯息都是在告知一些基本信息而已,应该还不至于造成一些系统运作困扰;
3 err(error) 一些重大的错误讯息,例如配置文件的某些设定值造成该服务服法启动的信息说明, 通常藉由 err 的错误告知,应该可以了解到该服务无法启动的问题呢!
2 crit 比 error 还要严重的错误信息,这个 crit 是临界点 (critical) 的缩写,这个错误已经很严重了喔!
1 alert 警告警告,已经很有问题的等级,比 crit 还要严重!
0 emerg(panic) 疼痛等级,意指系统已经几乎要当机的状态! 很严重的错误信息了。通常大概只有硬件出问题,导致整个核心无法顺利运作,就会出现这样的等级的讯息吧!
  • . :代表『比后面还要严重的等级 (含该等级) 都被记录下来』的意思,例如: mail.info 代表只要是 mail
    的信息,而且该信息等级严重于 info (含 info 本身)时,就会被记录下来的意思。
  • .=:代表所需要的等级就是后面接的等级而已, 其他的不要!
  • .!:代表不等于, 亦即是除了该等级外的其他等级都记录。

如果想将信息输出到两个文件中,可以:

news.*;cron.* /var/log/cronnews
news.=warn;cron.=warn /var/log/cronnews.warn

ABI
我们把符号修饰标准、变量内存布局、函数调用方式等这些跟可执行代码二进制兼容性相关的内容称为ABI(Application Binary Interface)。
影响ABI的因素非常多,硬件、编程语言、编译器、链接器、操作系统等都会影响ABI。我们可以从C语言的角度来看一个编程语言是如何影响ABI的。对于C语言的目标代码来说,以下几个方面会决定目标文件之间是否二进制兼容:

内置类型(如int、float、char等)的大小和在存储器中的放置方式(大端、小端、对齐方式等)。

组合类型(如struct、union、数组等)的存储方式和内存分布。

外部符号(external-linkage)与用户定义的符号之间的命名方式和解析方式,如函数名func在C语言的目标文件中是否被解析成外部符号_func。

函数调用方式,比如参数入栈顺序、返回值如何保持等。

堆栈的分布方式,比如参数和局部变量在堆栈里的位置,参数传递方法等。

寄存器使用约定,函数调用时哪些寄存器可以修改,哪些须要保存,等等。

在一般的情况下,一种语言的开发环境往往会附带有语言库(Language Library)。这些库就是对操作系统的API的包装,比如我们经典的C语言版“Hello World”程序,它使用C语言标准库的“printf”函数来输出一个字符串,“printf”函数对字符串进行一些必要的处理以后,最后会调用操作系统提供的API。各个操作系统下,往终端输出字符串的API都不一样,在Linux下,它是一个“write”的系统调


动态链接的优缺点
优点,解决了内存中出现冗余的程序副本的状况,使内存中只保留一份程序副本,提高了内存利用率降低了模块间的耦合性,运行时链接,方便以模块形式维护,因此也可以用来制作插件
缺点,模块版本不兼容问题,程序运行速度慢,

绝对地址和地址无关pic
绝对地址就是直接寻址,地址无关就是间接寻址,可以类比数组,总是先找到数组首地址,再通过相对偏移量找到某个值,而不是直接读取那个值的内存值

在链接过程中,如果有外部的绝对地址数据的引用,就会用到链接时重定位

共享库方法有使用绝对位置重定位,以及使用相对位置pic
使用重定位就需要预先规划出一段内存存放共享代码,这会产生覆盖和内存浪费的情况

理解错了,地址无关代码是指,
把需要修改的指令放在数据段,使用的时候每个进程复制一份,而不动的代码段所有进程共享,
因此需要一个got来索引可变指令相对于数据段的偏移

说实话还是有点抽象,啥是可变指令,为什么该指令会和地址相关,是因为该段指令中也有需要链接到外部的重定义的地址?或者是链接到进程内部变量的地址,如出参,这样每个进程都会修改其内部的行参,而每个进程传入的实参地址又不同。

动态链接主要是为了解决库共享问题,但是把所有库都链接上代价太大,就出现了延迟绑定,用的时候再链接

共享库和动态库不同,
共享库是在编译期由动态链接器完成,动态库是在运行期由动态链接器完成

共享库和共享对象
共享库就是打包了的共享对象


使用ccache可以提高编译速度

../wine-source/configure CC="ccache gcc" CROSSCC="ccache i686-w64-mingw32-gcc" #your usual configure options

参考链接:
https://www.cnblogs.com/leaven/archive/2011/02/20/1959331.html


explorer.exe
窗口shell,可以通过增加参数来操作窗口。

查看硬盘序列号
lsblk --nodeps -no serial /dev/nvme0n1

posted @ 2021-01-01 21:45  多弗朗强哥  阅读(112)  评论(0编辑  收藏  举报