Linux环境编程导引
計算機系統硬件組成
?
總線
貫穿整個系統的一組電子管道稱為總線,?分為:
? 片內總線
? 系統總線
數據總線DB
地址總線AB
控制總線CB
? 外部總線
?
I/O設備
I/O設備是系統與外界聯系的通道
? ? 鍵盤鼠標是輸入設備,顯式器是輸出設備,磁盤既是輸入設備也是輸出設備,輸入輸出是相對于內存來說的。
?
內存
? 內存是一個重要的部件,它是與CPU進行溝通的橋梁。它用來存放程序以及程序要處理的數據,磁盤中的程序要加載到內存才能運行。
?
處理器
? 中央處理器(CPU),簡稱處理器。
? CPU主要有運算器、控制器、寄存器構成
? 取指:?PC,?IR
? 譯碼:?指令譯碼器,?RISC,?CISC
? 執行:?ALU
? 寫回:?->?內存
? 跳轉:?JMP
?
系統結構圖
?
?
DMA傳輸
? ? DMA?(直接訪問內存)傳輸將數據從一個地址空間復制到另外一個地址空間的一種技術。當?CPU?初始化這個傳輸動作時,傳輸動作本身是由?DMA?控制器?來實行和完成,?而CPU可以繼續去完成其他的工作,?CPU僅在傳輸動作的開始和結束的時候參與數據傳輸的控制。?典型的例子就是移動一個外存的區塊到芯片內部的內存區。像是這樣的操作并沒有讓處理器工作拖延,反而可以使CPU重新去處理其他的工作。在實現DMA傳輸時,是由DMA控制器直接掌管總線。
操作系統
什么是操作系統
? ?操作系統是”有效地管理計算機系統中的資源,合理地管理計算機系統的工作流程,方便用戶使用”的程序的集合。
?
操作系統三個基本抽象
? ? 操作系統擁有三個基本抽象概念:?進程、虛擬存儲器和文件。
? ? 文件是對I/O設備的抽象表示,虛擬存儲器是對主存和磁盤I/O設備的抽象表示,進程則是對處理器、主存和I/O設備的抽象表示。
進程
? ?進程是操作系統對正在運行的程序的一種抽象。一個系統可以運行多個進程,而每個進程好像在獨占使用硬件。
?
進程上下文切換
?
?
?
虛擬存儲器
? 虛擬存儲器為每個進程提供了一個大的、一致的、私有的地址空間;
? 它將內存看成是存儲在磁盤上的地址空間的高速緩存,在主存中只保存活動區域,并根據需要在主存與磁盤中來回交換數據。
? 為每個進程提供一致的地址空間,簡化了存儲管理,保護每個進程的地址空間不被其他進程破壞。
?
進程虛地址空間
?
文件
? ?文件是一系列的字節序列,它向應用程序提供了一個統一的視角,來看待系統中各式各樣的I/O設備。
?
虛擬文件系統VFS
? ? 虛擬文件系統是內核實現的一種架構,為用戶空間提供統一的文件操作接口,即文件系統調用。它在內核內部為不同的真實文件系統提供一致的抽象接口。
? ? 用戶通過系統調用與內核中的虛擬文件系統交互,進而操作實際的文件系統和設備。
?
系統編程?VS.?應用編程
系統編程
? ?在操作系統之上利用系統調用、C庫進行對系統資源進行訪問。編寫如apache?、gcc、gdb?等的服務應用.
? ?系統資源包括:處理器,輸入輸出,進程管理,內存,設備,定時器,進程間通信,網絡
應用編程
? ?在更高層次的編程接口或者庫之上構建應用程序。如android程序(android?sdk)、iphone程序(iphone?sdk)、QT程序設計(QT)、MFC程序設計(MFC)等。
?
?
系統調用在系統中所處的位置
? ?所有操作系統都提供多種服務的入口點,由此程序向系統核請求服務。這些入口點被稱之為系統調用(system?call),
?
?
C庫
? ?這里我們所說的C庫(libc),指的是標準C定義的C函數的集合。如標準輸入輸出函數、字符串處理函數、動態存儲分配函數、日期時間函數、數學函數等。
? ?GNU發布的libc稱為glibc.
?
系統調用與C庫關系
? ?系統調用與C庫從形式上來看都C函數;
? ?但C庫函數有些是調用系統調用來實現的,比如說malloc、free調用brk,printf調用write系統調用,而有些函數不需要任何系統調用,比如abs(fabs)、strcpy、atoi等,因為它并不是必需要使用內核服務;
? ?因此系統調用通常提供的是最小界面,而C庫函數通常提供更復雜的功能。
?
內核如何處理系統調用
? ?內核通過軟中斷的方式實現系統調用,?每個系統調用被賦予一個系統調用號,?在i386平臺上,執行一個系統調用需要通過?INT?0x80?指令來完成,?從用戶態切換到核心態.
? ?寄存器eax存放系統調用號,?寄存器ebx、ecx、edx、esi、edi存儲系統調用參數,對于超過5個參數的系統調用,用一個寄存器(如ebx)指向用戶空間的某個緩存,?該緩存存儲所有系統調用的參數(可以多于5個)。
?
錯誤處理
? ?在系統編程中通常通過函數返回值來表示錯誤(一般-1代表函數執行出錯),并通過特殊變量errno來描述。
? ?errno這個全局變量在?errno.h?頭文件中聲明如下:extern?int?errno;
? ? 錯誤處理函數:perror,?strerror;
//示例
int main() {int ret = close(10);/*if (ret == -1){perror("close error");}*/if (ret == -1){fprintf(stderr, "close error with message: %s, errno = %d\n",strerror(errno), errno);}return 0; }
?
常見錯誤代碼 | |
E2BIG | 參數列表太長 |
EACCESS | 權限不足 |
EAGAIN | 重試 |
EBADF | 錯誤的文件描述符 |
EBUSY | 設備或資源忙 |
ECHILD | 無子進程 |
EDOM | 數學參數不在函數域內 |
EEXIST | 文件已存在 |
EFAULT | 地址錯誤 |
EFBIG | 文件太大 |
EINTR | 系統調用被中斷 |
?
//常見錯誤代碼打印程序
int main() {for (int i = 0; i < 140; ++i){errno = i;cout << "errno " << i << ": " << strerror(errno) << endl;}return 0; }
總結
以上是生活随笔為你收集整理的Linux环境编程导引的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图说字王数码格系列
- 下一篇: puts(char *) gets(ch