趣谈Linux操作系统
刘超
网易杭州研究院云计算技术部首席架构师
立即订阅
19336 人已学习
课程目录
已完结 72 讲
0/4登录后,你可以任选4讲全文学习。
入门准备篇 (3讲)
开篇词 | 为什么要学习Linux操作系统?
免费
01 | 入学测验:你究竟对Linux操作系统了解多少?
02 | 学习路径:爬过这六个陡坡,你就能对Linux了如指掌
核心原理篇:第一部分 Linux操作系统综述 (3讲)
03 | 你可以把Linux内核当成一家软件外包公司的老板
04 | 快速上手几个Linux命令:每家公司都有自己的黑话
05 | 学会几个系统调用:咱们公司能接哪些类型的项目?
核心原理篇:第二部分 系统初始化 (4讲)
06 | x86架构:有了开放的架构,才能打造开放的营商环境
07 | 从BIOS到bootloader:创业伊始,有活儿老板自己上
08 | 内核初始化:生意做大了就得成立公司
09 | 系统调用:公司成立好了就要开始接项目
核心原理篇:第三部分 进程管理 (10讲)
10 | 进程:公司接这么多项目,如何管?
11 | 线程:如何让复杂的项目并行执行?
12 | 进程数据结构(上):项目多了就需要项目管理系统
13 | 进程数据结构(中):项目多了就需要项目管理系统
14 | 进程数据结构(下):项目多了就需要项目管理系统
15 | 调度(上):如何制定项目管理流程?
16 | 调度(中):主动调度是如何发生的?
17 | 调度(下):抢占式调度是如何发生的?
18 | 进程的创建:如何发起一个新项目?
19 | 线程的创建:如何执行一个新子项目?
核心原理篇:第四部分 内存管理 (7讲)
20 | 内存管理(上):为客户保密,规划进程内存空间布局
21 | 内存管理(下):为客户保密,项目组独享会议室封闭开发
22 | 进程空间管理:项目组还可以自行布置会议室
23 | 物理内存管理(上):会议室管理员如何分配会议室?
24 | 物理内存管理(下):会议室管理员如何分配会议室?
25 | 用户态内存映射:如何找到正确的会议室?
26 | 内核态内存映射:如何找到正确的会议室?
核心原理篇:第五部分 文件系统 (4讲)
27 | 文件系统:项目成果要归档,我们就需要档案库
28 | 硬盘文件系统:如何最合理地组织档案库的文档?
29 | 虚拟文件系统:文件多了就需要档案管理系统
30 | 文件缓存:常用文档应该放在触手可得的地方
核心原理篇:第六部分 输入输出系统 (5讲)
31 | 输入与输出:如何建立售前售后生态体系?
32 | 字符设备(上):如何建立直销模式?
33 | 字符设备(下):如何建立直销模式?
34 | 块设备(上):如何建立代理商销售模式?
35 | 块设备(下):如何建立代理商销售模式?
核心原理篇:第七部分 进程间通信 (7讲)
36 | 进程间通信:遇到大项目需要项目组之间的合作才行
37 | 信号(上):项目组A完成了,如何及时通知项目组B?
38 | 信号(下):项目组A完成了,如何及时通知项目组B?
39 | 管道:项目组A完成了,如何交接给项目组B?
40 | IPC(上):不同项目组之间抢资源,如何协调?
41 | IPC(中):不同项目组之间抢资源,如何协调?
42 | IPC(下):不同项目组之间抢资源,如何协调?
核心原理篇:第八部分 网络系统 (7讲)
43 预习 | Socket通信之网络协议基本原理
43 | Socket通信:遇上特大项目,要学会和其他公司合作
44 | Socket内核数据结构:如何成立特大项目合作部?
45 | 发送网络包(上):如何表达我们想让合作伙伴做什么?
46 | 发送网络包(下):如何表达我们想让合作伙伴做什么?
47 | 接收网络包(上):如何搞明白合作伙伴让我们做什么?
48 | 接收网络包(下):如何搞明白合作伙伴让我们做什么?
核心原理篇:第九部分 虚拟化 (7讲)
49 | 虚拟机:如何成立子公司,让公司变集团?
50 | 计算虚拟化之CPU(上):如何复用集团的人力资源?
51 | 计算虚拟化之CPU(下):如何复用集团的人力资源?
52 | 计算虚拟化之内存:如何建立独立的办公室?
53 | 存储虚拟化(上):如何建立自己保管的单独档案库?
54 | 存储虚拟化(下):如何建立自己保管的单独档案库?
55 | 网络虚拟化:如何成立独立的合作部?
核心原理篇:第十部分 容器化 (4讲)
56 | 容器:大公司为保持创新,鼓励内部创业
57 | Namespace技术:内部创业公司应该独立运营
58 | CGroup技术:内部创业公司应该独立核算成本
59 | 数据中心操作系统:上市敲钟
实战串讲篇 (9讲)
60 | 搭建操作系统实验环境(上):授人以鱼不如授人以渔
61 | 搭建操作系统实验环境(下):授人以鱼不如授人以渔
62 | 知识串讲:用一个创业故事串起操作系统原理(一)
63 | 知识串讲:用一个创业故事串起操作系统原理(二)
64 | 知识串讲:用一个创业故事串起操作系统原理(三)
65 | 知识串讲:用一个创业故事串起操作系统原理(四)
66 | 知识串讲:用一个创业故事串起操作系统原理(五)
67 | 期末测试:这些操作系统问题,你真的掌握了吗?
结束语 | 永远别轻视任何技术,也永远别轻视自己
免费
专栏加餐 (2讲)
学习攻略(一):学好操作系统,需要掌握哪些前置知识?
“趣谈Linux操作系统”食用指南
免费
趣谈Linux操作系统
登录|注册

06 | x86架构:有了开放的架构,才能打造开放的营商环境

刘超 2019-04-08
做生意的人最喜欢开放的营商环境,也就是说,我的这家公司,只要符合国家的法律,到哪里做生意,都能受到公平的对待,这样就不用为了适配各个地方的规则煞费苦心,只要集中精力优化自己的服务就可以了。
作为 Linux 操作系统,何尝不是这样。如果下面的硬件环境千差万别,就会很难集中精力做出让用户易用的产品。毕竟天天适配不同的平台,就已经够头大了。x86 架构就是这样一个开放的平台。今天我们就来解析一下它。

计算机的工作模式是什么样的?

还记得咱们攒电脑时买的那堆硬件吗?虽然你可以根据经验,把那些复杂的设备和线安装起来,但是你真的了解它们为什么要这么连接吗?
现在我就把硬件图和计算机的逻辑图对应起来,带你看看计算机的工作模式。
对于一个计算机来讲,最核心的就是 CPU(Central Processing Unit,中央处理器)。这是这台计算机的大脑,所有的设备都围绕它展开。
对于公司来说,CPU 是真正干活的,将来执行项目都要靠它。
CPU 就相当于咱们公司的程序员,我们常说,二十一世最缺的是什么?是人才!所以,大量水平高、干活快的程序员,才是营商环境中最重要的部分。
CPU 和其他设备连接,要靠一种叫作总线(Bus)的东西,其实就是主板上密密麻麻的集成电路,这些东西组成了 CPU 和其他设备的高速通道。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《趣谈Linux操作系统》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(110)

  • 一命赌快乐 置顶
    move a b :把b值赋给a,使a=b
    call和ret :call调用子程序,子程序以ret结尾
    jmp :无条件跳
    int :中断指令
    add a b : 加法,a=a+b
    or :或运算
    xor :异或运算
    shl :算术左移
    ahr :算术右移
    push xxx :压xxx入栈
    pop xxx: xxx出栈
    inc: 加1
    dec: 减1
    sub a b : a=a-b
    cmp: 减法比较,修改标志位

    作者回复: 赞,认真学习的典范

    2019-04-08
    118
  • Colin.Tao
    妥妥地复习了一把“计算机体系结构”🌹

    作者回复: 后面很多地方要用到寄存器,所以必须先讲一下

    2019-04-08
    32
  • Frank_51
    作为一个搞硬件的,这章是我学习最轻松的,推荐一个入门的系统学习汇编的视频课,网易云课堂上的一个课程,《汇编从零开始到C语言》,通俗易懂,小白入门必备

    作者回复: 推荐书籍

    2019-04-08
    1
    29
  • why
    - CPU 包括: 运算单元, 数据单元, 控制单元
        - 运算单元 不知道算哪些数据, 结果放哪
        - 数据单元 包括 CPU 内部缓存和寄存器, 暂时存放数据和结果
        - 控制单元 获取下一条指令, 指导运算单元取数据, 计算, 存放结果
    - 进程包含代码段, 数据段等, 以下为 CPU 执行过程:
        - 控制单元 通过指令指针寄存器(IP), 取下一条指令, 放入指令寄存器中
            - 指令包括操作和目标数据
        - 数据单元 根据控制单元的指令, 从数据段读数据到数据寄存器中
        - 运算单元 开始计算, 结果暂时存放到数据寄存器
    - 两个寄存器, 存当前进程代码段和数据段起始地址, 在进程间切换
    - 总线包含两类数据: 地址总线和数据总线
    ---
    - x86 开放, 统一, 兼容
    - 数据单元 包含 8个 16位通用寄存器, 可分为 2个 8位使用
    - 控制单元 包含 IP(指令指针寄存器) 以及 4个段寄存器 CS DS SS ES
        - IP 存放指令偏移量
        - 数据偏移量存放在通用寄存器中
        - `段地址<<4 + 偏移量` 得到地址
    ---
    - 32 位处理器
    - 通用寄存器 从 8个 16位拓展为 8个 32位, 保留 16位和 8位使用方式
    - IP 从 16位扩展为 32位, 保持兼容
    - 段寄存器仍为 16位, 由段描述符(表格, 缓存到 CPU 中)存储段的起始地址, 由段寄存器选择其中一项
        - 保证段地址灵活性与兼容性
    ---
    - 16位为实模式, 32位为保护模式
    - 刚开机为实模式, 需要更多内存切换到保护模式
    2019-04-10
    13
  • why
    Guide to x86 Assembly: http://www.cs.virginia.edu/~evans/cs216/guides/x86.html

    作者回复: 赞

    2019-04-08
    13
  • MJ
    “起始地址 *16+ 偏移量”,也就是把 CS 和 DS 中的值左移 4 位,变成 20 位的,加上 16 位的偏移量,这样就可以得到最终 20 位的数据地址。

    求问老师,左移四位,如何理解?

    作者回复: 就是乘以十六

    2019-04-08
    2
    11
  • TeFuir
    老师您好,我想问下 为什么高16位分成两个8位就不兼容列呀。

    作者回复: 没有人写程序用高位的

    2019-04-09
    10
  • 老师讲地太精彩了 点赞。由于基础弱,还有几个问题希望老师万忙中答疑一下,谢谢:

    问题1:程序编译成二进制代码的时候,包含有指令起始地址吗?若包含那么后续每一行指令的涉及到的指令地址是计算出来的? 或者说加载进程的程序的时候才会确定起始地址?很好奇这个指令的指针寄存器里的值是什么时候、怎么放进去的?

    问题2: CPU两个寄存器处理保存当前进程代码段的起始地址,已经数据起始地址。切换进程时会将这两个寄存器里的值一并切换,那么同一个进程出现多线程的时候了?

    问题3:数据总线拿数据的时候没有限制大小吗,若数据很大,数据单元里的数据寄存器放不下怎么办的?

    作者回复: 1.会有指令起始地址,后面讲ELF格式的时候会说这个事情。当执行一个程序的时候,会加载ELF格式,加载的时候会设置指令指针
    2.多线程共享同一个进程内存空间,所以代码段的起始地址还是一样的。只不过每个线程执行不同的func,指令指针会不一样,在内核中,线程也是有独立的task_struct
    3.寄存器是有限的,如果把程序编译成汇编看的话,再大的数据,也是要转换为对寄存器的操作。当然寄存器里面可以包含对内存的访问地址,这样内存里面的数据就很多了

    2019-04-08
    10
  • MARK
    已经有童鞋回复,再补充点
    MOV: load value. this instruction name is misnomer, resulting in some confusion (data is not movedbut copied), in other architectures the same instructions is usually named “LOAD” and/or “STORE”or something like that.One important thing: if you set the low 16-bit part of a 32-bit register in 32-bit mode, the high 16bits remains as they were. But if you modify the low 32-bit part of the register in 64-bit mode, thehigh 32 bits of the register will be cleared.Supposedly, it was done to simplify porting code to x86-64.

    CALL:call another function:PUSH address_after_CALL_instruction; JMP label.
    JMP: jump to another address. The opcode has ajump offset.

    INT(M):INT x is analogous to PUSHF; CALL dword ptr [x*4]in 16-bit environment. It was widely used in MS-DOS, functioning as a syscall vector. The registers AX/BX/CX/DX/SI/DI were filled with the arguments and then the flow jumped to the address in the Interrupt Vector Table (located at thebeginning of the address space). It was popular because INT has a short opcode (2 bytes) and the program which needs some MS-DOS services is not bother to determine the address of the service’sentry point. The interrupt handler returns the control flow to caller using the IRET instruction.The most busy MS-DOS interrupt number was 0x21, serving a huge part of itsAPI. In the post-MS-DOS era, this instruction was still used as syscall both in Linux and Windows (6.3 onpage 750), but was later replaced by the SYSENTER or SYSCALL instructions.

    RET: return from subroutine:POP tmp; JMP tmp.
        In fact, RET is an assembly language macro, in Windows and *NIX environment it is translated into RETN (“return near”) or, in MS-DOS times, where the memory was addressed differently, into RETF (“return far”).
    RET can have an operand. Then it works like this:
    POP tmp; ADD ESP op1; JMP tmp.RETwith an operand usually ends functions in the stdcall calling convention.
    2019-04-08
    6
  • YoungMarshual_besos
    几乎完全看懵了,发现基础知识极其匮乏,努力补课,夯实根基太重要了。

    作者回复: 补充完再看,可以看看计算机组成与系统结构

    2019-04-08
    6
  • Pluto
    原来 x86 架构是指 8086 ,而 x86 是代表 32 位操作系统是因为 80386,原来这两个 x86 不是同一个意思啊,以前学操作系统的时候一直想不明白 x86 为什么是指代 32 位操作系统

    作者回复: 哈哈

    2019-04-08
    6
  • 布凡
    本文结构:https://www.cnblogs.com/bindot/p/linux6.html
    2019-04-12
    5
  • Matnix
    结合《深入理解计算机系统》第三章,受益匪浅

    作者回复: 这本书值得推荐

    2019-04-11
    4
  • TinnyFlames
    x86是甜蜜的历史包袱,它的兼容性让它一统市场,但是当时很多性能上更好的尝试在商业上都失败了,因为兼容性的问题客户不买单……

    作者回复: 是的,所以兼容比优雅要重要

    2019-04-08
    4
  • 楽天
    那64位的还有实模式吗?

    作者回复: 有的

    2019-05-08
    3
  • 学徒王小明
    微软的IDE visual studio,可以查看C语言编译后的汇编语言,内存,寄存器,非常方便。

    作者回复: 好久没用vs了,只要能够帮助理解,就是好工具

    2019-04-10
    3
  • 尚墨
    上周看了 Go 夜读社区 《Go Plan 9汇编入门》https://www.bilibili.com/video/av46494102 听的云里雾里的,在来看这篇文章好像感觉出了点门道。

    作者回复: 呜哇,没想到能和go联系在一起,看来底层原理比较容易互通

    2019-04-10
    3
  • MARK
    补充2
    ADD: add two values.
    OR: logical “or”.
    XOR op1, op2:is in fact just “eXclusive OR”,but the compilers often use it instead of MOV EAX, 0—again becauseit is a slightly shorter opcode (2 bytes for XOR against 5 for MOV).

    SHL/SHR: shift value left/right.
       Bit shifts in C/C++ are implemented using≪and≫operators. The x86 ISA has the SHL (SHift Left) and SHR (SHift Right) instructions for this. Shift instructions are often used in division and multiplications bypowers of two:2n(e.g., 1, 2, 4, 8, etc.): Shifting operations are also so important because they are often used for specific bit isolation or forconstructing a value of several scattered bits.

    PUSH: push a value into the stack:ESP=ESP-4 (or 8); SS:[ESP]=value.
    POP: get a value from the stack:value=SS:[ESP]; ESP=ESP+4 (or 8).
    The most frequently used stack access instructions are PUSH and POP(in both x86 and ARM Thumb-mode).PUSH subtracts from ESP/RSP/SP4 in 32-bit mode (or 8 in 64-bit mode) and then writes the contents of its sole operand to the memory address pointed by ESP/RSP/SP.
    POP is the reverse operation: retrieve the data from the memory location that SP points to, load it into the instruction operand (often a register) and then add 4 (or 8) to the stack pointer.

    INC: increment. Unlike other arithmetic instructions,INC doesn’t modify CF flag.
    DEC: decrement. Unlike other arithmetic instructions,DEC doesn’t modify CF flag.
    SUB: subtract values. A frequently occurring pattern is SUB reg.
    CMP: compare values and set flags, the same as SUB but without writing the result.
    2019-04-08
    3
  • Luciano李鑫
    准时
    2019-04-08
    3
  • 沧月寒心
    CPU包括运算单元、控制单元和数据单元。
    编程=逻辑+控制+数据结构

    大道至简,万变不离其宗
    2019-09-05
    2
收起评论
99+
返回
顶部