人機交互實驗冊_第1頁
人機交互實驗冊_第2頁
人機交互實驗冊_第3頁
人機交互實驗冊_第4頁
人機交互實驗冊_第5頁
已閱讀5頁,還剩24頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、學 生 實 驗 報 告(理工類)課程名稱: 人機交互技術(shù) 專業(yè)班級:12軟件工程(1)班 學生學號: 1205107003 學生姓名: 吳運德 所屬院部:南京國際軟件學院 指導教師: 陳圣國 20 13 20 14 學年 第 1 學期 金陵科技學院教務處制實驗報告書寫要求實驗報告原則上要求學生手寫,要求書寫工整。若因課程特點需打印的,要遵照以下字體、字號、間距等的具體要求。紙張一律采用A4的紙張。實驗報告書寫說明實驗報告中一至四項內(nèi)容為必填項,包括實驗目的和要求;實驗儀器和設(shè)備;實驗內(nèi)容與過程;實驗結(jié)果與分析。各院部可根據(jù)學科特點和實驗具體要求增加項目。填寫注意事項(1)細致觀察,及時、準確、

2、如實記錄。(2)準確說明,層次清晰。(3)盡量采用專用術(shù)語來說明事物。(4)外文、符號、公式要準確,應使用統(tǒng)一規(guī)定的名詞和符號。(5)應獨立完成實驗報告的書寫,嚴禁抄襲、復印,一經(jīng)發(fā)現(xiàn),以零分論處。實驗報告批改說明實驗報告的批改要及時、認真、仔細,一律用紅色筆批改。實驗報告的批改成績采用百分制,具體評分標準由各院部自行制定。實驗報告裝訂要求實驗批改完畢后,任課老師將每門課程的每個實驗項目的實驗報告以自然班為單位、按學號升序排列,裝訂成冊,并附上一份該門課程的實驗大綱。實驗項目名稱: 圖形用戶界面設(shè)計 實驗學時: 4 同組學生姓名: 實驗地點: 工科樓A205 實驗日期: 11 月 4 日 實驗

3、成績: 批改教師: 陳圣國 批改時間: 實驗1 圖形用戶界面設(shè)計一、實驗目的和要求1)熟悉圖形用戶界面的設(shè)計原則2)利用一種設(shè)計工具完成圖形化的用戶界面設(shè)計3)記錄系統(tǒng)分析及層次結(jié)構(gòu)設(shè)計的過程,調(diào)試程序要記錄調(diào)試過程中出現(xiàn)的問題及解決辦法;4)編寫程序要規(guī)范、正確,上機調(diào)試過程和結(jié)果要有記錄,不斷積累編程及調(diào)試經(jīng)驗;5)做完實驗后給出本實驗的實驗報告。二、實驗儀器和設(shè)備奔騰以上計算機,Windows XP 、Visual Studio三、實驗過程利用常用的設(shè)計工具完成一個通用圖形用戶界面設(shè)計,要遵循界面設(shè)計的一般原則,注意顏色的使用,學會使用圖標、按鈕、屏幕布局、菜單和對話框的設(shè)計。主要步驟:

4、熟悉開發(fā)環(huán)境分析所要實現(xiàn)的功能編程實現(xiàn)程序清單:界面圖主程序using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;namespace 銀行儲蓄處理系統(tǒng) public partial class load : Form public load() InitializeComponent(); private void Form1_Load

5、(object sender, EventArgs e) /*登陸代碼部分*/ private void queding_Click(object sender, EventArgs e) if (textBox1.Text.Trim() = ) MessageBox.Show(請輸入用戶名!, 提示); else if (textBox1.Text.Trim() = 1234 & textBox1.Text.Trim() = 1234) this.Hide(); Mainform maiform1 = new Mainform(); maiform1.ShowDialog(); else M

6、essageBox.Show(賬號或密碼有誤,請重新輸入!, 提示); textBox1.Clear(); textBox2.Clear(); /*退出代碼部分*/ private void quxiao_Click(object sender, EventArgs e) this.Close(); using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windo

7、ws.Forms;namespace 銀行儲蓄處理系統(tǒng) public partial class Mainform : Form public Mainform() InitializeComponent(); private void Mainform_Load(object sender, EventArgs e) private void 退出系統(tǒng)ToolStripMenuItem_Click(object sender, EventArgs e) DialogResult Digrst = MessageBox.Show(是否退出銀行儲蓄處理系統(tǒng)?, 提示信息, MessageBoxB

8、uttons.YesNo, MessageBoxIcon.Question); if (Digrst = DialogResult.Yes) Application.Exit(); else if (Digrst = DialogResult.No) return; private void 存款ToolStripMenuItem_Click(object sender, EventArgs e) Cunkuan cun = new Cunkuan(); cun.ShowDialog(); using System;using System.Collections.Generic;using

9、System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;namespace 銀行儲蓄處理系統(tǒng) public partial class Cunkuan : Form public Cunkuan() InitializeComponent(); private void button2_Click(object sender, EventArgs e) if (textBox1.Text.Trim() = 123456 | textBox2

10、.Text.Trim() = 123456) Addkehu addkehu = new Addkehu(); addkehu.ShowDialog(); else MessageBox.Show(請輸入正確信息!, 提示); private void button1_Click(object sender, EventArgs e) this.Close(); using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;usin

11、g System.Text;using System.Windows.Forms;namespace 銀行儲蓄處理系統(tǒng) public partial class CreateRole : Form public CreateRole() InitializeComponent(); private void button2_Click(object sender, EventArgs e) this.Close(); private void CreateRole_Load(object sender, EventArgs e) 四、實驗結(jié)果與分析 菜單在圖形界面的應用程序中使用得非常普遍,是

12、軟件界面設(shè)計的一個重要組成方面,描述了一個軟件的大致功能和風格。菜單中的選項在功能上與按鈕相當,一般具有下列一種或幾種類型的選項:命令項、菜單項和窗口項。菜單的結(jié)構(gòu)一般有單一菜單、線狀序列菜單、樹狀結(jié)構(gòu)菜單、網(wǎng)狀結(jié)構(gòu)菜單等,其中樹狀結(jié)構(gòu)菜單是最常見的結(jié)構(gòu)。作人員的重要操作要有信息反饋、操作可逆、設(shè)計良好的聯(lián)機幫助、合理劃分并高效地使用顯示屏、保證信息顯示方式與數(shù)據(jù)輸入方式的協(xié)調(diào)一致五、討論、思考題圖形用戶界面的應用程序與控制臺應用結(jié)構(gòu)的主要區(qū)別體現(xiàn)在哪些地方?圖形界面程序基于一個無窮的消息循環(huán)。直到退出消息時,程序才終止。而HYPERLINK /search?word=控制臺程序&fr=qb_

13、search_exp&ie=utf8控制臺程序是一個簡單的直線型結(jié)構(gòu),運行到最后一段代碼就停止。實驗項目名稱:多通道用戶界面 實驗學時: 4 同組學生姓名: 實驗地點: 工科樓A205 實驗日期: 11 月 18 日 實驗成績: 批改教師: 陳圣國 批改時間: 實驗2 多通道用戶界面設(shè)計一、實驗目的1) 了解常見的多通道用戶界面2)查找資料,熟悉一種多通道用戶界面并寫出綜述二、實驗要求(1)記錄系統(tǒng)分析及結(jié)構(gòu)設(shè)計的過程,調(diào)試程序要記錄調(diào)試過程中出現(xiàn)的問題及解決辦法;(2)編寫程序要規(guī)范、正確,上機調(diào)試過程和結(jié)果要有記錄,不斷積累編程及調(diào)試經(jīng)驗;(3)做完實驗后給出本實驗的實驗報告。三、實驗設(shè)備

14、、環(huán)境奔騰以上計算機,Windows XP 四、實驗步驟及內(nèi)容(一) 實驗內(nèi)容:要求上網(wǎng)查找資料,熟悉一種多通道用戶界面并寫出綜述,可以是眼動跟蹤、手勢識別、三維輸入、語音識別、表情識別、手寫識別等。(二)實驗步驟:1)借助圖書館的中英文參考文獻資料以及網(wǎng)絡,確定出一種多通道用戶界面;2)完成對該多通道用戶界面的綜述(包括定義、發(fā)展歷史、當前的應用、主要的研究方法分類、以及發(fā)展前景以及中英文參考文獻(至少各5篇))語音識別多通道用戶界面定義 隨著計算機技術(shù)的發(fā)展,人們迫切需要一種更加自然的、更加能為多數(shù)人所接受的方式與計算機溝通。在人機對話方面尋求最好的語音信息交換手段是發(fā)展人機語音通信和新一

15、代智能計算機的主要組成部分。隨著計算機的普及,越來越多的人在使用計算機,如何給不熟悉計算機的人提供一個友好的人機交互手段,逐漸引起了人們的重視。從而也就誕生了計算機語音學。計算機語音學覆蓋了廣泛的研究活動,包括語音識別、語音合成、語音編碼、自然語言理解、機器翻譯等。語音識別技術(shù)是計算機通過識別和理解的過程把語音信號轉(zhuǎn)變?yōu)橄鄳奈谋疚募蛎畹募夹g(shù)。當人們想對計算機說話時,通常首先需要進行語音識別,即將聲音信號轉(zhuǎn)換成單詞流。發(fā)展歷史語音識別的研究工作大約開始于20世紀50年代,當時AT&T Bell實驗室基于共振峰提取技術(shù)實現(xiàn)了第一個可識別十個英文數(shù)字的語音識別系統(tǒng)Audry系統(tǒng)。60年代,計算

16、機的應用推動了語音識別的發(fā)展。這時期的重要成果是提出了動態(tài)時間規(guī)劃(DP)和線性預測分析技術(shù)(LPC),其中后者較好地解決了語音信號產(chǎn)生模型的問題,對語音識別的發(fā)展產(chǎn)生了深遠影響。70年代,語音識別領(lǐng)域取得了較大進展。在理論上,LP技術(shù)得到進一步發(fā)展,動態(tài)時間歸正技術(shù)(DTW)基本成熟,特別是提出了矢量量化(VQ)和隱馬爾可夫模型(HMM)理論。在實踐上,實現(xiàn)了基于線性預測倒譜和DTW技術(shù)的特定人孤立語音識別系統(tǒng)。80年代,MFCC的參數(shù)提取技術(shù)和HMM模型的深入使用使得語音識別技術(shù)得到進一步的發(fā)展,語音識別的問題逐步在理論體系上得到了比較完整和準確的描述,同時在實踐上又逐步研發(fā)出效率較高的解

17、決算法。90年代以來,在美國國防部的Darpa測試、Ears計劃、近期的Gales計劃,以及我國863計劃等推動下,一大批高水平的研究機構(gòu)和企業(yè)加入到語音識別的研究領(lǐng)域,極大地推動了語音識別技術(shù)的發(fā)展和應用。語音識別系統(tǒng)已經(jīng)從過去的小詞匯量、孤立詞識別、特定人識別、安靜環(huán)境等簡單任務逐步發(fā)展到大詞匯量、連續(xù)語音、非特定人、噪聲環(huán)境下的識別任務,從單純的語音識別任務發(fā)展到語音翻譯任務,從實驗室系統(tǒng)走向商用系統(tǒng)。 最近年里,語音識別技術(shù)的顯著進展,帶來了高性能的算法和系統(tǒng)。用于語音撥號、語音命令控制、簡單的數(shù)據(jù)輸入和準備結(jié)構(gòu)化文檔的語音識別工具已經(jīng)開始出現(xiàn)。主要的研究方法分類語音識別技術(shù)是計算機通

18、過識別和理解的過程把語音信號轉(zhuǎn)變?yōu)橄鄳奈谋疚募蛎畹募夹g(shù)。一個完整的語音識別系統(tǒng)應包括以下三個部分:語音特征提取 語音信號在完成模/數(shù)轉(zhuǎn)換后,還要進行特征提取,一方面為了獲得語音的本質(zhì)特征;另一方面還可以進行數(shù)據(jù)的壓縮。目前通用特征提取的方法是基于語音幀的,即將語音信號分為有重疊的若干幀,對每一幀提取語音特征。聲學模型聲學模型是用于從語音到音節(jié)的概率計算。在識別時將提取的語音特征與聲學模型比較并匹配,以獲得最佳的識別效果。目前廣泛采用的聲學建模法有:隱馬爾科夫模型建模和上下文相關(guān)建模。語言模型語言模型用于計算從音節(jié)到字的概率。目前,語言模型主要有:規(guī)則模型和統(tǒng)計模型兩種。語音識別的過程分為

19、三個步驟:預處理、識別和后處理。預處理包含波形硬件采樣率的確定、分幀的大小和幀移策略的確定;剔除噪聲的帶通濾波、高頻預加重處理、各種變換策略;波形的自動切分。首先對模擬語音信號采樣,將其數(shù)字化。連續(xù)語音流切分是找出語音信號中的各種識別基元如音素、音節(jié)、半音節(jié)、聲韻母、單詞或意群等的始點和終點的位置,進而將對連續(xù)語音的處理變?yōu)閷Ω鱾€語音單元的處理。語音端點檢測指的也是連續(xù)語音流切分。識別包含特征參數(shù)提?。粎?shù)模板存儲及識別。識別語音的過程,實際上是對語音特征參數(shù)模式的比較和匹配的過程。尋找一個既能充分表達語音特征又能彼此區(qū)別的、較穩(wěn)定的特征參數(shù)是很重要的。語音識別系統(tǒng)常用的特征參數(shù)有線性預測系數(shù)

20、、倒頻譜系數(shù)、平均過零率、平均能量、短時頻譜、共振蜂頻率及帶寬等。識別參數(shù)的選擇著眼于能得到高的識別率,由于有些參數(shù)的提取較為復雜,計算較費時,因而要折衷考慮選用哪些參數(shù)并確定采用哪種識別方法。后處理包括自動分詞、詞類分析、詞義分析、詞用分析、語法分析、句法分析、同音詞判別等。后處理是利用語言學知識庫中的知識,按一定的推理策略,把識別出來的拼音轉(zhuǎn)換成漢字并理解語句的含義。語言學知識庫中有詞匯、語法、句法、語義、語用和常用詞語搭配等知識。發(fā)展前景21世紀是信息和網(wǎng)絡的時代,Internet和移動通信、固話通信的網(wǎng)絡把全球各地連接起來。自然口語對話、電子商務、信息索取、數(shù)字圖書館、語音翻譯、遠程

21、HYPERLINK / t _blank 教育等一系列的人類活動都可在網(wǎng)絡上實現(xiàn)。語音識別系統(tǒng)的出現(xiàn),會讓人更加自由的溝通,讓人在任何地方,任何時間,對任何事都能夠通過語音交互的方式,方便地享受到更多的社會信息資源和現(xiàn)代化服務。這必然會成為語音識別技術(shù)研究和應用的重要發(fā)展趨勢。參考文獻1 柳春 語音識別技術(shù)研究進展J 甘肅科技2 楊尚國 語音識別技術(shù)概述J 福建電腦3 熊燕 抗噪聲語音識別技術(shù)研究J 中國科技信息 4 劉筠 一種新型語音識別系統(tǒng)J 成都大學學報(自然科學版) 5 馬斌 基于小波變換的DSP語音識別系統(tǒng)J 低壓電器6 英鋒 基于SPCE061A的語音識別系統(tǒng)的設(shè)計J 微計算機信息

22、五、討論、思考題簡要討論人機交互界面的發(fā)展趨勢。 人機交互和計算機用戶界面剛剛走過基于字符方式的命令語言式界面,目前正處于圖形用戶界面時代。但是,計算機科學家并不滿足于這種現(xiàn)狀,他們正積極探索新型風格的人機交互技術(shù)。當前語音識別技術(shù)和計算機聯(lián)機手寫識別技術(shù)的商業(yè)成功讓人們看到了自然人機交互的曙光。虛擬現(xiàn)實和多通道用戶界面的迅速發(fā)展顯示出未來人機交互技術(shù)的發(fā)展趨勢是追求所謂“人機和諧”的多維信息空間和“基于自然交互方式的”的人機交互風格。多通道用戶界面與多媒體用戶界面一道共同提高人機交互的自然性和效率。多通道用戶界面主要關(guān)注人機界面中用戶向計算機輸入信息以及計算機對用護意圖理解的問題,它所要達到

23、的目標可歸納為如下方面:a.交互自然性,使用戶盡可能多地利用已有的日常技能與計算機交互,降低認識負荷;b. 交互高效性,使人機通訊信息交換吞吐量更大、形式更豐富,發(fā)揮人機彼此不同的認知潛力;c. 吸取已有人機交互技術(shù)的成果,與傳統(tǒng)的用戶界面特別是廣泛流行的WIMP/GUI兼容,使老用戶、專家用戶的知識和技能得以利用,不被淘汰。 我們認為,自然人機交互模式是以直接操縱為主的、與命令語言特別是自然語言共存的人機交互形式。理想的人機交互模式就是“用戶自由”。附錄資料:不需要的可以自行刪除 busybox詳解制作根文件系統(tǒng)詳解制作根文件系統(tǒng) 一、FHS(Filesystem Hierarchy Sta

24、ndard)標準介紹當我們在linux下輸入ls / 的時候,見到的目錄結(jié)構(gòu)以及這些目錄下的內(nèi)容都大同小異,這是因為所有的linux發(fā)行版在對根文件系統(tǒng)布局上都遵循FHS標準的建議規(guī)定。該標準規(guī)定了根目錄下各個子目錄的名稱及其存放的內(nèi)容:目錄名存放的內(nèi)容/bin必備的用戶命令,例如ls、cp等/sbin必備的系統(tǒng)管理員命令,例如ifconfig、reboot等/dev設(shè)備文件,例如mtdblock0、tty1等/etc系統(tǒng)配置文件,包括啟動文件,例如inittab等/lib必要的鏈接庫,例如C鏈接庫、內(nèi)核模塊/home普通用戶主目錄/rootroot用戶主目錄/usr/bin非必備的用戶程序,

25、例如find、du等/usr/sbin非必備的管理員程序,例如chroot、inetd等/usr/lib庫文件/var守護程序和工具程序所存放的可變,例如日志文件/proc用來提供內(nèi)核與進程信息的虛擬文件系統(tǒng),由內(nèi)核自動生成目錄下的內(nèi)容/sys用來提供內(nèi)核與設(shè)備信息的虛擬文件系統(tǒng),由內(nèi)核自動生成目錄下的內(nèi)容/mnt文件系統(tǒng)掛接點,用于臨時安裝文件系統(tǒng)/tmp臨時性的文件,重啟后將自動清除制作根文件系統(tǒng)就是要建立以上的目錄,并在其中建立完整目錄內(nèi)容。其過程大體包括:編譯安裝busybox,生成/bin、/sbin、/usr/bin、/usr/sbin目錄 利用交叉編譯工具鏈,構(gòu)建/lib目錄 手

26、工構(gòu)建/etc目錄 手工構(gòu)建最簡化的/dev目錄 創(chuàng)建其它空目錄 配置系統(tǒng)自動生成/proc目錄 利用udev構(gòu)建完整的/dev目錄 制作根文件系統(tǒng)的jffs2映像文件 下面就來詳細介紹這個過程。二、編譯安裝busybox,生成/bin、/sbin、/usr/bin、/usr/sbin目錄這些目錄下存儲的主要是常用命令的二進制文件。如果要自己編寫這幾百個常用命令的源程序,my god, 這簡直是一個噩夢!好在我們有嵌入式Linux系統(tǒng)的瑞士軍刀busybox,事情就簡單很多。1、從 HYPERLINK / / 下載busybox-1.7.0.tar.bz22、tar xjvf busybox-

27、1.7.0.tar.bz2解包3、修改Makefile文件175 ARCH ?= arm176 CROSS_COMPILE ?= arm-linux- 4、make menuconfig配置busyboxbusybox配置主要分兩部分。第一部分是Busybox Settings,主要編譯和安裝busybox的一些選項。這里主要需要配置:1)、Build Options - Build BusyBox as a static binary (no shared libs),表示編譯busybox時,是否靜態(tài)鏈接C庫。我們選擇動態(tài)鏈接C庫。2)、Installation Options - App

28、lets links (as soft-links) - (X) as soft-links,表示安裝busybox時,將各個命令安裝為指向busybox的軟鏈接還是硬鏈接。我們選擇軟鏈接。3)、Installation Options - (/work/nfs_root/fs_mini3) BusyBox installation prefix,表示busybox的安裝位置。我們選擇/work/nfs_root/fs_mini34)Busybox Library Tuning。保留Command line editing以支持命令行編輯;保留History size以支持記憶歷史命令;選中T

29、ab completion和Username completion以支持命令自動補全 第二部分是Applets,他將busybox的支持的幾百個命令分門別類。我們只要在各個門類下選擇想要的命令即可。這里我們基本保持默認設(shè)置。1)選中Networking Utilities - httpd下的Enable -u option,以啟用http服務器的功能allows the server to run as a specific user5、編譯busyboxmake6、安裝busyboxmake install安裝完成后,可以看到在/work/nfs_root/fs_mini3目錄下生成了bin

30、sbinusr/binusr/sbin目錄,其下包含了我們常用的命令,這些命令都是指向bin/busybox的軟鏈接,而busybox本身的大小不到800K:dennisdennis-desktop:/work/nfs_root/fs_mini3$ lsbin linuxrc sbin usrdennisdennis-desktop:/work/nfs_root/fs_mini3$ ls -l bintotal 740lrwxrwxrwx 1 dennis dennis 7 2010-04-03 23:57 addgroup - busyboxlrwxrwxrwx 1 dennis denni

31、s 7 2010-04-03 23:57 adduser - busyboxlrwxrwxrwx 1 dennis dennis 7 2010-04-03 23:57 ash - busybox-rwxr-xr-x 1 dennis dennis 749632 2010-04-03 23:57 busyboxlrwxrwxrwx 1 dennis dennis 7 2010-04-03 23:57 cat busybox 而普通PC機上的ls命令就有差不多80K的大?。?dennisdennis-desktop:/work/nfs_root/fs_mini3$ ls -l /bin/ls-rw

32、xr-xr-x 1 root root 78004 2007-09-29 20:51 /bin/ls busybox以它嬌小的身軀容納了數(shù)以百計的命令代碼,實在是讓人佩服不已,其不愧嵌入式系統(tǒng)瑞士軍刀之美譽。據(jù)說,busybox的作者身患絕癥,這更讓人欽佩GNU開源軟件的作者們。 三、利用交叉編譯工具鏈,構(gòu)建/lib目錄 光有應用程序(命令)是不夠的,因為應用程序本身需要使用C庫的庫函數(shù),因此還必需制作for ARM的C庫,并將其放置于/lib目錄。my god,要自己寫C庫的源代碼嗎?不用!還記得交叉編譯工具鏈的3個組成部分嗎?交叉編譯器、for ARM的C庫和二進制工具。哈哈,for AR

33、M的C庫是現(xiàn)成的,我們只需要拷貝過來就可以了。遺憾的是:整個C庫目錄下的文件總大小有26M。而我們根文件系統(tǒng)所在分區(qū)不過區(qū)區(qū)16M而已,根本放不下。怎么辦呢? dennisdennis-desktop:/work/nfs_root/fs_mini3$ du -s -si /work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib26M /work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib 需要C庫目錄下所有的文件嗎?no,absolutely no! 讓我們來分析一下glibc庫目錄下內(nèi)容的組成。該目錄下的子目錄和文

34、件共分8類: 目標文件,如crtn.o,用于gcc鏈接可執(zhí)行文件 libtool庫文件(.la),在鏈接庫文件時這些文件會被用到,比如他們列出了當前庫文件所依賴的其它庫文件,程序運行時無需這些文件 gconv目錄,里面是各種鏈接腳本,在編譯應用程序時,他們用于指定程序的運行地址,各段的位置等 靜態(tài)庫文件(.a),例如libm.a,libc.a 動態(tài)庫文件 (.so、.so.0-9*) 動態(tài)鏈接庫加載器ld-2.3.6.so、ld-linux.so.2 其它目錄及文件很顯然,第1、2、3、4、7類文件和目錄是不需要拷貝的。由于動態(tài)鏈接的應用程序本身并不含有它所調(diào)用的C庫函數(shù)的代碼,因此執(zhí)行時需要

35、動態(tài)鏈接庫加載器來為它加載相應的C庫文件,所以第6類文件是需要拷貝的。除此之外,第5類文件當然要拷貝。但第5類文件的大小也相當大。dennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ du -c -si *.so* 7.2M total 需要全部拷貝嗎?非也,非也!其實,需要哪些庫完全取決于要運行的應用程序使用了哪些庫函數(shù)。如果我們只制作最簡單的系統(tǒng),那么我們只需要運行busybox這一個應用程序即可。通過執(zhí)行 dennisdennis-desktop:/work/nfs_root/fs_mini3$ arm

36、-linux-readelf -a bin/busybox | grep Shared0 x00000001 (NEEDED) Shared library: libcrypt.so.10 x00000001 (NEEDED) Shared library: libm.so.60 x00000001 (NEEDED) Shared library: libc.so.6 可知:busybox只用到了3個庫:通用C庫(libc)、數(shù)學庫(libm)、加密庫(libcrypt),因此我們只需要拷貝這3個庫的庫文件即可。但是每個庫都有4個文件,4個文件都要拷貝嗎?當然不是。 dennisdennis-

37、desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ ls -l libcrypt.-*-rwxr-xr-x 1 dennis dennis 30700 2008-01-22 05:32 libcrypt-2.3.6.so-rw-r-r- 1 dennis dennis 23118 2008-01-22 05:32 libcrypt.alrwxrwxrwx 1 dennis dennis 13 2008-12-22 15:38 libcrypt.so - libcrypt.so.1lrwxrwxrwx 1 dennis dennis

38、17 2008-12-22 15:38 libcrypt.so.1 - libcrypt-2.3.6.sodennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ ls -l libm.-*-rwxr-xr-x 1 dennis dennis 779096 2008-01-22 05:31 libm-2.3.6.so-rw-r-r- 1 dennis dennis 1134282 2008-01-22 05:32 libm.alrwxrwxrwx 1 dennis dennis 9 2008-12-22 15:3

39、8 libm.so - libm.so.6lrwxrwxrwx 1 dennis dennis 13 2008-12-22 15:38 libm.so.6 - libm-2.3.6.sodennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ ls -l libc.-*-rwxr-xr-x 1 dennis dennis 1435660 2008-01-22 05:48 libc-2.3.6.so-rw-r-r- 1 dennis dennis 2768280 2008-01-22 05:31 libc.a-rw

40、-r-r- 1 dennis dennis 195 2008-01-22 05:34 libc.solrwxrwxrwx 1 dennis dennis 13 2008-12-22 15:38 libc.so.6 - libc-2.3.6.so 4個文件中的.a文件是靜態(tài)庫文件,是不需要拷貝的。另外3個文件是: 實際的共享鏈接庫:libLIBRARY_NAME-GLIBC_VERSION.so。當然需要拷貝。 主修訂版本的符號鏈接,指向?qū)嶋H的共享鏈接庫:libLIBRARY_NAME.so.MAJOR_REVISION_VERSION,程序一旦鏈接了特定的鏈接庫,將會參用該符號鏈接。程序啟動時

41、,加載器在加載程序前,會檢索該文件。所以需要拷貝。 與版本無關(guān)的符號鏈接,指向主修訂版本的符號連接(libc.so是唯一的例外,他是一個鏈接命令行:libLIBRARY_NAME.so,是為編譯程序時提供一個通用條目)。這些文件在程序被編譯時會被用到,但在程序運行時不會被用到,所以不必拷貝它。關(guān)于共享庫的2個符號鏈接的作用的特別說明:當我們使用gcc hello.c -o hello -lm編譯程序時,gcc會根據(jù)-lm的指示,加頭(lib)添尾(.so)得到libm.so,從而沿著與版本無關(guān)的符號鏈接(libm.so - libm.so.6)找到libm.so.6并記錄在案(hello的EL

42、F頭中),表示hello需要使用libm.so.6這個庫文件所代表的數(shù)學庫中的庫函數(shù)。而當hello被執(zhí)行的時候,動態(tài)鏈接庫加載器會從hello的ELF頭中找到libm.so.6這個記錄,然后沿著主修訂版本的符號鏈接(libm.so.6 - libm-2.3.6.so)找到實際的共享鏈接庫libm-2.3.6.so,從而將其與hello作動態(tài)鏈接??梢姡c版本無關(guān)的符號鏈接是供編譯器使用的,主修訂版本的符號鏈接是供動態(tài)鏈接庫加載器使用的,而實際的共享鏈接庫則是供應用程序使用的。通過以上分析,我們只需要拷貝3個庫(每個庫各1個主修訂版本的符號鏈接和1個實際的共享鏈接庫)以及動態(tài)鏈接庫加載器(1個

43、符號鏈接和1個實體文件)。步驟如下:dennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ mkdir /work/nfs_root/fs_mini3/lib dennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ cp libcrypt-* /work/nfs_root/fs_mini3/libdennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/li

44、b$ cp -l libcrypt.so.* /work/nfs_root/fs_mini3/libdennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ cp libm-* /work/nfs_root/fs_mini3/libdennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ cp -l libm.so.* /work/nfs_root/fs_mini3/libdennisdennis-desktop:/work/too

45、ls/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ cp libc-* /work/nfs_root/fs_mini3/libdennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ cp -l libc.so.* /work/nfs_root/fs_mini3/lib dennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ cp -l ld-* /work/nfs_root/fs_mini3/lib

46、四、手工構(gòu)建/etc目錄 /etc目錄存放的是系統(tǒng)程序的主配置文件,因此需要哪些配置文件取決于要運行哪些系統(tǒng)程序。即使最小的系統(tǒng)也一定會運行1號用戶進程init,所以我們至少要手工編寫init的主配置文件inittab。busybox的inittab文件的語法、語義與傳統(tǒng)的SYSV的inittab有所不同。 inittab文件中每個條目用來定義一個需要init啟動的子進程,并確定它的啟動方式,格式為:。例如:ttySAC0:askfirst:-/bin/sh 表示子進程要使用的控制臺,若省略則使用與init進程一樣的控制臺 表示運行級別,busybox init程序這個字段沒有意義 表示ini

47、t進程如何控制這個子進程 sysinit:系統(tǒng)啟動后最先執(zhí)行,只執(zhí)行一次,init進程等待它結(jié)束后才繼續(xù)執(zhí)行其它動作 wait:系統(tǒng)執(zhí)行完sysinit條目后執(zhí)行,只執(zhí)行一次,init進程等待它結(jié)束后才繼續(xù)執(zhí)行其它動作 once:系統(tǒng)執(zhí)行完wait條目后執(zhí)行,只執(zhí)行一次,init進程不等待它結(jié)束 respawn:啟動完once進程后,init進程監(jiān)測發(fā)現(xiàn)子進程退出時,重新啟動它 askfirst:啟動完respawn進程后,與respawn類似,不過init進程先輸出” Please press Enter to activate this console“,等用戶輸入回車后才啟動子進程 sh

48、utdown:當系統(tǒng)關(guān)機時 restart:Busybox中配置了CONFIG_FEATURE_USE_INITAB,并且init進程接收到SIGUP信號時執(zhí)行,先重新讀取、解析/etc/inittab文件,再執(zhí)行restart程序 ctrlaltdel:按下ctrl+alt+del鍵時執(zhí)行,不過在串口控制臺中無法輸入它 表示進程對應的二進制文件。如果前面有-號,表示該程序是“可以與用戶進行交互的”我們制作最簡單的/etc/inittab文件,其內(nèi)容如下::sysinit:/etc/init.d/rcS:askfirst:-/bin/sh:ctrlaltdel:/sbin/reboot:shu

49、tdown:/bin/umount -a r 制作最簡單的腳本程序文件/etc/init.d/rcS,其內(nèi)容如下: #!/bin/shifconfig eth0 7修改shell腳本文件/etc/init.d/rcS的權(quán)限,以使其可被執(zhí)行:# chmod a+x /etc/init.d/rcS五、手工構(gòu)建最簡化的/dev目錄 在linux機器上,執(zhí)行l(wèi)s /dev可看到幾百個設(shè)備文件,我需要手工創(chuàng)建它們嗎?maybe,我只需要手工創(chuàng)建幾個設(shè)備文件!我怎么知道我應該創(chuàng)建哪幾個設(shè)備文件呢?管它呢,先看看開發(fā)板上可愛的linux的反應再說。 啟動Linux操作系統(tǒng),顯示: VFS: Mounted

50、root (nfs filesystem).Freeing init memory: 112KWarning: unable to open an initial console. 這說明,內(nèi)核已經(jīng)成功掛載根文件系統(tǒng),但卻未能成功啟動第1個用戶進程init。通過錯誤消息“unable to open an initial console”搜索內(nèi)核源代碼,找到init/main.c文件。748 static int noinline init_post(void)749 750 free_initmem();751 unlock_kernel();752 mark_rodata_ro();753

51、 system_state = SYSTEM_RUNNING;754 numa_default_policy();755 756 if (sys_open(const char _user *) /dev/console, O_RDWR, 0) 0)757 printk(KERN_WARNING Warning: unable to open an initial console.n);758 759 (void) sys_dup(0);760 (void) sys_dup(0);761 762 if (ramdisk_execute_command) 763 run_init_process

52、(ramdisk_execute_command);764 printk(KERN_WARNING Failed to execute %sn,765 ramdisk_execute_command);766 767 768 /*769 * We try each of these until one succeeds.770 *771 * The Bourne shell can be used instead of init if we are772 * trying to recover a really broken machine.773 */774 if (execute_comm

53、and) 775 run_init_process(execute_command);776 printk(KERN_WARNING Failed to execute %s. Attempting 777 defaults.n, execute_command);778 779 run_init_process(/sbin/init);780 run_init_process(/etc/init);781 run_init_process(/bin/init);782 run_init_process(/bin/sh);783 784 panic(No init found. Try pas

54、sing init= option to kernel.);785 顯然,內(nèi)核錯誤是由175行不能打開/dev/console所致。通過查看已經(jīng)安裝好的linux機器的/dev/console設(shè)備文件,可知其是字符設(shè)備文件,主設(shè)備號為5,次設(shè)備號為1: dennisdennis-desktop:/work/nfs_root/fs_mini3/etc$ ls -l /dev/consolecrw- 1 root root 5, 1 2010-04-08 08:40 /dev/console 因此,我們使用下面的命令創(chuàng)建它: HYPERLINK mailto:dennisdennis-deskto

55、p:/work/nfs_root/fs_mini3/dev$ dennisdennis-desktop:/work/nfs_root/fs_mini3/dev$ sudo mknod console c 5 1 還需要創(chuàng)建其它設(shè)備文件嗎?只有天知道!再看看linux的反應。 VFS: Mounted root (nfs filesystem).Freeing init memory: 112Kinit: cant open /dev/null: No such file or directory 這次我們有經(jīng)驗了,如法炮制,創(chuàng)建/dev/null設(shè)備文件:dennisdennis-deskto

56、p:/work/nfs_root/fs_mini3/dev$ sudo mknod null c 1 3 再次重啟開發(fā)板上的linux,顯示 VFS: Mounted root (nfs filesystem).Freeing init memory: 112Kinit started: BusyBox v1.7.0 (2010-04-03 23:53:55 CST)starting pid 229, tty : /etc/init.d/rcS Please press Enter to activate this console.starting pid 231, tty : /bin/sh

57、# 哈哈,我們成功了,終于可以K歌去了。六、創(chuàng)建其它空目錄K完歌回來,繼續(xù)戰(zhàn)斗。dennisdennis-desktop:/work/nfs_root/fs_mini3$ mkdir home root proc sys tmp mnt var再次重啟動開發(fā)板上的linux。咦,似乎有些問題。VFS: Mounted root (nfs filesystem).Freeing init memory: 112Kinit started: BusyBox v1.7.0 (2010-04-03 23:53:55 CST)starting pid 229, tty : /etc/init.d/rcS Please press En

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論