用户态与内核态
- 1、linux进程有4GB地址空间,如图所示:
-
3G-4G大部分是共享的,是内核态的地址空间。这里存放整个内核的代码和所有的内核模块以及内核所维护的数据。
-
2、特权级的概念:
-
对于任何操作系统来说,创建一个进程是核心功能。创建进程要做很多工作,会消耗很多物理资源。比如分配物理内存,父子进程拷贝信息,拷贝设置页目录页表等等,这些工作得由特定的进程去做,所以就有了特权级别的概念。最关键的工作必须交给特权级最高的进程去执行,这样可以做到集中管理,减少有限资源的访问和使用冲突。inter x86架构的cpu一共有四个级别,0-3级,0级特权级最高,3级特权级最低。
-
3、用户态和内核态的概念:
-
当一个进程在执行用户自己的代码时处于用户运行态(用户态),此时特权级最低,为3级,是普通的用户进程运行的特权级,大部分用户直接面对的程序都是运行在用户态。Ring3状态不能访问Ring0的地址空间,包括代码和数据;当一个进程因为系统调用陷入内核代码中执行时处于内核运行态(内核态),此时特权级最高,为0级。执行的内核代码会使用当前进程的内核栈,每个进程都有自己的内核栈。
-
用户运行一个程序,该程序创建的进程开始时运行自己的代码,处于用户态。如果要执行文件操作、网络数据发送等操作必须通过write、send等系统调用,这些系统调用会调用内核的代码。进程会切换到Ring0,然后进入3G-4G中的内核地址空间去执行内核代码来完成相应的操作。内核态的进程执行完后又会切换到Ring3,回到用户态。这样,用户态的程序就不能随意操作内核地址空间,具有一定的安全保护作用。这说的保护模式是指通过内存页表操作等机制,保证进程间的地址空间不会互相冲突,一个进程的操作不会修改另一个进程地址空间中的数据。
-
4、用户态和内核态的切换
-
当在系统中执行一个程序时,大部分时间是运行在用户态下的,在其需要操作系统帮助完成一些用户态自己没有特权和能力完成的操作时就会切换到内核态。
-
用户态切换到内核态的3种方式
-
(1)系统调用
-
这是用户态进程主动要求切换到内核态的一种方式。用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作。例如fork()就是执行了一个创建新进程的系统调用。系统调用的机制和新是使用了操作系统为用户特别开放的一个中断来实现,如Linux的int 80h中断。
-
(2)异常
-
当cpu在执行运行在用户态下的程序时,发生了一些没有预知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关进程中,也就是切换到了内核态,如缺页异常。
-
(3)外围设备的中断
-
当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令而转到与中断信号对应的处理程序去执行,如果前面执行的指令时用户态下的程序,那么转换的过程自然就会是 由用户态到内核态的切换。如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后边的操作等。
-
这三种方式是系统在运行时由用户态切换到内核态的最主要方式
-
其中系统调用可以认为是用户进程主动发起的,异常和外围设备中断则是被动的。
-
从触发方式上看,切换方式都不一样,但从最终实际完成由用户态到内核态的切换操作来看,步骤都是一样的,都相当于执行了一个中断响应的过程。
-
系统调用实际上最终是中断机制实现的,而异常和中断的处理机制基本一致
原文链接:https://blog.csdn.net/qq_39823627/article/details/78736650
- 编译内核时,可以使用以下命令对内核进行配置
- make config
- make menuconfig
- make oldconfig
- make xconfig
- 只要代码或配置有改动,都要重新编译内核的
- 命令执行成功后,会返回0。1表示未提交?2表示无此文件或路径
- touch 文件名: 新建文件
- cat:
- 1.cat filename :一次显示整个文件
- 2.cat>filename : 创建新文件,不能编辑已有文件
- 3.cat file1 file2 >file : 将前2文件合并到一个新文件
- grep -rn “要查的内容” /usr/local 含义:-r就是递归在目录中查询,-n是输出所在行
- find 不会如上述根据文件内容进行查询
- POSIX信号量函数的名字,都是以sem_开头的
- kill 用来终止一个进程
- ifconfig [网络设备] [参数] 用来查看和配置网络参数
- 用于查看和更改网络接口的地址和参数,包括IP地址、网络掩码、广播地址,其使用权限是超级用户
- 主要为配置本地回环地址、配置网卡的IP地址、激活网络适配器
- mv 源文件/目录 目标文件/目录 含义:目标文件,则是重命名,目标目录,就是move
- MIN HOUR DAY MONTH DAYOFWEEK COMMAND (DAYOFWEEK意思就是周几)
- /etc/fstab/ 的文件配置,表示对挂载的配置:
- fstab文件存放 文件系统的静态信息,当系统启动时候,会自动从该文件读取相关信息,并将指定的文件系统挂载到指定的目录。
- default表示默认配置;noauto表示非自动挂载;ro表示挂载只读权限的;rw表示挂载读写权限的;sw表示挂载可读写分区
- /etc/passwd中存放本地用户基本信息
- /etc/shadow存放用户密码
- touch /etc/nolgoin: 禁止所有普通用户登录
- 所谓系统调用,指的就是内核提供的一系列十分强大的系统函数。系统调用是在内核中实现的,再通过一定的方式系统调用给用户。系统调用是用户程序和内核交互的接口:open,write,read,close,iocti
- $0 # 脚本启动名(包括路径)
- $n # 第n个参数,n=1,2,…9
- $* # 所有参数列表(不包括脚本本身)
- $@ # 所有参数列表(独立字符串)
- $# # 参数个数(不包括脚本本身)
- $$ # 当前程式的PID
- $! # 执行上一个指令的PID
- $? # 执行上一个指令的返回值
- hosts文件
- 是用于存储计算机网络中各节点信息的计算机文件,这个文件负责将主机名称映射到相应的IP地址。hosts文件通常用于补充或替换网络中DNS的功能
- 软连接:符号链接
- 其实就等于是快捷方式,用于指向一个文件,可以跨越文件系统
- 硬链接:
- 其实就是为文件建立一个别名,链接文件和源文件实际上是同一个文件。像是智能指针。二者用同一个innode
- innode
- 描述了文件大小和指向数据块的指针
- 通过inode可获得文件占用的块数
- 通过inode可实现文件的逻辑结构和物理结构的转换
- Linux中,一个端口能够接受tcp链接数量的理论上限是无上限
- 打印
- head -n k # 打印前k行
- head -n -k # 打印除最后k行外的所有内容
- tail -n k # 打印最后k行
- tail -n +k # 从k行开始打印
cat file1| head -n 500 | tail -n +300
sed -n '300,500p' file1
//打印300-500行的内容
- 查看文件:
- cat由第一行开始显示文件所有内容;
- tac从最后一行开始显示文件的所有内容,注意 tac 与cat 写法正好相反;
- more只能敲击ENTER一次一页向下
- less可以上下移动来查看文件内容
- Fork() 全部复制
- 子进程保留了父进程的整个进程地址空间:包括,进程上限文,堆栈,内存信息,打开的文件描述符,环境变量,当前工作目录等
- 区别在于:父进程设置的锁,子进程不继承;进程ID不同;子进程的未决警告被清除;未决信号机设置为空集。
- clone 可以选择复制
- 是fork的升级版本,不仅可以创建进程或者线程,还可以指定创建新的命名空间(namespace)、有选择的继承父进程的内存、甚至可以将创建出来的进程变成父进程的兄弟进程等等
- 调用recv(int sockfd, void *buf, size_t len, int flags)的过程中,一共进行了几次内存复制操作?2次
- 内核从对端接受数据,放在socket的缓存中,然后复制到应用层的buffer,所以一共两个buffer
- linux中哪个命令可以将普通用户转换成超级用户?su
- WEB服务器配置文件 http.conf
启动脚本配置文件 initd.conf
samba脚本 rc.samba
samba服务配置文件 smb.conf
- 内核分为:进程管理子系统,内存管理子系统,io管理子系统,文件管理子系统
- 内核中才能完成的是:fopen,exit。
- dpkg ---- deb
- yum -----rpm
- apt-get — deb
- tar ----- bz2
- unzip ------ zip
-
tar 配合压缩解压缩常用用法
-
压缩
-
tar -cvzf 打包文件名 打包文件集
-
解压缩
-
tar -xvzf 需要解包的文件名 -C 解压路径.
- /etc/mtab文件的作用:记载的是现在系统已经装载的文件系统,包括操作系统建立的虚拟文件等;而/etc/fstab是系统准备装载的
- etc/fstab文件的作用 :记录了计算机上硬盘分区的相关信息,启动 Linux 的时候,检查分区的 fsck 命令,和挂载分区的 mount 命令,都需要 fstab 中的信息,来正确的检查和挂载硬盘。
- uptime命令
- 显示负载
- 过去只显示系统运行多久。现在,可以显示系统已经运行了多长时间,信息显示依次为:现在时间、系统已经运行了多长时间、目前有多少登陆用户、系统在过去的1分钟、5分钟和15分钟内的平均负载。
- top命令
- 可以查看系统整体负载状态,动态实时查看系统中每一个进程的资源使用情况
- mount
- 查看磁盘挂载状态
- sar -u
- 显示负载
- 输出显示CPU信息。-u选项是sar的默认选项。该输出以百分比显示CPU的使用情况
- cat /proc/cpuinfo
查看CPU信息命令 - cat /proc/meminfo
- 查看内存信息命令
- fdisk -l
- 查看硬盘信息命令
- cat /proc/swaps
- 查看所有分区信息
- du -h
- 当前目录下所有目录及子目录的大小
- df -h
- 整个文件系统(磁盘)的使用情况
- free
- 直观的展示linux系统内存使用及交换区的容量大小等
- vmstat -s
- 显示实时的和平均的统计,覆盖CPU、内存、I/O等内容。
- tail -f
- linux 下 tail 用于看档案的结尾, -f参数 是follow的意思 当文件增长时,输出后续添加的数据
- exec
- 使用vfork函数时,通常需要exec配合使用
- fg(Foreground)
- 将进程搬到前台运行的命令
- bg(Background)
- 将进程搬到后台运行的命令
- jobs
- 查看当前有多少在后台运行的命令
- 当前目录下有a和b两个文件,执行命令“ls>c” 则文件c里面的内容是:
- abc
- vi
- 打开一个文件时:
- dd 删除光标所在的那一整行
- ndd:删除光标行往下n行(含光标行)内容
- dgg:删除光标当前行及以上内容
- dG:删除光标当前行及以下内容
- dH:删除当前页面第1行至光标行
- yy 复制光标所在的那一整行
- nyy:复制以下n行
- n,my:指定n到m行复制
- p 将已复制的数据在光标的下一行粘贴
- P 将已复制的数据在光标的上一行粘贴
- 在vi编辑器环境中的任意时刻,选择“ESC”键后,编辑器将进入命令模式
-
- vi/vim 文件名 查的内容,若不存在则创建新的
- q! 强制退出,不保存
- wq! 强制保存并退出
- 保存对该文件所做的修改并正常退出vi编辑器
- 在命令模式下执行ZZ命令
- 在末行模式下执行:wq
- 关闭linux系统(不重新启动)可使用命令:
- shutdown -r 重启系统
- halt 等同于 shutdown -l 即彻底关闭
- reboot 重启
★/bin 可执行文件(二进制),本机用户都可执行
★/boot linux内核和引导程序
★/dev 设备文件
★/etc 系统配置文件
★/home 用户主目录
★/initrd 启动时挂在initrdimg映像文件
★/lib 共享库文件
★/lost+found fsck放置的零散文件
★/media 系统自动挂在CD-ROM
★/mnt 被挂载的文件系统
★/opt 可选文件和程序的存放目录
★/proc 存放所有标志为文件的进程
★/root 根用户的主目录
★/sbin 存放更多的可执行文件(二进制)
★/srv
★/sys
★/tmp 存放用户和程序的临时文件
- 线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制
- 线程是程序的多个顺序的流动态执行
- bash环境中挂起当前进程的方式是:
- ctrl+c 中断
- ctrl+z 挂起
- 在退出unix系统账户之后还需要继续运行某个进程,那么可用:nohup
- awk 对数据分析,查找的
- sed 编辑文件的
- crontab 用于设置周期性被执行的指令
- nohup 在注销后使用 nohup 命令运行后台中的程序。
- nohup命令:如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令。该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。nohup(no hang up)就是不挂起的意思
-
awk
-
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
-
使用方法 :
awk '{pattern + action}' {filenames}
- 尽管操作可能会很复杂,但语法总是这样,其中
- pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。
- 花括号({})不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。
- pattern就是要表示的正则表达式,用斜杠括起来。
awk '/root/' /etc/passwd //搜索/etc/passwd有root关键字的所有行
awk -F: '{printf ("filename:%10s, linenumber:%3s,column:%3s,content:%3f\n",FILENAME,NR,NF,$0)}' /etc/passwd
//统计文件名,行号,行的列数,对应的完整行内容
- sed 可依照脚本的指令来处理、编辑文本文件。
- sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。
//将文件xyz中的单词AAA全部替换为BBB
//这条命令并不能修改源文件的内容,而只是把替换后的文件内容输出
sed 's/AAA/BBB/g' xyz;
//如若想改变原来文件的内容的话,可以使用如下命令:
sed 's/AAA/BBB/g' xyz > xyz.tmp
//p,将某个选择的数据打印出来
//-n是只有进过处理的那行在会被列出来
sed -n '/ERP/p' demo.log
-
wc(Word Count)命令:
-
统计指定文件中的字节数、字数、行数,并将统计结果显示输出。
-
命令参数:
-
-c 统计字节数。
-
-l 统计行数。
-
-m 统计字符数。这个标志不能与 -c 标志一起使用。
-
-w 统计字数。一个字被定义为由空白、跳格或换行字符分隔的字符串。
-
-L 打印最长行的长度。
-
-help 显示帮助信息
-
-version 显示版本信息
[root@localhost test] # cat test.txt
hnlinux
peida.cnblogs.com
ubuntu
ubuntu linux
redhat
Redhat
linuxmint
[root @localhost test] # wc test.txt
7 8 70 test.txt
[root @localhost test] # wc -l test.txt
7 test.txt
[root @localhost test] # wc -c test.txt
70 test.txt
[root @localhost test] # wc -w test.txt
8 test.txt
[root @localhost test] # wc -m test.txt
70 test.txt
[root @localhost test] # wc -L test.txt
17 test.txt
说明:
7 8 70 test.txt
行数 单词数 字节数 文件名
- telnet命令
- 通常用来远程登录。telnet程序是基于TELNET协议的远程登录客户端程序。
- Telnet协议是TCP/IP协议族中的一员,是Internet远程登录服务的标准协议和主要方式。
- 它为用户提供了在本地计算机上完成远程主机工作的能力。
- netstat命令
- 查看当前网络连接,用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。
- netstat是在内核中访问网络及相关信息的程序,它能提供TCP连接,TCP和UDP监听,进程内存管理的相关报告。
- route
- 显示并设置内核中网络路由表,主要是静态路由
- traceroute
- 用于追踪数据包在网络上的传输时的全部路径
- /etc/hosts 设定用户自已的IP与名字的对应表(也算是DNS)
- /etc/HOSTNAME 设定用户的节点名
- /etc/resolv.conf 设置DNS
- /etc/gateways 设定动态路由
- 改变权限
chmod 777 filepath - 改变所有者
chown test filepath - 改变所属组
chgrp user filepath
- vsftpd服务流量控制的参数:
- 访问速率设置:
- anon_max_rate=0
- 设置匿名登入者使用的最大传输速度,单位为B/s,0 表示不限制速度。默认值为0。
- local_max_rate=0
- 本地用户使用的最大传输速度,单位为B/s,0 表示不限制速度。预设值为0。
- linux有三种不同类型的进程:
- 1.交互进程:由一个shell启动的进程,交互进程既可以在前台运行,也可以在后台运行
- 2.批处理进程:这种进程和终端没有联系,是一个进程序列
- 3.监控进程:linux系统启动时启动的进程,并在后台运行
[roc@roclinux ~]$ echo 'Hello World'
Hello World
[roc@roclinux ~]$ echo "Hello World"
Hello World
[roc@roclinux ~]$ echo Hello World
Hello World
- 至于单引号、双引号、不加引号的区别,还请看下面的内容。
- 用 echo 显示变量的值
#在 echo 的后面,不仅可以加字符串,还可以加变量名:
#我们定义了一个变量, 叫作str
[roc@roclinux ~]$ str="Hello World"
#在echo后面加上str变量, 照样可以显示出来
[roc@roclinux ~]$ echo "$str, good morning"
Hello World, good morning
-
神奇的反斜杠转义
-
转义字符,是 Shell 中的一些具有特殊功能的字符,比如 \n 表示换行、\t 表示制表符等。转义字符统一由反斜线“\”开头,后跟一个或几个字符,这样就赋予了字符“神奇的能力”。
-
在 echo 中,要使用转义字符,需要使用-e选项,并使用双引号将转义字符括起来。
下面来看看实际的用法吧:
#一个很普通的Hello World
[roc@roclinux ~]$ echo "Hello World"
Hello World
#尾部带有\n的Hello World, \n并没有被赋予"神奇的能力"
[roc@roclinux ~]$ echo "Hello World\n"
Hello World\n
#使用了-e选项后, \n被赋予了"神奇的能力", 它实现了换行效果
[roc@roclinux ~]$ echo -e "Hello World\n"
Hello World
- 从上面的例子可以得出结论:
- 不带-e选项的 echo,将 \n 认为是普通字符;
- 使用了-e选项的 echo,会将 \n 认为是换行符。
- 批量删除当前目录下后缀名为.c的文件:
1. rm *.c
2. find .-name "*.c" -maxdepth 1 | xargs rm
// -maxdepth 1:指的是,搜索深度,意为当前文件夹
// xargs 用于参数传递,当删除项过多时,可能导致rm不能使用这么多参数
- 批量删除当前目录及其子目录下后缀名为.c的文件:
find .-name "*.c" xargs rm
- * * * * * command
分 时 日 月 周 命令
第1列表示分钟1~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令
- 在使用mkdir命令创建新的目录时:
- 在其父目录不存在时先创建父目录 -p
- 设置用户权限 -m
Makefile
- makefile文件保存了编译器和连接器的参数选项
- 主要包含了五个东西:显式规则、隐晦规则、变量定义、文件指示和注释
- 默认的情况下,make命令会在当前目录下按顺序找寻文件名为“GNUmakefile”、“makefile”、“Makefile”的文件, 找到了解释这个文件
- 在Makefile使用include关键字可以把别的Makefile包含进来
- 可执行文件的开头的特征字符串是:ELF
- ssh user@被监控主机ip "uptime"
- 远程查看系统运行了多久
- scp用于远程数据传输
- ssh用于远程登录
- uptime命令可以查看当前linux系统运行了多长时间
- RHEL5系统安装DHCP服务器软件包后
- 系统中不存在配置文件“/etc/dhcpd.conf”需要手工建立
- linux中很多服务以d结尾命名,d代表deamon,守护进程在后台执行
- 服务的设置需要自定义,需要手工创建,有时还需要覆盖掉已经自动创建的conf文件。
- Linux程序运行后,文件句柄0,1,2分别是:
- 标准输入,标准输出,标准错误
- whereis 可查询二进制文件(-b)、帮助文档(-m)、源程序(-s),无选项时,返回所有结果,-u(除上述三种的其它文件)
- which 查看可执行文件的位置
- whatis 查询命令有什么功能
- apropos 搜索指定关键字的命令
- locate并不真正对硬盘上的文件系统进行查找,而是对文件名数据库进行检索,而且可以使用通配符?和*
- 带链接的树形目录结构
- Linux用户磁盘配额配置文件aquota.user的默认访问权限是600
- 孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。
- 僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程。
- 僵尸进程解决方法就是kill那个父进程,于是僵尸进程就可以被init进程接收,释放。
-
内存屏障
- 读屏障、写屏障、通用屏障、优化屏障
- 读屏障用于保证读操作有序。屏障之前的读操作一定会先于屏障之后的读操作完成,写操作不受影响,同属于屏障的某一侧的读操作也不受影响。
- 写屏障用于限制写操作。
- 通用屏障则对读写操作都有作用。
- 优化屏障则用于限制编译器的指令重排,不区分读写。
- 前三种屏障都隐含了优化屏障的功能。
- FTP的两个端口
- 21:这是被动连接,用于最初连接时的身份认证
- 20:用于数据传输,身份认证后,就用此端口进行传输
- 网络管理员编写了shell程序prog1.sh,测试时程序死循环无法结束,可以通过ctrl+C结束程序
- 交换区的大小
- 若一台计算机的内存为128MB,则交换分区的大小通常是256M
- 在内存小于2G的情况下,交换分区应为内存的2倍,超过2G的话,交换分区为物理内存加上2G
- 自旋锁SpinLock
- 运行在多核处理器上的Linux环境中,若临界区非常短(100行),且不允许线程上下文切换的情况下使用
- 不会导致状态切换
- Spinlock优点:没有昂贵的系统调用,一直处于用户态,执行速度快。
- Spinlock缺点:一直占用cpu,而且在执行过程中还会锁bus总线,锁总线时其他处理器不能使用总线。
- Mutex
- Mutex优点:不会忙等,得不到锁会sleep。
- Mutex缺点:sleep时会陷入到内核态,需要昂贵的系统调用。
- 并发
- 第一个,ip地址数。系统ip数越多,建立连接数越多。
- 第二个,内存。占用的大小会影响TCP的连接
- 第三个。句柄最大数。影响network 在vfs操作的上限。
- PWD (print working directory) 和 OLDPWD
- PWD 当前的目录路径,当利用 cd 命令切换当前目录时,系统自动更新 PWD 的值, OLDPWD 记录旧的工作目录,即用户所处的前一个目录。
- PATH
- PATH 是 Linux 中一个极为重要的环境变量,它用于帮助 Shell 找到用户输入的命令。
- 用户所输入的每个命令实际上是一个源代码文件,计算机执行这个文件里的代码以实现这个命令的功能,这些源代码文件称为可执行文件。
- 可执行文件存在于各种各样的目录下, PATH 就记录了一系列的目录列表, Shell 为每个输入命令搜索 PATH 中的目录列表。
- HOME
- HOME 记录当前用户的目录,由 /etc/passwd 的倒数第 2 个域决定, HOME 目录用于保存用户自己的文件
- 实际上当TCP和UDP提供相同的服务时,会选用相同的端口号
- git命令
- 合并代码
- git pull --rebase
- git merge
- git cherry-pick