CodeSaw


  • Home

  • Archives

  • Categories

  • Tags

  • Algorithm

  • About

  • Search

LLVM漫谈(0-编译系统概述)

Posted on 2020-06-01 | In C++
Words count in article 6.8k | Reading time 23

Abstract

从开始接触编译系统的学习已经快半年了,有些心得总结一下。

什么是编译系统?我想从两个角度谈一下:

首先从技术角度来讲,广义的编译系统负责将高级语言转换成为CPU可执行的二进制机器代码。编译系统包括编译器, 汇编器,静态/动态链接器,操作系统装载器以及运行库。

  • 编译器: 是系统前半部分的核心,负责将源文件.c转换成为汇编文件.s。
  • 汇编/链接/装载器:是系统后半部分的核心,主要是将.s转换为二进制ELF文件并进一步围绕ELF处理。
  • 运行库:是操作系统层面用来支持高级语言运行环境比如内存池,标准API等的库文件。

然后从专业的角度来讲,我觉得可以分为系统层面和算法优化层面,系统层面主要是整个编译框架比如LLVM,核心是和操作系统交互的部分,这部分内容是编译器工程师的基本功,需要掌握细节。而算法优化层面指的是编译优化——编译器工程师的最理想的方向就是做优化,这一部分需要精通,从静态单赋值SSA等传统的静态分析优化到现在主流的深度学习推理引擎比如TVM等。

本文主要是对系统层面的学习,对系统层面的学习止步于对LLVM编译框架的使用和源代码阅读。

Read more »

GCC-RISCV交叉编译工具链

Posted on 2020-02-15 | In Assembly
Words count in article 651 | Reading time 2

Absrtact

旨在x86平台上编译RISCV架构的可执行文件。

RISCV作为一款极具使命感的指令集,其软件栈也是非常完整的。交叉编译环境可以在这里下载。

交叉编译工具链包括:

  • GCC编译器
  • C运行库
    • Glibc : gnu旗下的库,作为linux的标准库和内核打交道
    • Newlib: 在嵌入式中使用广泛
  • Buntils二进制套件
  • GDB调试器
Read more »

从syscall的角度理解操作系统

Posted on 2019-06-25 | In C
Words count in article 733 | Reading time 2

Abstract

操作系统控制硬件资源并完成底层抽象。

UNIX和C的发展一脉相承。20世纪80年代以来,针对UNIX的各种标准化工作对其实现提供了具体的限制以此来完善系统不同实现之间的可移植性——ISO-C,IEEE-POSIX以及Single UNIX Specification等等。

这些标准本质上是应用程序和操作系统接口的子集。一个操作系统的具体实现除了内核之外,最重要的就是对API的封装。UNIX一般通过系统调用和运行库的方式来完成应用程序接口,比如GNU为Linux开发的Gblic就支持ISO-C和IEEE-POSIX等核心标准。

个人觉得从系统编程和内存的角度去理解文件系统和进程/线程等OS核心概念会比较有趣。

Read more »

Mit6.828(Fall 2018) Lab2

Posted on 2018-11-21 | In C
Words count in article 4k | Reading time 15

Lab2

Before Lab

Lab2的主要内容:Physical Page Management,Virtual Memroy,Kernel Address Space;代码实现JOS中的内存分页管理功能,有页面管理和页表管理两部分。和理论相比,代码实现需要考虑的细节真是太多。实验最终的目的是通过几个检测函数:

Lab1完成时整个JOS内存布局如下图:

切换合并Git分支的时候可能会出现冲突,需要手动注释掉Lab1中的一些测试代码来解决,这里不再赘述。

Read more »

Mit6.828(Fall 2018) Shell

Posted on 2018-11-17 | In C
Words count in article 2.2k | Reading time 8

HW:Shell

Abstract

6.828除了Lab之外还有针对小型操作系统XV-6的Readings和HomeWork。整个6.828也是围绕这两条线(Lab和HW)在走。Lab1让我适应了JOS的实验环境和调试技巧,但是Shell和System Calls才是真正属于操作系统的知识。关于XV-6的HomeWork都是建立在Readings基础之上的,本次HW需要实现一个小型的Shell,需要阅读的Readings有:

  • XV-6.Chapter.0(重点资料)
  • man fork, (3)exec,open, close
  • TCPL

学习过程中最有意思的当属斩获新技能和新工具了:)介绍一个新的vim插件神器————Taglist。

Read more »

Mit6.828(Fall 2018) Lab1

Posted on 2018-11-04 | In C
Words count in article 7.1k | Reading time 28

Lab1

Before Lab

Lab1一共有三部分:Bootstrap,BootLoader,Kernel;前两部分都是GDB调试为主,熟悉GDB的调试技巧和操作系统的启动流程。最后实现一小部分monitor中test_backtrace的功能。
如果GDB调试出错,可能是因为调试器没有链接到操作系统上:

1
2
3
add 
add-auto-load-safe-path /Your Working Dir/.gdbinit
line to your configuration file "/root/.gdbinit"
Read more »

Mit6.828(Fall 2018) Lab0

Posted on 2018-11-04 | In C
Words count in article 2.5k | Reading time 9

Lab0

Abstract

从8086汇编实验之后,前后两周的时间勉强通过Lab1。
最大的感触是基础太差:对C语言的理解,对程序编译链接本质的理解,对GDB等工具的使用……当然也包括弱弱的英语理解能力。导致完成Lab1用了这么久的时间。 但是这次触动中却又多了一丝见山不是山,见山又是山的感觉。主要体现在我对操作系统的理解最终都回归到代码上来。比如printf函数的实现就涉及C语言中变参的特性。有理由相信这种血浓于水的关系在后续的Lab中还会进一步加强,所以我也希望这会是我学习OS最完美的方法论——————Talk is cheap, show me the code.。 截止到Lab1,整个学习的过程显得很清晰————就是通过调试kernel的反汇编代码来理解运行原理并加以修改。Lab0是我在实验过程中掉进的坑,查阅的资料和逐渐点亮的技能树,缩短实验前的准备时间对理解OS本身还是很有帮助的。

Read more »

汇编语言(王爽)ch5

Posted on 2018-10-15 | In Assembly
Words count in article 1.1k | Reading time 4

第五部分:中断II

Abstract

CPU实现I/O功能的两个问题:从何处获得外设的输入?如何解决外设输入随时可能发生的问题?首先外设芯片内部有若干寄存器,CPU将这些寄存器当做端口来访问。外设的输入输出不直接送入CPU和内存而是通过这些寄存器。第二,CPU通过外中断控制I/O的随时性。

Read more »

汇编语言(王爽)ch4

Posted on 2018-10-11 | In Assembly
Words count in article 3.4k | Reading time 13

第四部分:中断I

Abstract

在之前的实验中,我们所编写的汇编程序从编译到运行出结果都很顺利。这个过程映射到CPU层面就是CS:IP的跳转唯一取决于汇编程序员的代码。CSAPP将这个过程称为程序控制流。而中断则是将这种流程打断,建立更复杂的异常控制流。中断分为内中断和外中断两种。

Read more »

汇编语言(王爽)ch3

Posted on 2018-10-10 | In Assembly
Words count in article 2.2k | Reading time 8

第三部分:指令核心

Abstract

内存寻址

内存是啥?计算机从诞生之初,就面临着CPU和I/O之间,与存储器之间越来越明显的速度矛盾。正是因此才诞生了内存,cache等一系列缓冲的加速设备。你可以理解为内存是CPU获取运行代码的唯一途径,注意这里的内存指的是内存地址空间。
CPU如何访问内存?当然是使用寄存器;那寄存器如何访问内存?这就涉及到内存寻址的知识。

Read more »
1234
HaotianMichael

HaotianMichael

Under The Hood

33 posts
11 categories
25 tags
RSS
GitHub Cnblogs Zhihu
HaotianMichael © 2023