The Hardware/Software Interface

The Hardware/Software Interface

English | MP4 | AVC 960×540 | AAC 44KHz 2ch | 12h 46m | 1.22 GB

This course examines key computational abstraction levels below modern high-level languages; number representation, assembly language, introduction to C, memory management, the operating-system process model, high-level machine architecture including the memory hierarchy, and how high-level languages are implemented. We will develop students’ sense of “what really happens” when software runs — and that this question can be answered at several levels of abstraction, including the hardware architecture level, the assembly level, the C programming level and the Java programming level. The core around which the course is built is C, assembly, and low-level data representation, but this is connected to higher levels (roughly how basic Java could be implemented), lower levels (the general structure of a processor and the memory hierarchy), and the role of the operating system (but not how the operating system is implemented).

At the end of this course, students should:

  • understand the multi-step process by which a high-level program becomes a stream of instructions executed by a processor;
  • know what a pointer is and how to use it in manipulating complex data structures;
  • be facile enough with assembly programming (X86) to write simple pieces of code and understand how it maps to high-level languages (and vice-versa);
  • understand the basic organization and parameters of memory hierarchy and its importance for system performance;
  • be able to explain the role of an operating system;
  • know how Java fundamentally differs from C;
  • grasp what parallelism is and why it is important at the system level; and
  • be more effective programmers (more efficient at finding bugs, improved intuition about system performance).


  • Number representation
  • Assembly language
  • Basics of C
  • Memory management
  • Operating-system process model
  • High-level machine architecture
  • Memory hierarchy
  • Implementation of high-level languages
Table of Contents

01 Welcome
02 Theme
03 Roadmap
04 Setting up the VM
05 Getting Started with Lab 0
06 Preliminaries
07 Memory Organization
08 Addresses and Data Representations
09 Data and C
10 Arrays
11 Boolean Algebra
12 Encodings
13 Representation of Integers
14 Integers in C
15 Shifting and Sign Extension
16 Optional Fractional Binary Numbers
17 Optional IEEE Floating-point Standard
18 Optional Floating-point Operations
19 Optional Floating-point in C
20 Tutorial C
21 Instruction Set Architectures
22 Machine Programming
23 Moving Data
24 x86 vs. x86-64
25 Memory Addressing Modes
26 Conditionals and Control Flow
27 More about Conditionals
28 Loops
29 Switch Statements
30 Tutorial GDB
31 Stacks in Memory and Stack Operations
32 Procedure Calls and Returns
33 Stack-Based Languages
34 Linux Stack Frames
35 Register-Saving Conventions and Local Variables
36 x86-64 Procedures and Stacks
37 Array AllocationAccesses
38 Nested Arrays
39 Multi-Level Arrays
40 Structures
41 Structures and Alignment
42 Tutorial Buffer Overflows
43 Cache Basics
44 Principle of Locality
45 Memory Hierarchies
46 Cache Organization
47 Cache Organization
48 Cache-Friendly Code
49 Exceptional Control
50 What is a Process
51 Creating New Processes
52 The Fork-Exec Model
53 Virtual Memory Overview
54 Indirection
55 Virtual Memory Caches
56 Address Translation
57 Sample Memory System
58 – Dynamic Memory Allocation
59 Performance and Fragmentation
60 Implicit Free Lists
61 Explicit Free Lists
62 Garbage Collection
63 Memory-Related Perils and Pitfalls
64 Tutorial Lab 5
65 Data in Java
66 References and Methods
67 Virtual Machines
68 Final Video

part 1 files 01 – 26
part 2 files 27 – 54
part 3 files 55 – 68