[原則基礎:「Hello World」の持つコンピュータ・システム#1の深い理解をすべて開始()

 

  コンピュータシステムは、システムのハードウェアおよびソフトウェアコンポーネントで構成され、彼らは、アプリケーションを実行するために一緒に働きます。が時間の連続的な変化はなく、本来のシステムの概念とシステムの具体的な実装では変更されていません。

すべてのコンピュータのハードウェアとソフトウェアは、同様の構造と機能を持っています。シリーズのテーマは、これらのコンポーネントの彼の動作原理と基盤となる学習プロセスのプログラムへの影響をまとめています。

研究を通して、私たちは、現代のプロセッサとメモリ・システムを最大限に活用するために設計された彼らのCコードを、最適化するためのトリックのいくつかを知っています。あなたは、コンパイラは、プロシージャ・コールを達成する方法を学びますし、セキュリティの脆弱性に起因するバッファオーバーフローを避けるために、この知識を使用する方法。

  システムはシンプルなエントリー手続きのハロー世界から何が起こったのか、我々が導入している最後になりました。そこに何が起こっているのですか?

 

 


1の#include <stdio.hに>

メイン2 INT()

3 {

4のprintf( "こんにちは、世界\ n" は)

5リターン0;

6}


 

  我々はプログラムをHelloWorldの後HWと呼ばれます。(Huawei社?)

HWのライフサイクルは、DEV、VC6により、プログラマーのテキストファイルは、エディタで作成対のようなことを、一つのソース(ソースファイル)開始からです。それはあなたがコードの非常に熟練した山を果たしていることです。

ファイル名は、(例としてC言語のすべての後に)hw.cです

  値のソースが実際に1と0のビット(ビット)シーケンスで構成され、8ビットはバイトと呼ばれるグループと呼ばれます。各バイトは、プログラム内のいくつかのテキスト文字を表します。

最近のほとんどのコンピュータは、標準のASCIIテキスト文字を表すために使用します。(情報交換用米国標準コード:情報交換用米国標準コード)、実際には、このように一意の整数値の各文字を表すために、単一のバイト。

例えば、プログラムのHW ASCII表現:


#I N C Lは、UはSP <S T D I 0 eはdは。H>

35 105 110 99 108 117 100 101 32 60 115 116 100 105 111 46 104 62

残りの数行の詳細に行くことではありません

  あなたはまだ、法律を発見しました。Hw.cは、バイトのシーケンスが途中でファイルに格納されています。各バイトは、整数値を持っています。我々は以前の8ビット(ビット)はバイトであると述べました。あなたが保存進数8を使用することができ、これらのデジタルフォーマット手段。

注:ここで非表示にするコードの後続の各ラインは、N末端に改行\、ASCII値10に対応しています。唯一のASCIIファイルの文字からなるテキストファイルと呼ばこのようなHw.cは、他のすべてのファイルは、バイナリファイルと呼ばれます。

  hw.c表現は、システムの基本的な考え方(ディスクファイル、ビデオ、ネットワーク伝送面における)情報のすべてのビット(ビット)の列で表されるを示しています。私たちは、これらのデータを読むことを、これらの異なるデータオブジェクトを区別するための唯一の方法は、コンテキストオブジェクト。例えば、異なるコンテキストで、バイトの同様のシーケンスは、整数、浮動小数点、文字列、または機械命令を示すことができます。例えば、ポークチョップのように、両面バッグクラッチケーキに生地を入れ、ハンブルクに配置されます。これは、すべての背景に依存しています。

  彼らは実際の整数と実数に関連して、プログラマーとして、私たちは、機械のデジタル表現を理解する必要が異なっています。彼らは、我々は、この後の話を、真の値の有限近似しています。

  他のプログラムもまた異なる形式で他のプログラムに変換されます

  このフォームは、読み取り人でできるのでHWが、開始高水準言語C言語プログラムからプログラムのライフサイクルです。しかし、システム上hw.cを実行するために、各C文は、低レベルの機械語命令のシリーズのような他のプログラムに変換する必要があります。例に、我々はすべての人々、手段の存在に住んでいたならば、我々と人の王朝、部族の戦士、原始猿人のライブ一緒に。しかし、我々は直接猿人を伝えることができない、我々は部族民、部族の人々を翻訳して、最終的に我々は猿人を説明することを意味するために、人々は王朝を翻訳してみましょう王朝の人々を言いたいです。

  機械語変換にC言語の文の後に、フォーマットに従ってパッケージを置き、以前のバイナリディスクファイルを前記のように、それを格納するために実行可能なオブジェクトプログラムと呼ばれます。また、ターゲットプログラムの実行可能オブジェクトファイルと呼ばれます、

UNIXシステムでは、目的地までのソース・ファイルからの変換は、コンパイラドライバによって行われます。

Linuxの>のgcc -oハローhello.cの

  ここでは、GCCコンパイラドライバはソースファイルhw.cを読み取り、実行可能なオブジェクト・ファイルHWに翻訳します。次のようにプロセスは、完了するまでに4つの段階に分かれています。

私たちは、各プロセスAを分析します。

  前処理ステージ:命令に従ってプリプロセッサ(CPP)は#で始まるは、元のCプログラムを修正します。例えば#incloudeに<stdio.h>コマンドでhw.cプロセッサがプリヘッダファイルstdio.hシステムの内容を読み取り、プログラムのテキストに直接置く伝えます。ロングコードプログラムCの結果は、通常、ファイル名は私を接尾辞として。

 

  コンパイルフェーズ:コンパイラ(CCL)のテキストファイルhw.sアセンブリ言語プログラムを含むテキストファイルに変換hw.i。メインプログラムは、関数の定義が含まれています。

1メイン:

2 SUBQ $ 8%のRSP

3 MOVL $ .LCO、%EDI

4コール・プット    

5 MOVL $ 0%eaxに

6 ADDQ $ 8、%のRSP

7右

7行2に1つの機械命令に記載された方法でテキストのすべての行に定義されています。私たちは、詳細は後にアセンブリ言語学習でよ

 

  コンパイルフェーズ:次に、機械語命令に変換としてhw.sアセンブラは、これらの命令は再配置可能なオブジェクトプログラムと呼ばれる形式の生成を詰め、そしてhw.o.に格納結果を hw.oメイン命令エンコーディングの関数である17のバイトを含むバイナリファイルです。それが開いている場合は、歪みのグループがテキストエディタなどで見られます。

 

  リンク段階:私たちは、ソースコード内のprintf関数を呼び出すことに注意しなければならない、この時間は、それは、コンパイラが提供する標準Cライブラリの関数です。printf関数は、プリコンパイルされたオブジェクトファイルと呼ばれる別のprintf.oに存在し、このファイルには、リンカldは、この合併に責任がある、私たちの前のhw.oプログラムに組み込まれます。最後にGET HW(拡張子なし)ファイル。彼は、メモリにロードすることができ、実行可能ファイルです。

 

あなたは私たちを助けることができるどのようにこれらの基本的な原則コンパイラを理解しますか?

  对于类似helloworld这样简单的程序,我们可以依靠编译系统生成正确有效的机器代码。但是,很多稍微复杂点的程序在编译过程中就会产生一些需要动脑的问题。

 

优化程序性能。为了使我们的代码更高效,我们需要去了解一些机器代码以及编译器是咋把语言代码转化成机器代码的方式的。比如一些你可能从来没想过的小问题:switch语句和if-else效率是一样的吗?谁更快,谁占用的系统资源更少?while和for循环在系统内部是执行一样的指令吗?为什么有时候简单地重新排列了一下算术表达式中的括号就可让程序运行的更快?

理解报错:编译器报错大家都见怪不怪了吧,提示的错误代码,我们都会复制到百度谷歌中去查看解决办法。但是如果我们深入地了解了编译器以及系统底层原理,对于报错就会有大大的理解和扫除一些盲区的能力。比如链接器报错说它无法解析一个引用。为啥有些程序编译不报错,当你写好了520表白程序给女友时,她一打开就是一个经典的windows报错提示信息?

 

避免安全漏洞:对于渗透测试学习的朋友们最能懂了吧,比如缓冲区溢出,还有很多像ms17永恒之蓝ms14之类的安全漏洞,都是在底层层面的研究问题。也许我们大可在360里面打几个漏洞补丁。但如果你深入去理解,这对你大有裨益。

 

我们的helloword程序目前卡在了刚变成一团乱乎乎的二进制文件这个阶段,下期将进入更深层的阶段

 

おすすめ

転載: www.cnblogs.com/tanee/p/12380822.html