主要是linux系统的基础:包括一些工具以及文件系统的解释
GPL版权
-- copyleft含义;
-- LGPL含义动态链接ok,静态链接not ok;
-- black duck提供扫版权服务
linux内核版本
-- 最后一位为补丁号,2.6.39 --> 3.0 --> 3.8;
-- 2.6.39.1,2.6为2003年开始
系统层次结构
内核结构
-- 最底层为硬件驱动层,包含:CPU support code,CPU/MMU(内存管理单元) support,块设备驱动,字符设备驱动,网络设备驱动。此层为内存比重最大一层。
-- 中层为 处理管理,内存管理,文件系统支持,设备控制,网络。 中层与具体硬件无关。
-- 上层为系统调用接口
-- 注释
[*] 三个套在一起的圆;内核为最内层,系统调用为中间层,用户态为最外层
[*] 系统调用,软中断,在用户区使用3-4G的空间,在系统调用时,内核态使用超过此限度
[*] 不同程序调用动态链接库代码段会共享,数据段各自独立
内核跟踪命令strace
-- strace ltrace ./a.out
-- strace内核,ltrace动态库
源代码与项目管理工具
-- git --author:linus,c
工具链
GNU Binutils
-- 包括连接程序ld,汇编程序as。主要目的为GUN系统,提供汇编和连接工具
- gprof :程序的统计信息,每个函数被调用情况和次数
gcc -pg
gprof -a.out gmon.out
gcc -fprofile-arcs -ftest-coverage test.cpp
-
nm 动态链接库中的二进制符号(函数)
-
objdump,从目标函数obj中展示信息
-
符号表与debug信息
-- 符号表,与debug信息,反汇编
gcc -g main.c ;符号表与debug信息都有
gcc main.c ;没有dbug信息
strip ./a.out
程序执行 不依赖符号表,所以发布程序时
gdb ==>C+a看是否有代码
-- 可以编写程序依赖库的脚本
GNU GCC
-- 为GUN系统提供C编译器
GUN GLibc
-- 用于定义系统调用和其他基本函数调用
文件系统
proc
-- 内核运行信息放在用户空间来看:cat cpuinfo
-- 进程的pid为阿拉伯数字 cd 1 cat status
-- cd fd ;控制台console
sys
-- 内核信息放在用户信息来看:导出总线外设、驱动等次你 ca bus/ic2/dev1-0060/
dev
-- 设备
-- 主设备号与次设备号,LANANA.org组织维护
temp
-- 临时文件系统
bin、sbin、/usr/bin、/usr/sbin/
-- 二进制程序
lib、/usr/lib
-- 动态链接库
busybox
--命令本身为argv[],本身第一个参数,将linux命令集成在一起
mount
-- 挂载,mount机制扩展文件系统,不同类型的文件系统可以挂载在系统的文件树的任何位置
init
-- upstart
-- systemd
-- android init
Sysvinit
linux系统启动首先从BIOS开始,大概是将boot loader启动起来;进入boot loader后,由它将内核从硬盘装载进内存,完成内核的初始化,内核初始化的最后一步为启动pid为1的进程。它以守护进程的方式存在,是所有其他进程的祖先。不同版本采用了不同的Init实现,根据先后顺序分别为sysvinit、UpStart、systemd。sysvinit是基于脚本的,问题在于启动慢,Upstart已经有8年,不少系统中已经替代了sysinit。systemd出现较晚,发展很快。
运行级别:runlevel
sysinit检查 ‘/etc/inittab’文件中是否含有 initdefault项,来启动默认的运行模式。通常有8种运行模式0到6,S或者s。每种运行模式的定义不太一样,但0,1,6得到了一致。0:关机;1 单用户模式; 6,重启。redHat中3为字符界面的shell模式、5为GUI模式。
ps:说白了就是通过配置文件来启动程序,不同的配置启动模式不同。
sysinit运行顺序
1、/etc/inittab
分析这个文件的内容,它获得以下一些配置信息:
a 系统需要进入的 runlevel
b 捕获组合键的定义
c 定义电源 fail/restore 脚本
d 启动 getty 和虚拟控制台
将系统初始化为预订的runlevel
2、/etc/rc.d/rc.sysinit
rc.sysinit执行一些重要的系统初始化工作
a 激活 udev 和 selinux
b 设置定义在/etc/sysctl.conf 中的内核参数
c 设置系统时钟
d 加载 keymaps
e 使能交换分区
f 设置主机名(hostname)
g 根分区检查和 remount
h 激活 RAID 和 LVM 设备
i 开启磁盘配额
j 检查并挂载所有文件系统
k 清除过期的 locks 和 PID 文件
3、/etc/rc.d/rc 和/etc/rc.d/rcX.d/ (X 代表运行级别 0-6)
根据不同的 runlevel,rc 脚本将打开对应该 runlevel 的 rcX.d 目录(X 就是 runlevel),找到并运行存放在该目录下的所有启动脚本。每个 runlevel X 都有一个这样的目录,目录名为/etc/rc.d/rcX.d
在这些目录下存放着很多不同的脚本,文件名以 S 开头的脚本就是启动时应该运行的脚本,S 后面跟的数字定义了这些脚本的执行顺序。在/etc/rc.d/rcX.d 目录下的脚本其实都是一些软链接文件,真实的脚本文件存放在/etc/init.d 目录下。
4、/etc/rc.d/rc.local
rc.local 是 Linux 留给用户进行个性化设置的地方。您可以把自己私人想设置和启动的东西放到这里,一台 Linux Server 的用户一般不止一个,所以才有这样的考虑。
5、X Display Manager(如果需要的话)
Sysvinit 和 系统关闭
Sysvinit 不仅需要负责初始化系统,还需要负责关闭系统。在系统关闭时,为了保证数据的一致性,需要小心地按顺序进行结束和清理工作。
比如应该先停止对文件系统有读写操作的服务,然后再 umount 文件系统。否则数据就会丢失。
这种顺序的控制这也是依靠/etc/rc.d/rcX.d/目录下所有脚本的命名规则来控制的,在该目录下所有以 K 开头的脚本都将在关闭系统时调用,字母 K 之后的数字定义了它们的执行顺序。
Sysvinit 的管理和控制功能
原始的 sysvinit 软件包包含了一系列的控制启动,运行和关闭所有其他程序的工具。
halt 停止系统。
init 这个就是 sysvinit 本身的 init 进程实体,以 pid1 身份运行,是所有用户进程的父进程。最主要的作用是在启动过程中使用/etc/inittab 文件创建进程。
mesg 控制其它用户对用户终端的访问
pidof 找出程序的进程识别号(pid),输出到标准输出设备。
poweroff 等于 shutdown -h –p,或者 telinit 0。关闭系统并切断电源。
reboot 等于 shutdown –r 或者 telinit 6。重启系统。
wall 向所有有信息权限的登录用户发送消息。