linux版本及系统启动过程

一 版本查询命令

1 查看当前使用Linux内核版本

  cat /proc/version或者 uname -a

2 搜索目前存在的内核版本

  apt-cache search linux|grep linux-image

3 查看Linux系统版本

  1、lsb_release -a:这个命令适用于所有的Linux发行版,包括Redhat、SuSE、Debian…等发行版。
  2、cat /etc/redhat-release:这种方法只适合Redhat系的Linux。

4 glibc版本

getconf GNU_LIBC_VERSION
#include <stdio.h>
#include <gnu/libc-version.h>

int main(int argc, char *argv[])
{
    printf( "glibc's version: %s\n", gnu_get_libc_version() );
    return 0;
}

二 UNIX标准

1 ANSI C

  这一标准是 ANSI(美国国家标准局)于 1989 年制定的 C 语言标准。 后来被 ISO(国际标准化组织)接受为标准,因此也称为 ISO C。
  ANSI C 的目标是为各种操作系统上的 C 程序提供可移植性保证,而不仅仅限于 UNIX。 该标准不仅定义了 C 编程语言的语发和语义,而且还定义了一个标准库。这个库可以根据 头文件划分为 15 个部分,其中包括:字符类型 (<ctype.h>)、错误码 (<errno.h>)、 浮点常数 (<float.h>)、数学常数 (<math.h>)、标准定义 (<stddef.h>)、 标准 I/O (<stdio.h>)、工具函数 (<stdlib.h>)、字符串操作 (<string.h>)、 时间和日期 (<time.h>)、可变参数表 (<stdarg.h>)、信号 (<signal.h>)、 非局部跳转 (<setjmp.h>)、本地信息 (<local.h>)、程序断言 (<assert.h>) 等等。

2、POSIX

  该标准最初由 IEEE 开发的标准族,部分已经被 ISO 接受为国际标准。
  POSIX.1 和 POSIX.2 分别定义了 POSIX 兼容操作系统的 C 语言系统接口 以及 shell 和工具标准。这两个标准是通常提到的标准。POSIX 表示可移植操作系统接口(Portable Operating System Interface ,缩写为 POSIX 是为了读音更 像 UNIX)。电气和电子工程师协会(Institute of Electrical and Electronics Engineers,IEEE) 最初开发 POSIX 标准,是为了提高 UNIX 环境下应用程序的可移植性。然而,POSIX 并不局限于 UNIX。 许多其它的操作系统,例如 DEC OpenVMS 和 Microsoft Windows NT,都支持 POSIX 标准,尤其是 IEEE Std. 1003.1-1990(1995 年修订)或 POSIX.1,POSIX.1 提供了源代码级别的 C 语言应用编程 接口(API)给操作系统的服务程序,例如读写文件。POSIX.1 已经被国际标准化组织(International Standards Organization,ISO)所接受,被命名为 ISO/IEC 9945-1:1990 标准。

3 SVID

  System V 的接口描述。System V 接口描述(SVID)是描述 AT&&;T Unix System V 操作 系统的文档,是对 POSIX 标准的扩展超集。

4 XPG

  X/Open 可移植性指南。X/Open 可移植性指南(由 X/Open Company, Ltd.出版), 是比 POSIX 更为一般的标准。X/Open 拥有 Unix 的版权,而 XPG 则指定成为 Unix 操作系统必须满足的要求。

5 Glibc

  众所周知,C 语言并没有为常见的操作,例如输入/输出、内存管理,字符串操作等提供内置的支持。 相反,这些功能一般由标准的“函数库”来提供。GNU 的 C 函数库,即 glibc,是 Linux 上最重要的 函数库,它定义了 ISO C 标准指定的所有的库函数,以及由 POSIX 或其他 UNIX 操作系统 统变种指定的附加特色,还包括有与 GNU 系统相关的扩展。目前,流行的 Linux 系统使用 glibc 2.0 以上的版本。glibc 基于如下标准:

  • ISO C: C 编程语言的国际标准,即 ANSI C。
  • POSIX:GNU C 函数库实现了 ISO/IEC 9945-1:1996 (POSIX 系统应用程序编程接口, 即 POSIX.1)指定的所有函数。该标准是对 ISO C 的扩展,包括文件系统接口原 语、设备相关的终端控制函数以及进程控制函数。同时,GUN C 函数库还支持部分由 ISO/IEC 9945-2:1993(POSIX Shell 和 工具标准,即 POSIX.2)指定的函数, 其中包括用于处理正则表达式和模式匹配的函数。
  • Berkeley Unix:BSD 和 SunOS。GNU C 函数库定义了某些 UNIX 版本中尚未标准化的函数, 尤其是 4.2 BSD, 4.3 BSD, 4.4 BSD Unix 系统(即“Berkeley Unix”)以及“SunOS” (流行的 4.2 BSD 变种,其中包含有某些 Unix System V 的功能)。BSD 函数包括 符号链接、select 函数、BSD 信号处理函数以及套接字等等。
  • SVID:System V 的接口描述。GNU C 函数库定义了大多数由 SVID 指定而未被 ISO C 和 POSIX 标准指定的函数。来自 System V 的支持函数包括进程间通信和共享内存、 hsearch 和 drand48 函数族、fmtmsg 以及一些数学函数。
  • XPG:X/Open 可移植性指南。GNU C 函数库遵循 X/Open 可移植性指南(Issue 4.2) 以及所有的 XSI(X/Open 系统接口)兼容系统的扩展,同时也遵循所有的 X/Open Unix 扩展。

三 相关库

  环境:Linux

1 libc

  libc是Linux下原来的标准C库,也就是当初写hello world时包含的头文件#include < stdio.h> 定义的地方。
  后来逐渐被glibc取代,也就是传说中的GNU C Library,在此之前除了有libc,还有klibc,uclibc。现在只要知道用的最多的是glibc就行了,主流的一些linux操作系统如 Debian, Ubuntu,Redhat等用的都是glibc(或者其变种,下面会说到)。

2 glibc

  glibc是Linux系统中最底层的API,几乎其它任何的运行库都要依赖glibc。glibc最主要的功能就是对系统调用的封装,用fopen函数就能打开文件,打开文件最终还是要触发系统中的sys_open系统调用,而这中间的处理过程都是glibc来完成的。详细介绍了glibc是如何与上层应用程序和系统调用交互的。除了封装系统调用,glibc自身也提供了一些上层应用函数必要的功能,如string,malloc,stdlib,linuxthreads,locale,signal等等。

3 eglibc

  这里的e是Embedded的意思。eglibc的主要特性是为了更好的支持嵌入式架构,可以支持不同的shell(包括嵌入式),但它是二进制兼容glibc的,就是说如果你的代码之前依赖eglibc库,那么换成glibc后也不需要重新编译。ubuntu系统用的就是eglibc(而不是glibc),不信,你执行 ldd –version 或者 /lib/i386-linux-gnu/libc.so.6
(64位系统运行/lib/x86_64-linux-gnu)看看,便会显示你系统中eglibc/glibc的版本信息。 这里提到了libc.so.6,这个文件就是eglibc/glibc编译后的生成库文件。

4 glib

  glib也是个c程序库,不过比较轻量级,glib将C语言中的数据类型统一封装成自己的数据类型,提供了C语言常用的数据结构的定义以及处理函数,有趣的宏以及可移植的封装等(注:glib是可移植的,说明你可以在linux下,也可以在windows下使用它)。那它跟glibc有什么关系吗?其实并没有,除非你的程序代码会用到glib库中的数据结构或者函数,glib库在ubuntu系统中并不会默认安装(可以通过apt-get install libglib2.0-dev手动安装),著名的GTK+和Gnome底层用的都是glib库。想更详细了解glib? 可以参考这里

5 libc++/libstdc++

  libc++是针对clang编译器特别重写的C++标准库,那libstdc++自然就是gcc的事儿了。相比glibc,libstdc++虽然提供了c++程序的标准库,但它并不与内核打交道。对于系统级别的事件,libstdc++首先是会与glibc交互,才能和内核通信。相比glibc来说,libstdc++就显得没那么基础了。

四 RFC

  Request For Comments(RFC),是一系列以编号排定的文件。文件收集了有关互联网相关信息,以及UNIX和互联网社区的软件文件。目前RFC文件是由Internet Society(ISOC)赞助发行。基本的互联网通信协议都有在RFC文件内详细说明。RFC文件还额外加入许多的论题在标准内,例如对于互联网新开发的协议及发展中所有的记录。因此几乎所有的互联网标准都有收录在RFC文件之中。

五 MIME

  MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。多用途互联网邮件扩展,它是一个互联网标准,在1992年最早应用于电子邮件系统,但后来也应用到浏览器。服务器会将它们发送的多媒体数据的类型告诉浏览器,而通知手段就是说明该多媒体数据的MIME类型,从而让浏览器知道接收到的信息哪些是MP3文件,哪些是Shockwave文件等等。服务器将MIME标志符放入传送的数据中来告诉浏览器使用哪种插件读取相关文件。
  它是一个互联网标准,扩展了电子邮件标准,使其能够支持:
  非ASCII字符文本;非文本格式附件(二进制、声音、图像等);由多部分(multiple parts)组成的消息体;包含非ASCII字符的头信息(Header information)。
  浏览器接收到文件后,会进入插件系统进行查找,查找出哪种插件可以识别读取接收到的文件。如果浏览器不清楚调用哪种插件系统,它可能会告诉用户缺少某插件,或者直接选择某现有插件来试图读取接收到的文件,或者可能会导致系统的崩溃。传输的信息中缺少MIME标识可能导致的情况很难估计,因为某些计算机系统可能不会出现什么故障,但某些计算机可能就会因此而崩溃。
  在把输出结果传送到浏览器上的时候,浏览器必须启动适当的应用程序来处理这个输出文档。这可以通过多种类型MIME(多功能网际邮件扩充协议)来完成。在HTTP中,MIME类型被定义在Content-Type header中。

六 Linux启动流程

1 BIOS

  启动BIOS,这个是固化在主板上芯片里的,BIOS用到的数据也存储在主板的一块RAM上,叫做CMOS,里面存储了引导顺序(USB?还是硬盘某个分区还是CD?),BIOS的主要工作是进行POST加电自检,也就是检查主机核心硬件是否正常,然后开始引导设备上的引导记录。
  Linux是从硬盘上引导的,其主引导记录(MBR,在硬盘的第一个扇区从硬盘0柱面0磁道第一扇区512字节的MBR主引导记录)中包含引导加载程序,BIOS将MBR加载到内存之后,控制权交给MBR。Master boot record。

2 第一阶段引导加载程序

  MBR如下图:
在这里插入图片描述
  这个就是在磁盘上的第一个扇区的东西。黄色的446字节是这个可执行程序的代码段。他做的事情就是读下面64字节的Partition Table(分区表),分区表里面记录着次引导加载程序的地址,(一般只有一个是活跃的),找到之后就把他从磁盘中加载到内存,并执行他。

3 第二阶段引导加载程序(次引导加载程序执行)

  次引导加载程序,其实就是加载内核的程序,这个阶段他主要做的事情就是加载内核和加载可选的RAM磁盘(虚拟磁盘,用RAM模拟磁盘)。
  其实在第一阶段的时候,最初是要多运行一个加载程序的,就是1.5阶段的引导程序,他是负责注册一个特殊的文件系统,专门给内核映像用的,这个1.5阶段的引导程序运行了之后,第二阶段的引导加载程序才可以加载到内存运行。
  第二阶段引导程序将内核映像和initrd映像加载到内存,将控制权交给内核例程,从内核代码的head.s这个汇编文件中的代码开始执行,然后调个c函数decompress_kernel来解压内核,内核就被解压到内存的高端内存中了,然后初始化页表,启动内存分页,然后执行源码中那段main.c下的Start_kernel函数,这就是内核的Main函数,然后会启动一个kernel_thread,来启动init函数,这就是用户空间的第一个进程。initrd被加载到内存中,挂载到内核文件系统中,提供了系统访问磁盘和磁盘上文件的方法,挂载根文件系统。

4 init进程

  init 进程就是进程号为1的进程,它要做的事情是运行开机启动的程序,就是根据/etc/inittab中系统初始化配置执行 /etc/rc.sysinit 脚本,然后找到运行运行级别下的可执行程序启动对应服务,运行 /etc/rc.local,生成终端待用户登录,然后加载shell(cmd)。

5 补充

  /sbin/init:在核心完整的加载后,开始运行系统的第一支程序,主要的功能就是准备软件运行的环境,包括系统的主机名称、网络配置、语系处理、文件系统格式及其他服务的启动等。
  /bin/sh:解释脚本的shell命令,开机后运行。
  /etc/sysvinit:就是 system V 风格的 init 系统,顾名思义,它源于 System V 系列UNIX。sysvinit 中运行模式描述了系统各种预订的运行模式。
  /etc/inittab:定义了系统引导时的运行级别, 进入或者切换到一个运行级别时做什么。

七 开关机命令

1 shutdown

  在linux命令中reboot是重新启动,shutdown -r now 是立即停止然后重新启动,都说他们两个是一样的,其实是有一定的区别的。
  shutdown命令可以安全地关闭或重启Linux系统,它在系统关闭之前给系统上的所有登录用户提示一条警告信息。该命令还允许用户指定一个时间参数,可以是一个精确的时间,也可以是从现在开始的一个时间段。精确时间的格式是hh:mm,表示小时和分钟,时间段由+ 和分钟数表示。系统执行该命令后会自动进行数据同步的工作。
  该命令的一般格式:shutdown [选项] [时间] [警告信息],命令中各选项的含义为:

  • k 并不真正关机而只是发出警告信息给所有用户;
  • r 关机后立即重新启动;
  • h 关机后不重新启动;
  • f 快速关机重启动时跳过fsck;
  • n 快速关机不经过init 程序;
  • c 取消一个已经运行的shutdown;

  需要特别说明的是该命令只能由超级用户使用。
  例1,系统在十分钟后关机并且马上重新启动:shutdown –r +10
  例2,系统马上关机并且不重新启动:shutdown –h now
halt是最简单的关机命令,其实际上是调用 shutdown -h 命令。halt执行时,杀死应用进程,文件系统写操作完成后就会停止内核。

2 halt

  halt命令的部分参数如下:
  [-f] 没有调用shutdown而强制关机或重启;
  [-i] 关机或重新启动之前,关掉所有的网络接口;
  [-p] 关机时调用poweroff,此选项为缺省选项;

3 reboot

  reboot的工作过程与halt类似,其作用是重新启动,而halt是关机。其参数也与halt类似。reboot命令重启动系统时是删除所有的进程,而不是平稳地终止它们。因此,使用reboot命令可以快速地关闭系统,但如果还有其它用户在该系统上工作时,就会引起数据的丢失。所以使用reboot命令的场合主要是在单用户模式。

4 init

  init是所有进程的祖先,其进程号始终为1。init用于切换系统的运行级别,切换的工作是立即完成的。init 0命令用于立即将系统运行级别切换为0,即关机;init 6命令用于将系统运行级别切换为6,即重新启动。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值