《趣谈Linux操作系统》专栏阅读笔记之概述和系统初始化

文章目录

  • 图解CS结构
  • Linux命令
  • 系统调用
  • X86架构
  • 汇编指令
  • 内核初始化
  • 系统调用的过程

文件操作在各个层的数据结构的关联

图解CS结构

《趣谈Linux操作系统》专栏阅读笔记之概述和系统初始化_第1张图片
《趣谈Linux操作系统》专栏阅读笔记之概述和系统初始化_第2张图片

Linux命令

ls -l
《趣谈Linux操作系统》专栏阅读笔记之概述和系统初始化_第3张图片

  • 第一个字段的第一个字符是文件类型。如果是“-”,表示普通文件如果是 d,就表示目录。当然还有很多种文件类型,咱们后面遇到的时候再说,你现在先记住我说的这两个就行了。

  • 第一个字段剩下的 9 个字符是模式,其实就是权限位(access permission bits)。3 个一组,每一组 rwx 表示“读(read)”“写(write)”“执行(execute)”。如果是字母,就说明有这个权限;如果是横线,就是没有这个权限。

  • 这三组分别表示文件所属的用户权限、文件所属的组权限以及其他用户的权限。例如,上面的例子中,-rw-r–r-- 就可以翻译为,这是一个普通文件,对于所属用户,可读可写不能执行;对于所属的组,仅仅可读;对于其他用户,也是仅仅可读。如果想改变权限,可以使用命令 chmod 711 hosts。

  • 第二个字段是硬链接(hard link)数目。 第三个字段是所属用户,第四个字段是所属组。第五个字段是文件的大小,第六个字段是文件被修改的日期,最后是文件名。你可以通过命令chown改变所属用户,chgrp改变所属组。

Linux 现在常用的有两大体系,一个是 CentOS 体系,一个是 Ubuntu 体系,前者安装包使用 rpm,后者安装包使用 deb。CentOS 下面使用rpm -i jdk-XXX_linux-x64_bin.rpm进行安装,Ubuntu 下面使用dpkg -i jdk-XXX_linux-x64_bin.deb。其中 -i 就是 install 的意思。

  • Linux 也有自己的软件管家,CentOS 下面是 yum,Ubuntu 下面是 apt-get。
  • 修改用户的密码:passwd
  • 创建用户:useradd
  • tar.gz 这种格式的,通过 tar xvzf jdk-XXX_linux-x64_bin.tar.gz 就可以解压缩。
  • 配置环境变量,可以通过 export 命令来配置。export 命令仅在当前命令行的会话中起作用,一旦退出重新登录进来,就不管用了。

在 Linux 里,要创建一个新的进程,需要一个老的进程调用 fork 来实现,其中老的进程叫作父进程(Parent Process),新的进程叫作子进程(Child Process)。创建进程的系统调用叫fork,对于 fork 系统调用的返回值,如果当前进程是子进程,就返回 0;如果当前进程是父进程,就返回子进程的进程号。

系统调用

《趣谈Linux操作系统》专栏阅读笔记之概述和系统初始化_第4张图片

strace 命令,常用来跟踪进程执行时系统调用和所接收的信号。

X86架构

《趣谈Linux操作系统》专栏阅读笔记之概述和系统初始化_第5张图片

  • CPU包括三个部分,运算单元、数据单元和控制单元。运算单元只管算,例如做加法、做位移等等。数据单元包括 CPU 内部的缓存和寄存器组,空间很小,但是速度飞快,可以暂时存放数据和运算结果。控制单元是一个统一的指挥中心,它可以获得下一条指令,然后执行这条指令。这个指令会指导运算单元取出数据单元中的某几个数据,计算出个结果,然后放在数据单元的某个地方。
  • CPU 的控制单元里面,有一个指令指针寄存器,它里面存放的是下一条指令在内存中的地址。控制单元会不停地将代码段的指令拿进来,先放入指令寄存器。
  • CPU 和内存来来回回传数据,靠的都是总线。总线上主要有两类数据,一个是地址数据,也就是我想拿内存中哪个位置的数据,这类总线叫地址总线(Address Bus);另一类是真正的数据,这类总线叫数据总线(Data Bus)。

CPU 里面的组件放大之后
《趣谈Linux操作系统》专栏阅读笔记之概述和系统初始化_第6张图片
先来看数据单元

  • 为了暂存数据,8086 处理器内部有 8 个 16 位的通用寄存器,也就是刚才说的 CPU 内部的数据单元,分别是 AX、BX、CX、DX、SP、BP、SI、DI。这些寄存器主要用于在计算过程中暂存数据。

  • 这些寄存器比较灵活,其中 AX、BX、CX、DX 可以分成两个 8 位的寄存器来使用,分别是 AH、AL、BH、BL、CH、CL、DH、DL,其中 H 就是 High(高位),L 就是 Low(低位)的意思。

  • 这样,比较长的数据也能暂存,比较短的数据也能暂存。你可能会说 16 位并不长啊,你可别忘了,那是在计算机刚刚起步的时代。

在来看控制单元

  • IP 寄存器就是指令指针寄存器(Instruction Pointer Register),指向代码段中下一条指令的位置。CPU 会根据它来不断地将指令从内存的代码段中,加载到 CPU 的指令队列中,然后交给运算单元去执行。

  • 如果需要切换进程呢?每个进程都分代码段和数据段,为了指向不同进程的地址空间,有四个 16 位的段寄存器,分别是 CS、DS、SS、ES。

  • 其中,CS 就是代码段寄存器(Code Segment Register),通过它可以找到代码在内存中的位置;DS 是数据段的寄存器,通过它可以找到数据在内存中的位置。

  • SS 是栈寄存器(Stack Register)。栈是程序运行中一个特殊的数据结构,数据的存取只能从一端进行,秉承后进先出的原则,push 就是入栈,pop 就是出栈。

汇编指令

  • mov:move a b ,把b值赋给a,使a=b
  • call:call调用子程序
  • jmp:无条件跳
  • int:中断指令,通过它就可以陷入(trap)内核
  • ret:子程序以ret结尾
  • add:加法,a=a+b
  • iret :指令将原来用户态保存的现场恢复回来,包含代码段、指令指针寄存器等
  • or:
  • xor:
  • shl:
  • shr:
  • push:
  • pop:
  • inc:
  • dec:
  • sub:
  • cmp:

grub2 是一个非常牛的 Linux 启动管理器。

内核初始化

  • x86 提供了分层的权限机制,把区域分成了四个 Ring,越往里权限越高,越往外权限越低。
    《趣谈Linux操作系统》专栏阅读笔记之概述和系统初始化_第7张图片
  • 操作系统很好地利用了这个机制,将能够访问关键资源的代码放在 Ring0,我们称为内核态(Kernel Mode);将普通的程序代码放在 Ring3,我们称为用户态(User Mode)。

这个过程就是这样的:用户态 - 系统调用 - 保存寄存器 - 内核态执行系统调用 - 恢复寄存器 - 返回用户态,然后接着运行。

  • 内核初始化, 运行 start_kernel() 函数(位于 init/main.c), 初始化做三件事
    • 创建样板进程, 及各个模块初始化
    • 创建管理/创建用户态进程的进程
    • 创建管理/创建内核态进程的进程

系统调用的过程


你知道的越多,你不知道的越多。
有道无术,术尚可求,有术无道,止于术。
如有其它问题,欢迎大家留言,我们一起讨论,一起学习,一起进步

你可能感兴趣的:(#,操作系统,读书笔记,操作系统,linux,内核)