background preloader

Cs, cont.

Facebook Twitter

21oli.extension.harvard.edu.

Embedded Systems Course

List of Free Online Computer Hardware Courses and Classes. Learn about computer hardware with these free online courses. See the full list of free computer hardware courses and find the class that's right for you. Online Course Requirements and Information Those interested in learning about the technology behind computer hardware can take free courses available online through such sources as the Massachusetts Institute of Technology (MIT) and The Open University. Lessons are delivered via lecture notes, slides and video. Free Online Computer Hardware Courses and Classes Computation Structures at MIT This course's introductory exploration of digital system engineering takes students from the basic beginnings to gaining a full understanding of a computer system.

Computer System Engineering at MIT A combination of lecture notes, exams, videos and assignments guide the student through the processes of engineering computer hardware and software. Theory of Parallel Hardware at MIT Computers and Computer Systems at The Open University. Computer engineering. Computer engineering is a discipline that integrates several fields of electrical engineering and computer science required to develop computer hardware and software.[1] Computer engineers usually have training in electronic engineering (or electrical engineering), software design, and hardware-software integration instead of only software engineering or electronic engineering.

Computer engineers are involved in many hardware and software aspects of computing, from the design of individual microprocessors, personal computers, and supercomputers, to circuit design. This field of engineering not only focuses on how computer systems themselves work, but also how they integrate into the larger picture.[2] Usual tasks involving computer engineers include writing software and firmware for embedded microcontrollers, designing VLSI chips, designing analog sensors, designing mixed signal circuit boards, and designing operating systems.

History[edit] Work[edit] Computer software engineering[edit] A Gentle Introduction to Embedded Systems Programming. Free Disassemblers, Decompilers, Hexadecimal viewers, Hex editors. Ever encountered a situation where you needed to view, disassemble or decompile a binary file, such as a data file, an object file, a library archive, a shared library (or DLL in Windows) or an executable image? Assembled on this page are several hex viewers (hexadecimal viewers), hex editors, disassemblers and decompilers that will allow you to do precisely that. RetDec RetDec is a decompiler that supports Intel x86, ARM, MIPS, PIC32 and PowerPC executables using formats such as ELF, PE, Mach-O, COFF, AR, Intel HEX and raw machine code. It detects compilers and packers used on the executables, can remove statically-linked library code, extract and use embedded debugging information (DWARF and PDB), reconstruct instruction idioms and C++ class hierarchies (RTTI, vtables), demangle C++ symbols, reconstruct functions and other high level constructs, etc.

It has an integrated disassembler, and can output files in C and a Python-like language. HxD Freeware Hex Editor Debuggy Hexplorer. Ken Thompson. American computer scientist, creator of the Unix operating system Early life and education[edit] Thompson was born in New Orleans. When asked how he learned to program, Thompson stated, "I was always fascinated with logic and even in grade school I'd work on arithmetic problems in binary, stuff like that. Just because I was fascinated. " Thompson received a Bachelor of Science in 1965 and a Master's degree in 1966, both in Electrical Engineering and Computer Science, from the University of California, Berkeley, where his master's thesis advisor was Elwyn Berlekamp.[4] Career and research[edit] 1970s[edit] Thompson (sitting) and Ritchie working together at a PDP-11 Throughout the 1970s, Thompson and Ritchie collaborated on the Unix operating system; they were so influential on Research Unix that Doug McIlroy later wrote, "The names of Ritchie and Thompson may safely be assumed to be attached to almost everything not otherwise attributed 1980s[edit] 1990s[edit] 2000s[edit] Awards[edit] Sources.

x86. Intel 8086 Intel Core 2 Duo – an example of an x86-compatible, 64-bit multicore processor AMD Athlon (early version) – a technically different but fully compatible x86 implementation The term x86 denotes a family of backward compatible instruction set architectures[a] based on the Intel 8086 CPU. The 8086 was introduced in 1978 as a fully 16-bit extension of Intel's 8-bit based 8080 microprocessor, with memory segmentation as a solution for addressing more memory than can be covered by a plain 16-bit address.

Many additions and extensions have been added to the x86 instruction set over the years, almost consistently with full backward compatibility. The term is not synonymous with IBM PC compatibility as this implies a multitude of other computer hardware; embedded systems as well as general-purpose computers used x86 chips before the PC-compatible market started,[c] some of them before the IBM PC itself. Overview[edit] Chronology[edit] History[edit] Background[edit] Other manufacturers[edit] Brute-force attack. The EFF's US$250,000 DEScracking machine contained over 1,800 custom chips and could brute-force a DES key in a matter of days. The photograph shows a DES Cracker circuit board fitted on both sides with 64 Deep Crack chips. When password guessing, this method is very fast when used to check all short passwords, but for longer passwords other methods such as the dictionary attack are used because of the time a brute-force search takes.

When key guessing, the key length used in the cipher determines the practical feasibility of performing a brute-force attack, with longer keys exponentially more difficult to crack than shorter ones. A cipher with a key length of N bits can be broken in a worst-case time proportional to 2N and an average time of half that. Brute-force attacks can be made less effective by obfuscating the data to be encoded, something that makes it more difficult for an attacker to recognize when he/she has cracked the code.

Theoretical limits[edit] Credential recycling[edit] Machine code. Numerical machine code (i.e. not assembly code) may be regarded as the lowest-level representation of a compiled and/or assembled computer program or as a primitive and hardware-dependent programming language. While it is possible to write programs directly in numerical machine code, it is tedious and error prone to manage individual bits and calculate numerical addresses and constants manually. It is therefore rarely done today, except for situations that require extreme optimization or debugging. Machine code instructions[edit] Every processor or processor family has its own machine code instruction set.

Instructions are patterns of bits that by physical design correspond to different commands to the machine. Thus, the instruction set is specific to a class of processors using (much) the same architecture. Programs[edit] A computer program is a sequence of instructions that are executed by a CPU. Assembly languages[edit] Example[edit] Jumping to the address 1024: Storing in memory[edit] Assembly language. See the terminology section below for information regarding inconsistent use of the terms assembly and assembler. Motorola MC6800 Assembly listing, showing original assembly language and the assembled form Assembly language is converted into executable machine code by a utility program referred to as an assembler; the conversion process is referred to as assembly, or assembling the code.

Key concepts[edit] Assembler[edit] Some assemblers may also be able to perform some simple types of instruction set-specific optimizations. Like early programming languages such as Fortran, Algol, Cobol and Lisp, assemblers have been available since the 1950s and the first generations of text based computer interfaces. Number of passes[edit] There are two types of assemblers based on how many passes through the source are needed to produce the executable program. High-level assemblers[edit] More sophisticated high-level assemblers provide language abstractions such as: Assembly language[edit] System programming language. A System programming language is usually used to mean "a language for system programming": that is, a language designed for writing system software as distinct from application software.

Features[edit] History[edit] The earliest system software was written in assembly language for reasons including efficiency of object code, compilation time, and ease of debugging. Application languages such as FORTRAN were used for system programming, although they usually still required some routines to be written in assembly language.[1] Mid-level languages[edit] Mid-level languages "have much of the syntax and facilities of a higher level language, but also provide direct access in the language (as well as providing assembly language) to machine features Higher-level languages[edit] Subsequently, languages such as C were developed, where the combination of features was sufficient to write system software, and a compiler could be developed that generated efficient object programs on modest hardware. System programming. System programming (or systems programming) is the activity of computer programming system software.

The primary distinguishing characteristic of systems programming when compared to application programming is that application programming aims to produce software which provides services to the user (e.g. word processor), whereas systems programming aims to produce software which provides services to the computer hardware (e.g. disk defragmenter). It requires a greater degree of hardware awareness. Overview[edit] The following attributes characterize systems programming: Systems programming is sufficiently different from application programming that programmers tend to specialize in one or the other.

Implementing certain parts in operating system and networking requires systems programming, for example implementing Paging (Virtual Memory) or a device driver for an operating system. History[edit] Alternate usage[edit] See also[edit] Computer programming References[edit] Further reading[edit] Code Examples for Programming in Scala. Tail call. Description[edit] When a function is called, the computer must "remember" the place it was called from, the return address, so that it can return to that location with the result once the call is complete. Typically, this information is saved on the call stack, a simple list of return locations in order of the times that the call locations they describe were reached.

For tail calls, there is no need to remember the place we are calling from – instead, we can perform tail call elimination by leaving the stack alone (except possibly for function arguments and local variables[1]), and the newly called function will return its result directly to the original caller. Besides space and execution efficiency, tail call elimination is important in the functional programming idiom known as continuation passing style (CPS), which would otherwise quickly run out of stack space. Syntactic form[edit] A tail call can be located just before the syntactical end of a subroutine: Now consider this code: No Title. Induction Subjects to be Learned Proof of program correctness using induction Contents Loops in an algorithm/program can be proven correct using mathematical induction. In general it involves something called "loop invariant" and it is very difficult to prove the correctness of a loop.

Here we are goin to give a few examples to convey the basic idea of correctness proof of loop algorithms. First consider the following piece of code that computes the square of a natural number: (We do not compute the square this way but this is just to illustrate the concept of loop invariant and its proof by induction.) SQUARE Function: SQ(n) S <- 0 i <- 0 while i < n S <- S + n i <- i + 1 return S Let us first see how this code computes the square of a natural number. First S <- 0 and i <- 0 give S = 0 and i = 0 initially.

Since i < 3, the while loop is entered the second time. Since i < 3, the while loop is entered the third time. In general to compute n2 by this algorithm, n is added n times. Homework - How to prove by induction that a program does something. Proof-carrying code. Proof-carrying code (PCC) is a software mechanism that allows a host system to verify properties about an application via a formal proof that accompanies the application's executable code. The host system can quickly verify the validity of the proof, and it can compare the conclusions of the proof to its own security policy to determine whether the application is safe to execute. This can be particularly useful in ensuring memory safety, i.e. preventing buffer overflows and other vulnerabilities common in some programming languages. Packet filter example[edit] The original publication on proof-carrying code in 1996 [1] used packet filters as an example: a user-mode application hands a function written in machine code to the kernel that determines whether or not an application is interested in processing a particular network packet.

See also[edit] References[edit] Jump up ^ Necula, G. 22oli.extension.harvard.edu.

Data Structures & Algorithms

Scientific Visualization (computer graphics) Computer hardware.