1. 程式人生 > >20155232 《信息安全系統設計基礎》課程總結

20155232 《信息安全系統設計基礎》課程總結

自動 需要 控制 使用 進程 第一章 設置權限 加載 第十周

20155232 《信息安全系統設計基礎》課程總結

每周作業鏈接匯總

  • 第一周作業:學習課本第一章和第七章內容--預處理 編譯 匯編 鏈接 四者的關系和具體用法,並且對每章提出問題

技術分享圖片

  • 第二周課堂實踐補充:gcc測試gdb測試,靜態庫,共享庫的測試,myod實現。

技術分享圖片

  • 第三周學習總結:學習第二章
    主要內容就是信息的表示和處理,信息的存儲,16進制表示法,尋址,c語言中的運算以及數據的表示。

技術分享圖片

  • 第四周學習總結以及課上myod練習補充博客
  • 本周學習第十章和附錄A--系統編程錯誤處理的方式;掌握Unix/Linux系統級I/O: open close read write seek stat和I/O重定向的方法以及myod 實現Linux下od -tx -tc XXX的功能。

技術分享圖片

  • 第五周學習總結
  • 學習第三章。匯編相關知識,指令集體系結構,函數調用棧幀過程。
    技術分享圖片

  • 第五周加分題--mybash的實現
  • 使用fork,exec,wait實現mybash
    技術分享圖片

  • 第六周學習總結
  • 學習了異常及其種類,理解進程和並發的概念,掌握進程創建和控制的系統調用及函數使用。
    技術分享圖片

  • 第七周學習總結
  • 學習了ISA抽象的作用,掌握ISA,了解流水線。
    技術分享圖片

  • 第八周學習總結以及課下補做

  • 課本第十一章和第十二章內容,網絡編程和並發程序。課下補做:完成家庭作業4.47,4.48,4.49,將X86-64匯編翻譯成Y86匯編。基於socket 使用教材的csapp.h csapp.c,實現daytime服務器。
    技術分享圖片

  • 第九周學習總結
  • 學習課本第六章:了解常見的存儲技術(RAM、ROM、磁盤、固態硬盤等),局部性原理,緩存思想,高速緩存的原理和應用。
    技術分享圖片

  • linux pwd指令C實現
  • 實現pwd命令
    技術分享圖片

  • 第十周課堂測試(ch06)補交
  • 第六章內容測試
    技術分享圖片

  • 第十周課下作業-IPC
  • 研究Linux下IPC機制:原理,優缺點
    技術分享圖片

  • 第十一周學習總結
  • 主要學習第九章:虛擬存儲器的概念和作用,地址翻譯的概念,存儲器映射,動態存儲器分配的方法。
    技術分享圖片

  • 第十三周學習總結
  • 選擇最重要的一章內容學習:我選擇第12章主要講了程序的並發編程,一個並發編程是由在時間上重疊的一組邏輯流組成的。這章主要學習了三種不同的並發機制:進程,I/O多路復用和線程。
    技術分享圖片

  • 第十四周學習總結
  • 對學習最差的一章重新學習,我選擇第八章異常控制流這裏學習。異常控制流-ECF理解ECF將幫助我們理解重要的系統概念。更能幫助理解並發。
    技術分享圖片

實驗報告鏈接匯總

  • 實驗一
  • 開發環境的熟悉
  • 簡要內容:熟悉linux開發環境,學會使用交叉編譯環境。
    技術分享圖片

  • 實驗二
  • 固件程序設計
  • 簡要內容:安裝MDK,JLink驅動,破解MDK,UART,LED,MDK,國密算法。
    技術分享圖片

  • 實驗三
  • 實時系統
  • 簡要內容:學習使用Linux命令wc(1)
    基於Linux Socket程序設計實現wc服務器和客戶端。使用多線程實現wc服務器並使用同步互斥機制保證計數正確。
    技術分享圖片

  • 實驗四
  • 外設驅動程序設計
  • 簡要內容:學習資源中全課中的“hqyj.嵌入式Linux應用程序開發標準教程.pdf”中的第十一章。測試test試驗,提交編譯,加載模塊,卸載模塊。
    技術分享圖片

  • 實驗五
  • 通訊協議設計
  • 簡要內容:OpenSSL的安裝與使用。測試對稱算法中的AES,非對稱算法中的RSA,Hash算法中的MD5。實現對實驗二中的“wc服務器”通過混合密碼系統進行防護。
    技術分享圖片

代碼托管鏈接

二維碼:
技術分享圖片

截圖 git log --pretty=format:"%h - %an, %ar : %s" 的結果

技術分享圖片
代碼量匯總提交statistics.sh的支持截圖

技術分享圖片

代碼驅動的學習做到沒有?

不能說做得很好,但是在學習。剛開始就只是搬運課本上的代碼,不求甚解,只為了求代碼量,後來發現這樣的學習方式沒有作用,我記得在管道通信學習那裏,會自己嘗試編寫代碼,並且會在網上查詢一些相關代碼,去學習,發現很多內容都是書上沒有的,可以通過這種方式學到。並且在每周的課堂實踐練習的過程中,逐漸有意識的學會查看幫助文檔,用命令幫助查找所需要的函數和函數相關的參數,在這個過程中,也學習了很多英語單詞。

加點代碼,改點代碼是理解的最好方式,參考編程的智慧,談談你的心得

在實踐了代碼的基礎上,再對代碼進行一些修改就更能讓自己深入的理解代碼了。比如在學習線程的時候,我刻意地加上一些線程或者減少一些線程就會發現程序運行的結果是不同的。修改代碼也會讓學代碼變成一件有趣的事情。這是看懂並運用所學代碼的最好方式,實踐出真知,只有自己不斷的試與探索才可以真正轉化為自己的知識。

實踐上有什麽經驗教訓

實踐的時候要記著做一些準備,萬一代碼被修改或者不小心更改就會運行不出來,所以要有備份,並且要記著保存文檔以免數據不幸丟失降低效率。而且還很重要的是要勇於實踐。在平常測試的時候都是直接編寫代碼,對於平常學習只是看課本,是不夠的。所以要多動手編寫代碼。

整體評價一下第1周作業中自己提出的問題是不是抓住了學習重點

當時只是粗略的瀏覽這本書,所以只有一小部分抓住了重點,、其余都是很基礎的問題。

回答一下第1周作業中自己提出的問題

1.編譯器如何運行工作?

源碼要運行,必須先轉成二進制的機器碼。這是編譯器的任務。預處理之後,編譯器就開始生成機器碼。對於某些編譯器來說,還存在一個中間步驟,會先把源碼轉為匯編碼(assembly),然後再把匯編碼轉為機器碼。這種轉碼後的文件稱為對象文件(object file)。
對象文件還不能運行,必須進一步轉成可執行文件。編譯器的下一步工作,就是把外部函數的代碼(通常是後綴名為.lib和.a的文件),添加到可執行文件中。這就叫做連接(linking)。下一步,必須將可執行文件保存到用戶事先指定的安裝目錄。表面上,這一步很簡單,就是將可執行文件(連帶相關的數據文件)拷貝過去就行了。但是實際上,這一步還必須完成創建目錄、保存文件、設置權限等步驟。這整個的保存過程就稱為"安裝"(Installation)。
可執行文件安裝後,必須以某種方式通知操作系統,讓其知道可以使用這個程序了。

2.計算機的表示法是用有限數量的位來對一個數字編碼,當運算結果太大導致溢出時會出現什麽後果?

計算機的表示法是用有限數量的位來對應一個數字編碼,當結果太大不能表示時就會發生溢出。人為的溢出是有一定企圖的,攻擊者寫一個超過緩沖區長度的字符串,植入到緩沖區這時可能會出現兩種結果:一是過長的字符串覆蓋了相鄰的存儲單元,引起程序運行失敗,嚴重的可導致系統崩潰;另一個結果就是利用這種漏洞可以執行任意指令,甚至可以取得系統root特級權限。

3.能否在c中插入匯編代碼?具體是什麽方法?

由於C語言在定時方面的缺陷,在某些場合下,C程序中需要嵌入匯編代碼,以彌補C的缺陷。通常,在C語言程序中嵌入匯編的方法,無外乎兩種 。在C程序中填入#asm和#endasm的編譯命令,在之中填入匯編代碼。 編寫匯編函數,通過鏈接定位器和特殊的編譯方式鏈接方式加入到 所有程序的目標代碼中。 

4.存儲器的層次結構是怎樣的?

存儲器系統是一個由具有不同容量,不同成本,不同訪問時間的若幹存儲設備組成的層次結構,從上到下依次是:寄存器,高速緩存存儲器,主存,硬盤,網絡文件。層次越高,容量越小,成本越高,訪問時間越短,高層的存儲設備是底層存儲設備的緩存區。這樣,一個編寫良好的程序總是傾向於頻繁的訪問某一個層次上的存儲設備。這樣,整體效果就是一個大的存儲池,其單位成本與最底層的存儲設備相當,但是訪問速度卻可以達到最高層的存儲設備。

5.在程序優化的過程中,程序員應該考慮哪些?

1. 掌握常用的高效的數據結構和算法。 至少要熟悉模板的使用。

2.消除循環的低效率, 盡量減少循環次數。 盡量不要在循環裏 循環計算一些不會改變的值。 

3.消除不必要的存儲器引用。 盡量使用臨時變量來暫存要多次使用的引用值,避免尋址開銷。 

4.防止寄存器溢出。 臨時變量也並不是越多越好,因為寄存器總是有限的,如果需要同時使用的臨時變量數超過了可用的寄存器數量,編譯器會把臨時值存放到棧中。 一旦出現這種情況,性能會急劇下降。

5.循環展開。通俗的說就是利用分治的策略來減小循環的叠代次數。 

6.提高並行性。大多數情況下,程序的代碼都不是按部就班的一步一步從上往下執行的,它會適當的並行一些不相依賴的代碼行。所以盡量編寫不相依賴的代碼,能夠提高運行效率。

7.編寫利於分支預測的代碼。 在 CPU執行分支時,會預測程序朝哪一個分支方向執行。 

6.存儲器山具體指什麽,有什麽功能

存儲器山是一種綜合研究存儲器層次結構的工具。它反映了存儲器層次結構中不同層次的帶寬。也反映了具有不同的時間局部性與空間局部性的程序的性能。通過分析存儲器山的數據,還可以看出存儲器系統的部分硬件參數。

7.學習鏈接的知識有什麽用途?

一個函數或變量的聲明,實際上就是在向 C 編譯器承諾:這個函數或變已在程序中的別處定義了,而鏈接器的工作就是兌現這一承諾。

參考此篇文章更能理解透徹之間的關系:

幫 C/C++程序員徹底了解鏈接器

8.異常處理具體如何實現,會發生什麽情況?

,異常都被認為是一種很優雅的處理錯誤的機制。我們可以使用c語言中強大的setjmp和longjmp函數實現異常處理機制。異常處理的核心思想是,把功能模塊代碼與系統中可能出現錯誤的處理代碼分離開來,以此來達到使我們的代碼組織起來更美觀、邏輯上更清晰,並且同時從根本上來提高我們軟件系統長時間穩定運行的可靠性。首先設置一個跳轉點(setjmp() 函數可以實現這一功能),然後在其後的代碼中任意地方調用 longjmp() 跳轉回這個跳轉點上,以此來實現當發生異常時,轉到處理異常的程序上。

9.內存泄露和內存溢出有何不同??


內存泄漏也稱作“存儲滲漏”,用動態存儲分配函數動態開辟的空間,在使用完畢後未釋放,結果導致一直占據該內存單元。直到程序結束。有人比喻是“操作系統可提供給所有進程的存儲空間正在被某個進程榨幹”,最終結果是程序運行時間越長,占用存儲空間越來越多,最終用盡全部存儲空間,整個系統崩潰。所以“內存泄漏”是從操作系統的角度來看的。這裏的存儲空間並不是指物理內存,而是指虛擬內存大小,這個虛擬內存大小取決於磁盤交換區設定的大小。由程序申請的一塊內存,如果沒有任何一個指針指向它,那麽這塊內存就泄漏了。

內存溢是指在一個域中輸入的數據超過它的要求而且沒有對此作出處理引發的數據溢出問題,多余的數據就可以作為指令在計算機上運行。通常在運行大型軟件或遊戲時,軟件或遊戲所需要的內存遠遠超出了你主機內安裝的內存所承受大小,就叫內存溢出。此時軟件或遊戲就運行不了,系統會提示內存溢出,有時候會自動關閉軟件,重啟電腦或者軟件後釋放掉一部分內存又可以正常運行該軟件或遊戲一段時間。

10.系統級I/O重定向是如何工作的?

所謂I/O重定向簡單來說就是一個過程,這個過程捕捉一個文件,或者命令,程序,腳本,甚至腳本中的代碼塊(codeblock)的輸出,然後把捕捉到的輸出,作為輸入發送給另外一個文件,命令,程序,或者腳本。如 果談到I/O重定向,就涉及到文件標識符(File Descriptor)的概念,在Linux系統中,系統為每一個打開的文件指定一個文件標識符以便系統對文件進行跟蹤,文件標識符是一個數字,不同數字代表不同的含義,默認情況下,系統占用了3個,分別是0標準輸入(stdin),1標準輸出(stdout),2 標準錯誤(stderr),另外3-9是保留的標識符,可以把這些標識符指定成標準輸入,輸出或者錯誤作為臨時連接。通常這樣可以解決很多復雜的重定向請求。

11.HTTP事務具體包含了什麽內容?

域名解析 --> 發起TCP的3次握手 --> 建立TCP連接後發起http請求 --> 服務器響應http請求,瀏覽器得到html代碼 --> 瀏覽器解析html代碼,並請求html代碼中的資源(如js、css、圖片等) --> 瀏覽器對頁面進行渲染呈現給用戶

參考一次完整的HTTP事務是怎樣一個過程?

12.如何構造並發程序?

基於進程的並發編程:構造並發編程最簡單的方法就是用進程,使用那些很熟悉的函數,像fork、exec和waitpid。

基於I/O多路復用的並發編程:面對困境——服務器必須響應兩個互相獨立的I/O事件:網絡客戶端發起的連接請求。用戶在鍵盤上鍵入的命令 ,解決的辦法是I/O多路復用技術。基本思想是,使用select函數,要求內核掛起進程,只有在一個或多個I/O事件發生後,才將控制返回給應用程序。可以使用select、poll和epoll來實現I/O復用。

基於線程的並發編程:在使用進程並發編程中,我們為每個流使用了單獨的進程。內核會自動調用每個進程。每個進程有它自己的私有地址空間,這使得流共享數據很困難。在使用I/O多路復用的並發編程中,我們創建了自己的邏輯流,並利用I/O多路復用來顯式地調度流。因為只有一個進程,所有的流共享整個地址空間。而基於線程的方法,是這兩種方法的混合。線程就是運行在進程上下文的邏輯流。線程由內核自動調度。每個線程都有它自己的線程上下文,包括一個唯一的整數線程ID、棧、棧指針、程序計數器、通用目的寄存器和條件碼。所有的運行在一個進程裏的線程共享該進程的整個虛擬地址空間。基於線程的邏輯流結合了基於線程和基於I/O多路復用的流的特性。同進程一樣,線程由內核自動調度,並且內核通過一個整數ID來標識線程。同基於I/O多路復用的流一樣,多個線程運行在單一進程的上下文中,因此共享這個線程虛擬地址空間的整個內容,包括它的代碼、數據、堆、共享庫和打開的文件。

你有什麽項目被加分,談談你的經驗

第二周課堂實驗

技術分享圖片

pwd指令C實現加分項目

技術分享圖片

第五周加分題--mybash的實現

技術分享圖片

第四周學習總結以及課上myod練習補充博客

技術分享圖片

第十周課堂測試(ch06)補交

技術分享圖片

第八周學習總結以及課下補做

技術分享圖片

第二周課堂實驗

技術分享圖片

經驗不僅要對書上的代碼進行實踐,還要自己進行拓展,上網搜索資料進行深入學習。

你有什麽項目被扣分,談談你的經驗

無扣分項目

課程收獲與不足

  • 自己的收獲

和比上個學期,我每周投入在課程學習上的時間多了許多,而且本學期代碼也比上學期多,編程實踐更主動了一些。每周老師發布學習任務之後,就會先大概地、看一下學習內容是什麽,事先做好規劃,每天都學一點,不把博客拖到周日在寫,每天都會傳一些代碼。有時候課上沒有完成的實踐內容,課下去補充的時候,反而會覺得學習到了更多,因為時間會更充分,可以上網多查詢一些相關的資料,多擴展一些,多深入學習一些,而不是只停留在表面,為了去完成任務而完成任務。

在一整個學期的學習中,我最大的收獲應該是學習方法。不會再像以前,每次因為要寫博客就很抓狂,現在好像已經習慣了這種學習方式,對自主學習的能力提高了很多,不是只停止於完成作業去完成作業,而是會進行深一步的學習。如果遇到問題,也會先嘗試自己解決,再求助同學或者老師,自己上網搜索看是否別人也和我遇到了同樣的問題,查看解決方法自己嘗試著解決。每次上課老師都會強調

man -k

grep

命令,剛開始覺得不以為然,後面在學習的過程中發現這兩個命令出奇的好用,在每次遇到不認識的函數或者系統調用的時候,都可以查看他的API進行學習,非常方便,也提高了英語單詞餓詞匯量,很多單詞不認識,在查過中文意思之後,就會有意識的去記憶。

  • 自己需要改進的地方

有時候在學習的時候,容易走神,然後會去幹一些別的事情,導致原本計劃的一些事情沒有在規定時間內做完,就會拖延,然後影響後面的一些計劃,所以要改掉這個壞毛病,養成專心致誌做一件事情,並且同樣的時間高效率的完成。

  • 給學弟學妹們的學習建議

首先應該是勇於實踐。剛開始在接觸這種自學方法的時候很不適應,很多東西都無法自己獨立的去完成,在這個過程中慢慢就會養成自己動手實踐去解決的能力,在這個過程中,會遇到很多問題,但是正是因為這些問題,才會讓你記憶深刻,達到學習的目的。其次就是應該合理分配時間,每天有計劃的去學習,而不是周末才想起來去補博客。

  • 如果有結對,寫一下你提供的幫助或接受了什麽幫助,並對老師提供參考建議

本學期有結對學習,在學習的過程中,遇到問題可以兩個人一起討論並解決,這個學習的氛圍是相對輕松的,更有助於增加學習的動力。

  • 如果重新學習這門課,怎麽做才可以學的更好

提高自己的效率和有計劃有安排的去學習。效率高無外乎就是在你去完成一個事情的時候是全身心投入的,只有這樣才可以完成的又快又好。

問卷調查

  • 你平均每周投入到本課程多長時間?

20多個小時左右,這些時間就是先看課本內容,然後總結課本內容寫到博客的知識總結部分,然後對課本上的代碼進行運行調試,總結出現的問題並找到解決辦法,最後在做課本習題進行課外拓展。

  • 每周的學習效率有提高嗎?

前面幾周的學習效率不高,因為在最初接觸這個新的學習內容的時候,有些疑惑,不知道從哪裏下手,在後面就很熟悉了。效率慢慢就在提高了。

  • 學習效果自己滿意嗎?

比較滿意,如果能減少一些學習中的惰性就更好了。

  • 課程結束後會繼續一周至少一篇博客嗎?(如果能做到,畢業時我把你的博客給你集結成一本書送給你作紀念)

我會去嘗試,因為這是一個很好的習慣。

  • 你覺得這門課老師應該繼續做哪一件事情?

繼續講解課本內容,並且每過一段使勁就進行一次考核。

  • 你覺得這門課老師應該停止做哪一件事情?

沒有什麽應該停止的,因為都安排的很合理妥當。

  • 你覺得這門課老師應該開始做什麽新的事情?

新的事情就是講一些錯題吧,或者對實驗的項目進行提前的預習或者材料的講解,能夠幫助我們在做實驗的時候更好的去理解。

本文鏈接

http://www.cnblogs.com/lsqsjsj/p/8127814.html

二維碼

技術分享圖片

20155232 《信息安全系統設計基礎》課程總結