Linux0.11内核源码分析
本文最后更新于300 天前,其中的信息可能已经过时,如有错误请发送邮件到cishaxiatian@gmail.com

Linux内核源码

risc和cisc的区别

  • 1_1
  • RISC(Reduced Instruction Set Computer):精简指令集计算机

  • CISC(Complex Instruction Set Computer):复杂指令集计算机

CISC(Complex Instruction Set Computing)

  1. 复杂庞大的指令系统:指令数目一般多达200~300条。
  2. 指令长度不固定:指令格式种类多,寻址方式种类多。
  3. 存储器访问不受限制:可以访存的指令不受限制(RISC只有取数/存数指令访问存储器)。
  4. 执行时间差异大:各种指令执行时间相差很大,大多数指令需多个时钟周期才能完成。
  5. 微程序控制:控制器大多数采用微程序控制。
  6. 难优化编译:难以用优化编译生成高效的目标代码程序。

RISC(Reduced Instruction Set Computing)

  1. 选取高频简单指令:使用频率较高的简单指令以及一些实用但不复杂的指令,复杂指令的功能由高频简单指令的组合来实现。
  2. 指令长度固定:指令格式种类少,寻址方式种类少。
  3. 存储器访问限制:只有取数/存数指令访问存储器,其余指令的操作都在寄存器内完成。
  4. 多通用寄存器:CPU中有多个通用寄存器(比CISC的多)。
  5. 流水线技术:一定采用流水线,大部分指令在一个时钟周期内完成。采用超标量超流水线技术,使每条指令的平均时间小于一个时钟周期。
  6. 组合逻辑控制:控制器采用组合逻辑控制,不用微程序控制。
  7. 优化编译程序:采用优化的编译程序。

CISC和RISC区别点

指令集复杂度

CISC:

  • 指令集复杂,包含大量不同的指令。
  • 每条指令可能执行多个低级操作。
  • 指令长度不固定,可能需要多个时钟周期才能完成。

RISC:

  • 指令集精简,指令数量较少且简单。
  • 每条指令通常只执行一个低级操作。
  • 指令长度固定,通常在一个时钟周期内完成。

指令执行的速度

CISC:

  • 由于指令复杂,单条指令可能需要多个时钟周期。
  • 优化重点在于减少程序中的指令数量。

RISC:

  • 指令简单,通常在一个时钟周期内完成。
  • 优化重点在于提高每条指令的执行速度。

reg的使用:

CISC:

  • 寄存器数量较少,大量使用内存操作。
  • 寄存器与内存之间的操作较为频繁。

RISC:

  • 寄存器数量较多,尽量减少内存访问。
  • 大部分操作在寄存器之间完成,减少内存操作带来的延迟。

编译器设计:

CISC:

  • 编译器设计相对简单,因为复杂的指令可以直接实现高级语言的语义。
  • 程序代码相对较短,但每条指令的执行时间较长。

RISC:

  • 编译器设计较复杂,需要将高级语言的语义分解成更多的简单指令。
  • 程序代码相对较长,但每条指令的执行时间较短。

硬件实现:

CISC

  • 硬件实现复杂,需要更多的电路来支持复杂的指令集。
  • 通常包括微代码来实现复杂指令的执行。

RISC:

  • 硬件实现相对简单,支持精简的指令集。
  • 不需要微代码,每条指令直接由硬件执行。

能效比 和 典型应用

CISC:

  • 由于指令复杂,能效比通常较低。
  • 常用于传统桌面计算机和服务器,典型代表为 x86 架构。

RISC:

  • 由于指令简单且执行速度快,能效比通常较高。
  • 常用于嵌入式系统和移动设备,典型代表为 ARM 架构。


写时复制(Copy-On-Write,COW)机制的基本原理

大白话简单理解

在操作系统中,当一个进程创建子进程时,通常会通过 fork() 系统调用来实现。为了高效地创建子进程,内核采用了写时复制的策略。具体来说,fork() 并不会立即为子进程分配新的内存页,而是让子进程与父进程共享相同的内存页。此时,这些共享的内存页被标记为只读,以防止父子进程中的任何一个直接修改它们。

一旦父进程或子进程试图修改这些只读内存页,内核会捕获到这一操作并产生一个异常。异常处理程序会为需要修改的进程分配一个新的物理页,并将原来的内容复制到这个新页中。然后,进程可以安全地对这个新的内存页进行写操作,而不会影响到其他进程。这样做的好处是可以显著减少内存分配的开销,特别是在父进程和子进程之间存在大量相同内容的情况下。

总结一下,写时复制机制有效地优化了进程创建的性能,同时也节约了系统资源。

auto变量类型

auto x = 10;    // x的类型是int
auto y = 3.14;  // y的类型是double
auto z = "Hello"; // z的类型是const char*

AHB总线和ISA总线区别

AHB总线(Advanced High-performance Bus)和ISA总线(Industry Standard Architecture Bus)是两种不同的计算机系统总线,主要用于不同的用途和系统架构。

AHB总线(Advanced High-performance Bus)和ISA总线(Industry Standard Architecture Bus)是两种不同的计算机系统总线,主要用于不同的用途和系统架构。

1. AHB总线

  • 简介: AHB是AMBA(Advanced Microcontroller Bus Architecture)架构中的一部分,AMBA是由ARM公司制定的一组总线架构标准。AHB总线是其中的高性能总线,专门为高带宽、低延迟的片上系统(SoC)设计。
  • 特点
    • 高性能: 支持高带宽数据传输,通常用于需要快速数据交换的系统组件之间,比如处理器、内存和高速外设。
    • 宽数据位宽: AHB总线通常支持32位或更高的数据位宽,提供更大的数据吞吐量。
    • 单一主控设备: 在一个时刻只有一个主控设备能够控制总线,保证了总线的稳定性和高效性。
    • 支持突发传输: 可以一次性传输多个数据,减少总线占用时间。

2. ISA总线

  • 简介: ISA总线是早期PC机系统中使用的一种总线标准,最初由IBM为其PC/AT(个人电脑/高级技术)设计。ISA总线广泛用于20世纪80年代和90年代初期的个人计算机中。
  • 特点:
    • 低性能: ISA总线的带宽较低,传输速度较慢,通常用于连接键盘、鼠标、串口、并口等低速外设。
    • 8位和16位版本: 最初的ISA总线是8位的,后续发展到16位版本。数据传输速率相对较低。
    • 并行总线: ISA总线是一种并行总线,多个数据位可以同时传输。
    • 缺乏即插即用功能: 早期的ISA总线设备需要手动设置IRQ、中断号、I/O端口等参数,配置较为繁琐。

南桥和北桥的

这段描述适用于20世纪末和21世纪初的PC机主板架构,但随着技术的发展,现代PC机主板的设计已经发生了显著变化。

北桥与南桥的消失

  • 北桥芯片: 北桥芯片(Memory Controller Hub, MCH)的主要功能是连接CPU、内存和高速图形接口(如AGP或PCIe)。然而,随着技术的进步,许多北桥的功能(尤其是内存控制器和PCIe接口)已经被集成到现代处理器内部。例如,从Intel的Nehalem架构(Core i系列)开始,内存控制器和PCIe控制器就被集成到CPU中。因此,北桥芯片在现代PC架构中已基本消失。

  • 南桥芯片: 南桥芯片(I/O Controller Hub, ICH)主要负责较低速的I/O操作,如USB、SATA、音频、网络等。然而,随着北桥功能的整合,南桥芯片也逐渐演变为PCH(Platform Controller Hub),其职能更加广泛。虽然南桥的传统功能大部分仍由PCH承担,但它已不再被称为南桥。

现代芯片组架构

  • 单芯片架构: 现代PC主板大多采用单芯片PCH架构,取代了传统的北桥和南桥组合。PCH负责大部分I/O功能,包括USB、SATA、网络、音频等,而CPU则直接控制内存和PCIe设备。
  • 更高集成度: 现代处理器将更多的功能集成到芯片内部,不仅包括内存控制器,还可能包括图形处理单元(GPU)、网络控制器等。这使得主板设计更加简洁,也提升了整体性能和功耗效率。

总结

  • 历史性描述: 你提供的描述适用于早期的PC主板架构,是一种历史性的回顾。
  • 现代演变: 现代PC主板的设计已经进化为更为集成化的结构,北桥和南桥已不再作为独立的芯片存在,而是通过更为集成的方式实现功能。

因此,这段描述在现代PC主板中已不再适用,但它对理解计算机硬件的历史演变依然具有教育意义。

I/O 端口和寻址

I/O控制器:

  1. 访问数据的数据端口
  2. 输出命令的命令端口
  3. 访问控制器执行状态的状态端口

端口地址设置方法:

  • 统一编址
  1. CPU 访问一个端口的操作与访问内存的操作一样,用一页地址给所有设备和内存分配,有点像直接寻址
  • 独立编址
  1. 把 I/O 控制器和控制卡的寻址空间单独作为一个独立的地址空间对待,有点像间接寻址

计算机复位之后做的操作

  • 7_1

键盘编码

  • 8_1
  • 8_2
  • 8_3

system_call.s 程序

在Linux 0.11中,用户使用中断调用 int 0x80和放在寄存器eax中的功能号中来使用

内核提供的服务,但是用户不是直接使用系统调用中断,而是通过 函数库

比如使用一个fork()函数,函数库 libc 中的fork()函数就会实现中断 int 0x80 的调用过程并返回调用结果给用户程序

  • 9_1

对于软中断实现

首先调用对应的 c函数处理程序作准备,将一些参数进行压栈,系统在调用时最多带 三个参数 ,通过ebx和ecx和edx传入,调用c函数进行相应的功能处理,处理完成后,检测当前任务的信号位图,对值中min进行信号复位并开始处理 (先处理后信号复位)

  • 9_2
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇