目录

  • 一 版本查询命令
    • 1 查看当前使用Linux内核版本
    • 2 搜索目前存在的内核版本
    • 3 查看Linux系统版本
    • 4 glibc版本
  • 二 UNIX标准
    • 1 ANSI C
    • 2、POSIX
    • 3 SVID
    • 4 XPG
    • 5 Glibc
  • 三 相关库
    • 1 libc
    • 2 glibc
    • 3 eglibc
    • 4 glib
    • 5 libc++/libstdc++
  • 四 RFC
  • 五 MIME
  • 六 Linux启动流程
    • 1 BIOS
    • 2 第一阶段引导加载程序
    • 3 第二阶段引导加载程序(次引导加载程序执行)
    • 4 init进程
    • 5 补充
  • 七 开关机命令
    • 1 shutdown
    • 2 halt
    • 3 reboot
    • 4 init

一 版本查询命令

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,即重新启动。

linux版本及系统启动过程相关推荐

  1. Linux入门之系统启动过程及初始化----“翻滚吧,牛宝宝”

    每当你按下开机电源键的时候,总是怀着一颗虔诚的心,抱着求神拜佛的念头,祈求机器顺利开机,不要出幺蛾子:每当你看到屏幕上输出的一行又一行的信息,绿的OK,红的failed,迷茫的眼神穿透了显示器:这一切 ...

  2. 嵌入式linux的u-boot系统启动过程,嵌入式linux操作系统u-boot启动顺序以及代码解析...

    嵌入式linux操作系统u-boot启动顺序以及代码解析 (9页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 Bootloader/u-bo ...

  3. 嵌入式linux的u-boot系统启动过程,【站友投递】U-boot启动过程详解

    [站友投递]U-boot启动过程详解 来源:互联网 作者:denny 时间:2009-03-18 Tag:点击: 一.U-BOOT的目录结构 u-boot目录下有18个子目录,分别存放管理不通的源程序 ...

  4. 系统启动过程Linux

    操作系统的启动分为两个阶段:引导boot和启动startup.引导阶段开始于打开电源开关,结束于内核初始化完成和 systemd 进程成功运行.启动阶段接管了剩余工作,直到操作系统进入可操作状态. 总 ...

  5. 剖析Linux系统启动过程

    http://www.5dmail.net/html/2004-11-29/20041129102711.htm 内容提要 本文以RedHat9.0和i386平台为例,剖析了从用户打开电源直到屏幕出现 ...

  6. rhel系统启动过程_技术|Linux 开机引导和启动过程详解

    你是否曾经对操作系统为何能够执行应用程序而感到疑惑?那么本文将为你揭开操作系统引导与启动的面纱. 理解操作系统开机引导和启动过程对于配置操作系统和解决相关启动问题是至关重要的.该文章陈述了 GRUB2 ...

  7. Linux的简介与系统启动过程

    Linux的简介与系统启动过程 文章目录 Linux的简介与系统启动过程 Linux简介 英文解释 Linux开源 Linux 的发行版 Linux应用 Linux vs Windows Linux安 ...

  8. 嵌入式Linux系统启动过程

    一个嵌入式 Linux 系统从软件角度看可以分为四个部分:引导加载程序(Bootloader), Linux 内核,文件系统,应用程序. 当系统首次引导时,或系统被重置时,处理器会执行一个位于Flas ...

  9. linux系统启动过程详解-开机加电后发生了什么 --linux内核剖析(零)

    本文参考了如下文章 深入理解linux启动过程 mbr (主引导记录(Master Boot Record)) 电脑从开机加电到操作系统main函数之前执行的过程 详解linux系统的启动过程及系统初 ...

最新文章

  1. PHP的addslashes 函数详解
  2. 保证相同类型的MDI子窗体只会被打开一次的方法
  3. 用栈实现队列和用队列实现栈
  4. MLCC噪声啸叫及对策
  5. scrapy模拟登录新浪微博
  6. FFMPEG解码多线程
  7. java连加密的mysql_Java 实现加密数据库连接
  8. 《和平精英》崩了 官方回应:受运营商网络波动影响 正在修复
  9. 如何实现分布式锁?已拿意向书!
  10. Atitit 指令集(IA及指令集架构 1. 指令集(IA:InstructionSet)是指CPU指令系统所能识别(翻译)执行的全部指令的集合。 1 1.1. (1)运算指令 1 1.2. (2)
  11. 【新技术】 移动支付过程中的NFC技术
  12. 明清徽州宗族的异姓承继
  13. html批量替换不同关键词,JS批量替换内容中关键词为超链接
  14. IDEA SpringBoot 自定义Banner
  15. httpclient动态代理ip
  16. SQL存储过程根据,循环取出数据
  17. 怎样成为一名优秀的程序员?
  18. 做网站的人必须遵守的N大定律
  19. 电脑常用笔记及软件个人存档
  20. linux磁盘合盘,超强启动盘制作工具MBROSTool(可隐藏,多分区,多启动)

热门文章

  1. html图片文字 网格布局,【图片版】CSS网格布局(Grid)完全教程
  2. 海明码 校验位数公式的理解
  3. 计算机用户无法加载配置文件,““用户配置文件服务登录失败。无法加载用户配置文件””的解决方案...
  4. Latex公式换行编写
  5. 2017html5框架排名,2017年最主流前端框架比较:Angular、React 和 Vue
  6. 学习计算机基础知识论文,中小学生应注重学习计算机的基础知识_信息技术论文.doc...
  7. 某公司的员工分为5类,每类员工都有相应的封装类。(黑马第三版Java基础入门 第四章编程题)
  8. flex弹性布局常用属性
  9. 蓝牙耳机什么牌子的好用?口碑比较好的国产蓝牙耳机推荐
  10. TCP/IP 这猝不及防的爱情