Operating System (mainly Linux)

249 阅读2分钟

pkg-config

pc文件的两个路径:

  1. /usr/lib下的所有*.pc文件。
  2. PKG_CONFIG_PATH环境变量所指向的路径下的所有*.pc文件。

两个常用的指令

  1. --cflags 包含了编译选项
  2. --libs 包含了常用的lib目录
# 示例
prefix=/usr/local 
exec_prefix=${prefix} 
includedir=${prefix}/include 
libdir=${exec_prefix}/lib
Name: foo Description: The foo library 
Version: 1.0.0 
Cflags: -I${includedir}/foo 
Libs: -L${libdir} -lfoo

常见文件夹作用

  • /media 光盘 软盘 由系统挂载
  • /mnt 由用户手动挂载

与命令行有关

  • /sbin 超级用户指令, cfdisk、dhcpcd、dump
  • /bin 基本指令,例如: cat、 ls、 cp。
  • /lib 依赖库,包含了bin所需要的依赖,为内核级./usr/lib是系统级的,/usr/local/lib是用户级的.

  • /usr 应用程序以及相应库文件(包括用户以及系统)

    which is similar withC:/Windows/System32 /usr/include linux下开发和编译应用程序所需要的头文件 /usr/source 系统级源码 /usr/lib 常用的动态链接库和软件包的配置文件 /usr/bin 众多的应用程序

    which is similar withC:/Progrem Files/ /usr/local/include linux下开发和编译应用程序所需要的头文件 /usr/local/src:用户级的源码目录 /usr/local/bin 本地增加的命令 /usr/local/lib 本地增加的库

    /usr/sbin 超级用户的一些管理程序 /usr/man 帮助文档 /usr/doc linux文档 /usr/src 源代码,linux内核的源代码就放在/usr/src/linux里

    blog.csdn.net/gotosola/ar…

  • /opt 第三方软件


  • /etc 配置文件
  • /dev 设备信息
  • /proc 内存映射
  • /lost+found 系统恢复文件
  • /var 包括了一些数据文件,如系统日志,锁等

常见命令

  • 查找文件中的某个字符串 grep -rn function / //参数 + 字符名 + 路径

  • 查找某个文件 find / -name httpd.conf //路径 + 参数 + 文件名

  • 删除命令行内容 ctrl + u 光标之前的内容 ctrl + k 光标之后的内容

  • 内存 free

  • 硬盘 df

  • 内核 uname

  • 进程 ps or top

  • 程序运行时间 time ***

gdb常见命令

file                             装入想要调试的可执行文件.
kill             k              终止正在调试的程序.
list             l               列出产生执行文件的源代码的一部分.
next           n              执行一行源代码但不进入函数内部.
step          s               执行一行源代码而且进入函数内部.
continue  c                继续执行程序,直至下一中断或者程序结束。
run            r               执行当前被调试的程序.
quit           q               终止 gdb.
watch                        使你能监视一个变量的值而不管它何时被改变.
catch                         设置捕捉点.
thread       t               查看当前运行程序的线程信息.
break        b              在代码里设置断点, 这将使程序执行到这里时被挂起.
make                        使你能不退出 gdb 就可以重新产生可执行文件.
shell                         使你能不离开 gdb 就执行 UNIX shell 命令. 
print          p              打印数据内容。
examine   x              打印内存内容。
backtrace bt             查看函数调用栈的所有信息。

参考链接

内存映射 mmap

本质上通过建立映射,来避免拷贝。这里以一次完整的文件读的流程为例。

  • 文件的读 传统方法:磁盘->内核空间->用户空间 //两次拷贝 内存映射:磁盘--内核空间->用户空间 //一次拷贝

    -- 代表了映射关系,映射不需要拷贝,一定程度上可以理解成指针访问。 当用户请求访问时,才会真正读取数据。

  • 进程间通信 传统方法:用户空间1->内核空间->用户空间2 //两次拷贝,namedpipe 内存映射:用户空间1->内核空间--用户空间2 //一次拷贝, shared memory

    用户空间各进程之间独立,内核空间各进程之间共享。

参考链接

G++/GCC

常用参数

rc VS profile (bash)

当用户通过ssh等登录的方式打开shell时,会执行bash_profile (ubuntu 中为profile) 当用户通过界面方式打开shell时,会执行bashrc

  1. 只有交互模式才会执行此代码,非交互模式不执行,如bash xxx.sh
  2. 有全局与用户之分,首先/etc/bash.bashrc then ~/.bashrc.
  3. 一般bash_profile 内部会调用bashrc
  4. /etc/environment:是系统启动时读取的第一个文件,该文件设置的是整个系统的环境,只要启动系统就会读取该文件,与用户登录无关。系统使用此文件时并不是执行此文件中的命令,而是根据而是根据KEY=VALUE模式的代码,对KEY赋值以VALUE. <blog.csdn.net/u010533843/… >
  5. 切换用户不会继承env, 如果想要保留执行sudo -E xx

PATH env

  • linux PATH 可执行文件 LD_LIBRARY_PATH 动态链接库文件(so)

  • windows PATH 可执行文件(exe) 与 动态链接库文件(dll)

压缩与解压文件

tar -czvf test.tar.gz a.c //压缩 a.c文件为test.tar.gz tar -xzvf test.tar.gz //解压

c:创建打包文件 x:还原打包文件

z:使用zip压缩 v:显示详细信息 f: 指定文件

文件权限命令

usermod用于修改用户的UID、GID与groups,具体用法:

usermod -u 9999 testuser  // 将testuser的UID修改为9999
usermod -g 9999 testuser  // 将testuser的GID修改为9999
usermod -G 9999 testuser  // 将testuser的附加组修改为9999

chownchmod 前者用于修改文件与用户的绑定关系,后者用于设置绑定关系的具体权限。

chown -R root:root /tmp/tmp1  // -R参数同时
chmod [-Rf] u+w 文件名   // 用户所有者增加写权限
chmod [-Rf] 777 文件名   // 给文件赋予777权限

环境变量

  • windows中在 bat文件中set命令后需要加"", 例如 set "PATH=%PATH%;c:/Users/xx"
  • windows 中如果运行时加载dll失败,可能时因为加载此dll所依赖的dll失败,需要将其添加到PATH目录下
  • visual studio 中environment设置两次"path",第二次会覆盖掉第一次的,一般可以取消继承父目录

用户切换

  • sudo su 切换到root
  • su username 切换到普通用户

软件安装

Ubuntu Cenos
安装包格式 .deb .rpm
离线安装软件 dpkg rpm
在线安装软件 apt yum

以Ubuntu为例

  1. dpkg与apt的区别 两者都会检查依赖关系,但是dpkg不会自动安装。 apt install内部执行流程,
    1. 扫描list中对应包的下载地址
    2. 检查依赖关系
    3. 下载deb包以及安装。
  2. dpkg与make install的区别 dpkg 提供了更好的包管理 askubuntu.com/questions/3…
  3. 安装包之间的互相转换 alien askubuntu.com/questions/3…

动态链接库在不同系统下对比

windows linux
动态链接库后缀 .dll .so
动态链接库env PATH LD_LIBRARY_PATH
动态链接库folder bin lib
可执行文件后缀 .exe .out
可执行文件env PATH PATH
可执行文件folder bin bin

编译期间的区别:linux直接链接动态库文件(so),与linux不同,windows 在编译时需要动态链接库文件(dll),而是lib文件。

MBR

MBR占据物理磁盘的第一个扇区(512bytes),其中只有64bytes用来存放分区表,最多四个分区表(每个16bytes).

  • 最多访问2^32*512bytes,大约为2T的空间。
  • 主分区就是真实的分区
  • 扩展分区就是存放了逻辑分区的地址(最多只能有一个)
  • 逻辑分区类似附加的分区。

现在已经几乎不用了。

参考鸟哥图2.2.6 blog.csdn.net/bruce135lee… blog.csdn.net/White_Idiot…

  • GPT分区没有了逻辑分区,扩展分区等概念,所有的分区都是主分区。

开机流程

  1. BIOS,识别第一个可用的设备
  2. MBR,446bytes的程序
  3. Boot loader,其他分区的loader
  4. 内核文件,真正的系统
  • loader只会认识自己分区内的系统或者其他分区的loader。
  • 每一个分区都有自己的boot sector
  • Windows安装会覆盖自己分区的loader,以及MBR,所有安装双系统的时候,建议优先安装windows.

linux 系统启动流程

  1. 加载内核文件/boot 目录下
  2. 运行第一个程序 /sbin/init,作用是初始化系统环境

    由于init是第一个运行的程序,它的进程编号(pid)就是1。其他所有进程都从它衍生,都是它的子进程 许多程序需要开机启动。它们在Windows叫做"服务"(service),在Linux就叫做"守护进程"(daemon)。

  3. 确定运行级别
    • Linux允许为不同的场合,分配不同的开机启动程序,这就叫做"运行级别"(runlevel)。也就是说,启动时根据"运行级别",确定要运行哪些程序。
    • 运行级别的默认配置文件存放在/etc/inittab
  4. 加载开机启动程序
    • 不同级别需要运行的脚本文件放在/etc/rcN.d目录
  5. 用户登陆
    • 执行bashrc(本地)或者bash_profile(远程)
  • Linux 核心会以自己的功能重新侦测一次硬件, 而不一定会使用 BIOS 侦测到的硬件信息喔! 也就是说, 核心此时才开始接管 BIOS 后的工作了。 那么核心文件在哪里啊? 一般来说, 他会被放置到 /boot 里面, 并且取名为 /boot/vmlinuz
  • 虚拟文件系统 ( Initial RAM Disk 或 Initial RAM Filesystem) 一般使用的文件名为 /boot/initrd 或 /boot/initramfs , 这个文件的特色是, 他也能够通过 boot loader 来载入到内存中, 然后这个文件会被解压缩 并且在内存当中仿真成一个根目录, 且此仿真在内存当中的文件系统能够提供一支可执行的程序, 通过该程序来 载入开机过程中所最需要的核心模块, 通常这些模块就是 USB, RAID, LVM, SCSI 等文件系统与磁盘接口的驱动 程序啦! 等载入完成后, 会帮助核心重新调用 systemd 来开始后续的正常开机流程

主要参考

linux 内核文件

  • 核心文件位置: /boot/vmlinuz 或 /boot/vmlinuz-version

  • 核心模块文件位置: /lib/modules/version/kernel 或 /lib/modules/$(uname -r)/kernel

    • arch : 与硬件平台有关的项目, 例如 CPU 的等级等等;
    • crypto : 核心所支持的加密的技术, 例如 md5 或者是 des 等等;
    • drivers : 一些硬件的驱动程序, 例如显卡、 网卡、 PCI 相关硬件等等;
    • fs : 核心所支持的 filesystems , 例如 vfat, reiserfs, nfs 等等;
    • lib : 一些函数库;
    • net : 与网络有关的各项协定数据, 还有防火墙模块 (net/ipv4/netfilter/*) 等等;
    • sound : 与音效有关的各项模块;

常见命令

  • modinfo 查看模块信息
  • lsmod 检查核心载入了多少的模块
  • depmod 创建/lib/modules/$(uname -r)/modules.dep, 里面包含了模块之间的依赖关系
  • modprobe 载入模块并且检查依赖并且安装 (modprobe 会主动的去搜寻 modules.dep 的内容)
  • insmod 完全由使用者自行载入一个完整文件名的模块, 并不会主动的分析模块相依性啊!

计算机基础

  • 南桥负责速度较慢的接口,例如硬盘,USB,网卡,IO

  • 北桥负责速度较快的接口,例如内存,显卡

  • CPU 主频=外频*倍频 (能够让不同速度之间的设备正常通信)

  • 内存双通道的原理是增加总线的宽度。

扇区->磁道->柱面

  • 扇区:512bytes

  • 磁道:扇区组成的一个同心圆

  • 柱面:所有盘片的同一个磁道,也是分割硬盘的最小单位

  • 正常的实体机器大概使用的都是 /dev/sd[a-] 的磁盘文件名,至于虚拟机环境底下,为了加速,可能就会使用 /dev/vd[a-p] 这种装置文件名。

扇区是硬盘上存储的最小物理单位 N个扇区可以组成簇,N取决于不同的文件系统或是文件系统的配置,簇是此文件系统中的最小存储单位 所有盘面上的同一磁道构成一个圆柱,称为柱面,柱面是系统分区的最小单位