亚洲爆乳成AV人在线视菜奈实_欧美一进一出抽搐大尺度视频 _日本十八禁免费看污网站_国产一区二区怡红院_6080YY新视觉影院_蜜臀AV无码人妻精品_成人影院YY111111在线_成人欧美一区二区三区1314_少妇饥渴偷公乱A级无码

首頁 新聞 工控搜 論壇 廠商論壇 產(chǎn)品 方案 廠商 人才 文摘 下載 展覽
中華工控網(wǎng)首頁
  P L C | 變頻器與傳動 | 傳感器 | 現(xiàn)場檢測儀表 | 工控軟件 | 人機(jī)界面 | 運動控制
  D C S | 工業(yè)以太網(wǎng) | 現(xiàn)場總線 | 顯示調(diào)節(jié)儀表 | 數(shù)據(jù)采集 | 數(shù)傳測控 | 工業(yè)安全
  電 源 | 嵌入式系統(tǒng) | PC based | 機(jī)柜箱體殼體 | 低壓電器 | 機(jī)器視覺
uClinux系統(tǒng)分析
華恒公司
收藏本文     查看收藏
簡介<BR> Linux是一種很受歡迎的操作系統(tǒng),它與UNIX系統(tǒng)兼容,開放源代碼。它原本被設(shè)計為桌面系統(tǒng),現(xiàn)在廣泛應(yīng)用于服務(wù)器領(lǐng)域。而更大的影響在于它正逐漸的應(yīng)用于嵌入式設(shè)備。uClinux正是在這種氛圍下產(chǎn)生的。在uClinux這個英文單詞中u表示Micro,小的意思,C表示Control,控制的意思,所以uClinux就是Micro-Control-Linux,字面上的理解就是"針對微控制領(lǐng)域而設(shè)計的Linux系統(tǒng)"。</P><P> uClinux小型化的做法</P><P> 標(biāo)準(zhǔn)Linux可能采用的小型化方法<BR> 1. 重新編譯內(nèi)核<BR> Linux內(nèi)核采用模塊化的設(shè)計,即很多功能塊可以獨立的加上或卸下,開發(fā)人員在設(shè)計內(nèi)核時把這些內(nèi)核模塊作為可選的選項,可以在編譯系統(tǒng)內(nèi)核時指定。因此一種較通用的做法是對Linux內(nèi)核重新編譯,在編譯時仔細(xì)的選擇嵌入式設(shè)備所需要的功能支持模塊,同時刪除不需要的功能。通過對內(nèi)核的重新配置,可以使系統(tǒng)運行所需要的內(nèi)核顯著減小,從而縮減資源使用量。<BR> 2. 制作root文件系統(tǒng)映象<BR> Linux系統(tǒng)在啟動時必須加載根(root)文件系統(tǒng),因此剪裁系統(tǒng)同時包括root file system的剪裁。在x86系統(tǒng)下,Linux可以在Dos下,使用Loadlin文件加載啟動,<BR> uClinux采用的小型化方法<BR> 1.uClinux的內(nèi)核加載方式<BR> uClinux的內(nèi)核有兩種可選的運行方式:可以在flash上直接運行,也可以加載到內(nèi)存中運行。這種做法可以減少內(nèi)存需要。<BR> Flash運行方式:把內(nèi)核的可執(zhí)行映象燒寫到flash上,系統(tǒng)啟動時從flash的某個地址開始逐句執(zhí)行。這種方法實際上是很多嵌入式系統(tǒng)采用的方法。<BR> 內(nèi)核加載方式:把內(nèi)核的壓縮文件存放在flash上,系統(tǒng)啟動時讀取壓縮文件在內(nèi)存里解壓,然后開始執(zhí)行,這種方式相對復(fù)雜一些,但是運行速度可能更快(ram的存取速率要比flash高)。同時這也是標(biāo)準(zhǔn)Linux系統(tǒng)采用的啟動方式。<BR> 2.uClinux的根(root)文件系統(tǒng)<BR> uClinux系統(tǒng)采用romfs文件系統(tǒng),這種文件系統(tǒng)相對于一般的ext2文件系統(tǒng)要求更少的空間。空間的節(jié)約來自于兩個方面,首先內(nèi)核支持romfs文件系統(tǒng)比支持ext2文件系統(tǒng)需要更少的代碼,其次romfs文件系統(tǒng)相對簡單,在建立文件系統(tǒng)超級塊(superblock)需要更少的存儲空間。Romfs文件系統(tǒng)不支持動態(tài)擦寫保存,對于系統(tǒng)需要動態(tài)保存的數(shù)據(jù)采用虛擬ram盤的方法進(jìn)行處理(ram盤將采用ext2文件系統(tǒng))。<BR> 3.uClinux的應(yīng)用程序庫<BR> uClinux小型化的另一個做法是重寫了應(yīng)用程序庫,相對于越來越大且越來越全的glibc庫,uClibc對libc做了精簡。<BR> uClinux對用戶程序采用靜態(tài)連接的形式,這種做法會使應(yīng)用程序變大,但是基于內(nèi)存管理的問題,不得不這樣做(這將在下文對uClinux內(nèi)存管理展開分析時進(jìn)行說明),同時這種做法也更接近于通常嵌入式系統(tǒng)的做法。</P><P> uClinux的開發(fā)環(huán)境</P><P> GNU開發(fā)套件<BR> Gnu開發(fā)套件作為通用的Linux開放套件,包括一系列的開發(fā)調(diào)試工具。主要組件:<BR> Gcc: 編譯器,可以做成交叉編譯的形式,即在宿主機(jī)上開發(fā)編譯目標(biāo)上可運行的二進(jìn)制文件。<BR> Binutils:一些輔助工具,包括objdump(可以反編譯二進(jìn)制文件),as(匯編編譯器),ld(連接器)等等。<BR> Gdb:調(diào)試器,可使用多種交叉調(diào)試方式,gdb-bdm(背景調(diào)試工具),gdbserver(使用以太網(wǎng)絡(luò)調(diào)試)。<BR> uClinux的打印終端<BR> 通常情況下,uClinux的默認(rèn)終端是串口,內(nèi)核在啟動時所有的信息都打印到串口終端(使用printk函數(shù)打印),同時也可以通過串口終端與系統(tǒng)交互。<BR> uClinux在啟動時啟動了telnetd(遠(yuǎn)程登錄服務(wù)),操作者可以遠(yuǎn)程登錄上系統(tǒng),從而控制系統(tǒng)的運行。至于是否允許遠(yuǎn)程登錄可以通過燒寫romfs文件系統(tǒng)時有用戶決定是否啟動遠(yuǎn)程登錄服務(wù)。<BR> 交叉編譯調(diào)試工具<BR> 支持一種新的處理器,必須具備一些編譯,匯編工具,使用這些工具可以形成可運行于這種處理器的二進(jìn)制文件。對于內(nèi)核使用的編譯工具同應(yīng)用程序使用的有所不同。在解釋不同點之前,需要對gcc連接做一些說明: <BR> .ld(link description)文件:ld文件是指出連接時內(nèi)存映象格式的文件。<BR> crt0.S:應(yīng)用程序編譯連接時需要的啟動文件,主要是初始化應(yīng)用程序棧。<BR> pic:position independence code ,與位置無關(guān)的二進(jìn)制格式文件,在程序段中必須包括reloc段,從而使的代碼加載時可以進(jìn)行重新定位。<BR> 內(nèi)核編譯連接時,使用ucsimm.ld文件,形成可執(zhí)行文件映象,所形成的代碼段既可以使用間接尋址方式(即使用reloc段進(jìn)行尋址),也可以使用絕對尋址方式。這樣可以給編譯器更多的優(yōu)化空間。因為內(nèi)核可能使用絕對尋址,所以內(nèi)核加載到的內(nèi)存地址空間必須與ld文件中給定的內(nèi)存空間完全相同。 <BR> 應(yīng)用程序的連接與內(nèi)核連接方式不同。應(yīng)用程序由內(nèi)核加載(可執(zhí)行文件加載器將在后面討論),由于應(yīng)用程序的ld文件給出的內(nèi)存空間與應(yīng)用程序?qū)嶋H被加載的內(nèi)存位置可能不同,這樣在應(yīng)用程序加載的過程中需要一個重新地位的過程,即對reloc段進(jìn)行修正,使得程序進(jìn)行間接尋址時不至于出錯。(這個問題在i386等高級處理器上方法有所不同,本文將在后面進(jìn)一步分析)。<BR> 由上述討論,至少需要兩套編譯連接工具。在討論過uClinux的內(nèi)存管理后本文將給出整個系統(tǒng)的工作流程以及系統(tǒng)在flash和ram中的空間分布。<BR> 可執(zhí)行文件格式<BR> 先對一些名詞作一些說明: <BR> coff(common object file format):一種通用的對象文件格式<BR> elf(excutive linked file):一種為Linux系統(tǒng)所采用的通用文件格式,支持動態(tài)連接<BR> flat:elf格式有很大的文件頭,flat文件對文件頭和一些段信息做了簡化<BR> uClinux系統(tǒng)使用flat可執(zhí)行文件格式,gcc的編譯器不能直接形成這種文件格式,但是可以形成coff或elf格式的可執(zhí)行文件,這兩種文件需要coff2flt或elf2flt工具進(jìn)行格式轉(zhuǎn)化,形成flat文件。<BR> 當(dāng)用戶執(zhí)行一個應(yīng)用時,內(nèi)核的執(zhí)行文件加載器將對flat文件進(jìn)行進(jìn)一步處理,主要是對reloc段進(jìn)行修正(可執(zhí)行文件加載器的詳見fs/binfmt_flat.c)。以下對reloc段進(jìn)一步討論。<BR> 需要reloc段的根本原因是,程序在連接時連接器所假定的程序運行空間與實際程序加載到的內(nèi)存空間不同。假如有這樣一條指令:<BR> jsr app_start;<BR> 這一條指令采用直接尋址,跳轉(zhuǎn)到app_start地址處執(zhí)行,連接程序?qū)⒃诰幾g完成是計算出app_start的實際地址(設(shè)若實際地址為0x10000),這個實際地址是根據(jù)ld文件計算出來(因為連接器假定該程序?qū)⒈患虞d到由ld文件指明的內(nèi)存空間)。但實際上由于內(nèi)存分配的關(guān)系,操作系統(tǒng)在加載時無法保證程序?qū)磍d文件加載。這時如果程序仍然跳轉(zhuǎn)到絕對地址0x10000處執(zhí)行,通常情況這是不正確的。一個解決辦法是增加一個存儲空間,用于存儲app_start的實際地址,設(shè)若使用變量addr表示這個存儲空間。則以上這句程序?qū)⒏臑椋?lt;BR> movl addr, a0;<BR> jsr (a0);<BR> 增加的變量addr將在數(shù)據(jù)段中占用一個4字節(jié)的空間,連接器將app_start的絕對地址存儲到該變量。在可執(zhí)行文件加載時,可執(zhí)行文件加載器根據(jù)程序?qū)⒁虞d的內(nèi)存空間計算出app_start在內(nèi)存中的實際位置,寫入addr變量。系統(tǒng)在實際處理是不需要知道這個變量的確切存儲位置(也不可能知道),系統(tǒng)只要對整個reloc段進(jìn)行處理就可以了(reloc段有標(biāo)識,系統(tǒng)可以讀出來)。處理很簡單只需要對reloc段中存儲的值統(tǒng)一加上一個偏置(如果加載的空間比預(yù)想的要靠前,實際上是減去一個偏移量)。偏置由實際的物理地址起始值同ld文件指定的地址起始值相減計算出。<BR> 這種reloc的方式部分是由uClinux的內(nèi)存分配問題引起的,這一點將在uClinux內(nèi)存管理分析時說明。<BR> 針對實時性的解決方案<BR> uClinux本身并沒有關(guān)注實時問題,它并不是為了Linux的實時性而提出的。另外有一種Linux--Rt-linux關(guān)注實時問題。Rt-linux執(zhí)行管理器把普通Linux的內(nèi)核當(dāng)成一個任務(wù)運行,同時還管理了實時進(jìn)程。而非實時進(jìn)程則交給普通Linux內(nèi)核處理。這種方法已經(jīng)應(yīng)用于很多的操作系統(tǒng)用于增強操作系統(tǒng)的實時性,包括一些商用版UNIX系統(tǒng),Windows NT等等。這種方法優(yōu)點之一是實現(xiàn)簡單,且實時性能容易檢驗。優(yōu)點之二是由于非實時進(jìn)程運行于標(biāo)準(zhǔn)Linux系統(tǒng),同其它Linux商用版本之間保持了很大的兼容性。優(yōu)點之三是可以支持硬實時時鐘的應(yīng)用。uClinux可以使用Rt-linux的patch,從而增強uClinux的實時性,使得uClinux可以應(yīng)用于工業(yè)控制、進(jìn)程控制等一些實時要求較高的應(yīng)用。</P><P> <BR> uClinux的內(nèi)存管理<BR> 應(yīng)該說uClinux同標(biāo)準(zhǔn)Linux的最大區(qū)別就在于內(nèi)存管理,同時也由于uClinux的內(nèi)存管理引發(fā)了一些標(biāo)準(zhǔn)Linux所不會出現(xiàn)的問題。本文將把uClinux內(nèi)存管理同標(biāo)準(zhǔn)Linux的那內(nèi)存管理部分進(jìn)行比較分析。<BR> 標(biāo)準(zhǔn)Linux使用的虛擬存儲器技術(shù)<BR> 標(biāo)準(zhǔn)Linux使用虛擬存儲器技術(shù),這種技術(shù)用于提供比計算機(jī)系統(tǒng)中實際使用的物理內(nèi)存大得多的內(nèi)存空間。使用者將感覺到好像程序可以使用非常大的內(nèi)存空間,從而使得編程人員在寫程序時不用考慮計算機(jī)中的物理內(nèi)存的實際容量。</P><P> 為了支持虛擬存儲管理器的管理,Linux系統(tǒng)采用分頁(paging)的方式來載入進(jìn)程。所謂分頁既是把實際的存儲器分割為相同大小的段,例如每個段1024個字節(jié),這樣1024個字節(jié)大小的段便稱為一個頁面(page)。 <BR> 虛擬存儲器由存儲器管理機(jī)制及一個大容量的快速硬盤存儲器支持。它的實現(xiàn)基于局部性原理,當(dāng)一個程序在運行之前,沒有必要全部裝入內(nèi)存,而是僅將那些當(dāng)前要運行的那些部分頁面或段裝入內(nèi)存運行(copy-on-write),其余暫時留在硬盤上程序運行時如果它所要訪問的頁(段)已存在,則程序繼續(xù)運行,如果發(fā)現(xiàn)不存在的頁(段),操作系統(tǒng)將產(chǎn)生一個頁錯誤(page fault),這個錯誤導(dǎo)致操作系統(tǒng)把需要運行的部分加載到內(nèi)存中。必要時操作系統(tǒng)還可以把不需要的內(nèi)存頁(段)交換到磁盤上。利用這樣的方式管理存儲器,便可把一個進(jìn)程所需要用到的存儲器以化整為零的方式,視需求分批載入,而核心程序則憑借屬于每個頁面的頁碼來完成尋址各個存儲器區(qū)段的工作。<BR> 標(biāo)準(zhǔn)Linux是針對有內(nèi)存管理單元的處理器設(shè)計的。在這種處理器上,虛擬地址被送到內(nèi)存管理單元(MMU),把虛擬地址映射為物理地址。<BR> 通過賦予每個任務(wù)不同的虛擬--物理地址轉(zhuǎn)換映射,支持不同任務(wù)之間的保護(hù)。地址轉(zhuǎn)換函數(shù)在每一個任務(wù)中定義,在一個任務(wù)中的虛擬地址空間映射到物理內(nèi)存的一個部分,而另一個任務(wù)的虛擬地址空間映射到物理存儲器中的另外區(qū)域。計算機(jī)的存儲管理單元(MMU)一般有一組寄存器來標(biāo)識當(dāng)前運行的進(jìn)程的轉(zhuǎn)換表。在當(dāng)前進(jìn)程將CPU放棄給另一個進(jìn)程時(一次上下文切換),內(nèi)核通過指向新進(jìn)程地址轉(zhuǎn)換表的指針加載這些寄存器。MMU寄存器是有特權(quán)的,只能在內(nèi)核態(tài)才能訪問。這就保證了一個進(jìn)程只能訪問自己用戶空間內(nèi)的地址,而不會訪問和修改其它進(jìn)程的空間。當(dāng)可執(zhí)行文件被加載時,加載器根據(jù)缺省的ld文件,把程序加載到虛擬內(nèi)存的一個空間,因為這個原因?qū)嶋H上很多程序的虛擬地址空間是相同的,但是由于轉(zhuǎn)換函數(shù)不同,所以實際所處的內(nèi)存區(qū)域也不同。而對于多進(jìn)程管理當(dāng)處理器進(jìn)行進(jìn)程切換并執(zhí)行一個新任務(wù)時,一個重要部分就是為新任務(wù)切換任務(wù)轉(zhuǎn)換表。我們可以看到Linux系統(tǒng)的內(nèi)存管理至少實現(xiàn)了以下功能:<BR> 運行比內(nèi)存還要大的程序。理想情況下應(yīng)該可以運行任意大小的程序<BR> ◇可以運行只加載了部分的程序,縮短了程序啟動的時間<BR> ◇可以使多個程序同時駐留在內(nèi)存中提高CPU的利用率<BR> ◇可以運行重定位程序。即程序可以方于內(nèi)存中的任何一處,而且可以在執(zhí)行過程中移動。<BR> ◇寫機(jī)器無關(guān)的代碼。程序不必事先約定機(jī)器的配置情況。<BR> ◇減輕程序員分配和管理內(nèi)存資源的負(fù)擔(dān)。<BR> ◇可以進(jìn)行共享--例如,如果兩個進(jìn)程運行同一個程序,它們應(yīng)該可以共享程序代碼的同一個副本。<BR> ◇提供內(nèi)存保護(hù),進(jìn)程不能以非授權(quán)方式訪問或修改頁面,內(nèi)核保護(hù)單個進(jìn)程的數(shù)據(jù)和代碼以防止其它進(jìn)程修改它們。否則,用戶程序可能會偶然(或惡意)的破壞內(nèi)核或其它用戶程序。 <BR> 虛存系統(tǒng)并不是沒有代價的。內(nèi)存管理需要地址轉(zhuǎn)換表和其他一些數(shù)據(jù)結(jié)構(gòu),留給程序的內(nèi)存減少了。地址轉(zhuǎn)換增加了每一條指令的執(zhí)行時間,而對于有額外內(nèi)存操作的指令會更嚴(yán)重。當(dāng)進(jìn)程訪問不在內(nèi)存的頁面時,系統(tǒng)發(fā)生失效。系統(tǒng)處理該失效,并將頁面加載到內(nèi)存中,這需要極耗時間的磁盤I/O操作。總之內(nèi)存管理活動占用了相當(dāng)一部分cpu時間(在較忙的系統(tǒng)中大約占10%)。<BR> uClinux針對NOMMU的特殊處理<BR> 對于uClinux來說,其設(shè)計針對沒有MMU的處理器,即uClinux不能使用處理器的虛擬內(nèi)存管理技術(shù)(應(yīng)該說這種不帶有MMU的處理器在嵌入式設(shè)備中相當(dāng)普偏)。uClinux仍然采用存儲器的分頁管理,系統(tǒng)在啟動時把實際存儲器進(jìn)行分頁。在加載應(yīng)用程序時程序分頁加載。但是由于沒有MMU管理,所以實際上uClinux采用實存儲器管理策略(real memeory management)。這一點影響了系統(tǒng)工作的很多方面。<BR> uClinux系統(tǒng)對于內(nèi)存的訪問是直接的,(它對地址的訪問不需要經(jīng)過MMU,而是直接送到地址線上輸出),所有程序中訪問的地址都是實際的物理地址。操作系統(tǒng)對內(nèi)存空間沒有保護(hù)(這實際上是很多嵌入式系統(tǒng)的特點),各個進(jìn)程實際上共享一個運行空間(沒有獨立的地址轉(zhuǎn)換表)。 <BR> 一個進(jìn)程在執(zhí)行前,系統(tǒng)必須為進(jìn)程分配足夠的連續(xù)地址空間,然后全部載入主存儲器的連續(xù)空間中。與之相對應(yīng)的是標(biāo)準(zhǔn)Linux系統(tǒng)在分配內(nèi)存時沒有必要保證實際物理存儲空間是連續(xù)的,而只要保證虛存地址空間連續(xù)就可以了。另外一個方面程序加載地址與預(yù)期(ld文件中指出的)通常都不相同,這樣relocation過程就是必須的。此外磁盤交換空間也是無法使用的,系統(tǒng)執(zhí)行時如果缺少內(nèi)存將無法通過磁盤交換來得到改善。<BR> uClinux對內(nèi)存的管理減少同時就給開發(fā)人員提出了更高的要求。如果從易用性這一點來說,uClinux的內(nèi)存管理是一種倒退,退回了到了UNIX早期或是Dos系統(tǒng)時代。開發(fā)人員不得不參與系統(tǒng)的內(nèi)存管理。從編譯內(nèi)核開始,開發(fā)人員必須告訴系統(tǒng)這塊開發(fā)板到底擁有多少的內(nèi)存(假如你欺騙了系統(tǒng),那將在后面運行程序時受到懲罰),從而系統(tǒng)將在啟動的初始化階段對內(nèi)存進(jìn)行分頁,并且標(biāo)記已使用的和未使用的內(nèi)存。系統(tǒng)將在運行應(yīng)用時使用這些分頁內(nèi)存。<BR> 由于應(yīng)用程序加載時必須分配連續(xù)的地址空間,而針對不同硬件平臺的可一次成塊(連續(xù)地址)分配內(nèi)存大小限制是不同(目前針對ez328處理器的uClinux是128k,而針對coldfire處理器的系統(tǒng)內(nèi)存則無此限制),所以開發(fā)人員在開發(fā)應(yīng)用程序時必須考慮內(nèi)存的分配情況并關(guān)注應(yīng)用程序需要運行空間的大小。另外由于采用實存儲器管理策略,用戶程序同內(nèi)核以及其它用戶程序在一個地址空間,程序開發(fā)時要保證不侵犯其它程序的地址空間,以使得程序不至于破壞系統(tǒng)的正常工作,或?qū)е缕渌绦虻倪\行異常。<BR> 從內(nèi)存的訪問角度來看,開發(fā)人員的權(quán)利增大了(開發(fā)人員在編程時可以訪問任意的地址空間),但與此同時系統(tǒng)的安全性也大為下降。此外,系統(tǒng)對多進(jìn)程的管理將有很大的變化,這一點將在uClinux的多進(jìn)程管理中說明。<BR> 雖然uClinux的內(nèi)存管理與標(biāo)準(zhǔn)Linux系統(tǒng)相比功能相差很多,但應(yīng)該說這是嵌入式設(shè)備的選擇。在嵌入式設(shè)備中,由于成本等敏感因素的影響,普偏的采用不帶有MMU的處理器,這決定了系統(tǒng)沒有足夠的硬件支持實現(xiàn)虛擬存儲管理技術(shù)。從嵌入式設(shè)備實現(xiàn)的功能來看,嵌入式設(shè)備通常在某一特定的環(huán)境下運行,只要實現(xiàn)特定的功能,其功能相對簡單,內(nèi)存管理的要求完全可以由開發(fā)人員考慮。<BR> 標(biāo)準(zhǔn)Linux系統(tǒng)的進(jìn)程、線程<BR> 進(jìn)程:進(jìn)程是一個運行程序并為其提供執(zhí)行環(huán)境的實體,它包括一個地址空間和至少一個控制點,進(jìn)程在這個地址空間上執(zhí)行單一指令序列。進(jìn)程地址空間包括可以訪問或引用的內(nèi)存單元的集合,進(jìn)程控制點通過一個一般稱為程序計數(shù)器(program counter,PC)的硬件寄存器控制和跟蹤進(jìn)程指令序列。<BR> fork:由于進(jìn)程為執(zhí)行程序的環(huán)境,因此在執(zhí)行程序前必須先建立這個能"跑"程序的環(huán)境。Linux系統(tǒng)提供系統(tǒng)調(diào)用拷貝現(xiàn)行進(jìn)程的內(nèi)容,以產(chǎn)生新的進(jìn)程,調(diào)用fork的進(jìn)程稱為父進(jìn)程;而所產(chǎn)生的新進(jìn)程則稱為子進(jìn)程。子進(jìn)程會承襲父進(jìn)程的一切特性,但是它有自己的數(shù)據(jù)段,也就是說,盡管子進(jìn)程改變了所屬的變量,卻不會影響到父進(jìn)程的變量值。<BR> 父進(jìn)程和子進(jìn)程共享一個程序段,但是各自擁有自己的堆棧、數(shù)據(jù)段、用戶空間以及進(jìn)程控制塊。換言之,兩個進(jìn)程執(zhí)行的程序代碼是一樣的,但是各有各的程序計數(shù)器與自己的私人數(shù)據(jù)。 <BR> 當(dāng)內(nèi)核收到fork請求時,它會先查核三件事:首先檢查存儲器是不是足夠;其次是進(jìn)程表是否仍有空缺;最后則是看看用戶是否建立了太多的子進(jìn)程。如果上述說三個條件滿足,那么操作系統(tǒng)會給子進(jìn)程一個進(jìn)程識別碼,并且設(shè)定cpu時間,接著設(shè)定與父進(jìn)程共享的段,同時將父進(jìn)程的inode拷貝一份給子進(jìn)程運用,最終子進(jìn)程會返回數(shù)值0以表示它是子進(jìn)程,至于父進(jìn)程,它可能等待子進(jìn)程的執(zhí)行結(jié)束,或與子進(jìn)程各做個的。<BR> exec系統(tǒng)調(diào)用:該系統(tǒng)調(diào)用提供一個進(jìn)程去執(zhí)行另一個進(jìn)程的能力,exec系統(tǒng)調(diào)用是采用覆蓋舊有進(jìn)程存儲器內(nèi)容的方式,所以原來程序的堆棧、數(shù)據(jù)段與程序段都會被修改,只有用戶區(qū)維持不變。<BR> vfork系統(tǒng)調(diào)用:由于在使用fork時,內(nèi)核會將父進(jìn)程拷貝一份給子進(jìn)程,但是這樣的做法相當(dāng)浪費時間,因為大多數(shù)的情形都是程序在調(diào)用fork后就立即調(diào)用exec,這樣剛拷貝來的進(jìn)程區(qū)域又立即被新的數(shù)據(jù)覆蓋掉。因此Linux系統(tǒng)提供一個系統(tǒng)調(diào)用vfork,vfork假定系統(tǒng)在調(diào)用完成vfork后會馬上執(zhí)行exec,因此vfork不拷貝父進(jìn)程的頁面,只是初始化私有的數(shù)據(jù)結(jié)構(gòu)與準(zhǔn)備足夠的分頁表。這樣實際在vfork調(diào)用完成后父子進(jìn)程事實上共享同一塊存儲器(在子進(jìn)程調(diào)用exec或是exit之前),因此子進(jìn)程可以更改父進(jìn)程的數(shù)據(jù)及堆棧信息,因此vfork系統(tǒng)調(diào)用完成后,父進(jìn)程進(jìn)入睡眠,直到子進(jìn)程執(zhí)行exec。當(dāng)子進(jìn)程執(zhí)行exec時,由于exec要使用被執(zhí)行程序的數(shù)據(jù),代碼覆蓋子進(jìn)程的存儲區(qū)域,這樣將產(chǎn)生寫保護(hù)錯誤(do_wp_page)(這個時候子進(jìn)程寫的實際上是父進(jìn)程的存儲區(qū)域),<BR> 這個錯誤導(dǎo)致內(nèi)核為子進(jìn)程重新分配存儲空間。當(dāng)子進(jìn)程正確開始執(zhí)行后,將喚醒父進(jìn)程,使得父進(jìn)程繼續(xù)往后執(zhí)行。<BR> uClinux的多進(jìn)程處理<BR> uClinux沒有mmu管理存儲器,在實現(xiàn)多個進(jìn)程時(fork調(diào)用生成子進(jìn)程)需要實現(xiàn)數(shù)據(jù)保護(hù)。<BR> uClinux的fork和vfork:uClinux的fork等于vfork。實際上uClinux的多進(jìn)程管理通過vfork來實現(xiàn)。這意味著uClinux系統(tǒng)fork調(diào)用完程后,要么子進(jìn)程代替父進(jìn)程執(zhí)行(此時父進(jìn)程已經(jīng)sleep)直到子進(jìn)程調(diào)用exit退出,要么調(diào)用exec執(zhí)行一個新的進(jìn)程,這個時候?qū)a(chǎn)生可執(zhí)行文件的加載,即使這個進(jìn)程只是父進(jìn)程的拷貝,這個過程也不能避免。當(dāng)子進(jìn)程執(zhí)行exit或exec后,子進(jìn)程使用wakeup把父進(jìn)程喚醒,父進(jìn)程繼續(xù)往下執(zhí)行。<BR> uClinux的這種多進(jìn)程實現(xiàn)機(jī)制同它的內(nèi)存管理緊密相關(guān)。uClinux針對nommu處理器開發(fā),所以被迫使用一種flat方式的內(nèi)存管理模式,啟動新的應(yīng)用程序時系統(tǒng)必須為應(yīng)用程序分配存儲空間,并立即把應(yīng)用程序加載到內(nèi)存。缺少了MMU的內(nèi)存重映射機(jī)制,uClinux必須在可執(zhí)行文件加載階段對可執(zhí)行文件reloc處理,使得程序執(zhí)行時能夠直接使用物理內(nèi)存。</P><P> ----華恒公司
 

狀 態(tài): 離線

公司簡介
產(chǎn)品目錄

公司名稱: 華恒公司
聯(lián) 系 人: 市場部
電  話: 0551-5325652
傳  真: 0551-5325323
地  址: 合肥市長江西路669 號高新技術(shù)產(chǎn)業(yè)開發(fā)區(qū)軟件園四號樓204-206華恒科技
郵  編: 230088
主  頁:
 
該廠商相關(guān)技術(shù)文摘:
華恒COLDFIRE系列嵌入式LINUX開發(fā)套件常見問題解答
嵌入式LINUX簡介
更多文摘...
立即發(fā)送詢問信息在線聯(lián)系該技術(shù)文摘廠商:
用戶名: 密碼: 免費注冊為中華工控網(wǎng)會員
請留下您的有效聯(lián)系方式,以方便我們及時與您聯(lián)絡(luò)

關(guān)于我們 | 聯(lián)系我們 | 廣告服務(wù) | 本站動態(tài) | 友情鏈接 | 法律聲明 | 不良信息舉報
工控網(wǎng)客服熱線:0755-86369299
版權(quán)所有 中華工控網(wǎng) Copyright©2022 Gkong.com, All Rights Reserved

宝贝儿感受到它对你的爱了吗小说| 色WWW亚洲国产阿娇| 日本护士毛茸茸高潮| 日韩无码视频二区| 偷看娇妻在别人胯下沦陷小说| 午夜A级理论片在线播放琪琪| 亚洲AV无码麻豆一区二区三区 | 久久久久无码专区亚洲AV| 老熟妇高潮一区二区高清视频| 男人用嘴添女人下身免费视频| 欧美性猛烈XXXX极品少妇| 日本一区二区三区免费播放| 天美传媒国产电视推荐| 亚洲AV成人噜噜无码网站| 亚洲大肥女ASS硕大| 夜夜爽夜夜叫夜夜高潮| 91人妻中文字幕在线精品| 宝贝你的奶好大我想吃| 国产白嫩护士在线播放| 国内美女推油按摩在线播放| 久久国产高潮流白浆免费观看| 麻豆一区二区在我观看| 欧美日韩一区二区三区人妻 | 嫩草在线视频WWW免费看| 翘臀后进呻吟喷水的少妇| 色欲综合久久躁天天躁蜜桃| 无码专区HEYZO色欲AV| 亚洲国产AV玩弄放荡人妇| 一女大战七个黑人到喷浆| AV天堂亚洲国产AV| 粉嫩Av网站在线观看| 国产女人水真多18毛片18精品| 精品亚洲AV无码喷奶水A漫画| 美女又黄又免费的视频| 人人妻人人澡人人| 无码精品人妻一区二区三区人妻斩 | 色综合色综合久久综合频道88 | 看AV免费毛片手机播放| 欧洲熟妇色XXXX欧美老妇性| 天美传媒国产电视推荐| 亚洲国产成人VA在线观看| 在线天堂资源WWW在线中文| となりの家のネツト在线| 国产成人精品午夜福利在线播放| 好大好爽舔我高潮了| 老熟妇乱子伦牲交视频| 青草久久久国产线免费| 天堂√在线中文官网在线| 亚洲国产A∨无码中文777| 在线|国产精品女主播阳台| 爱情岛网站亚洲禁18进入| 国产精品久久久久9999赢消| 精品卡一卡二卡3卡高清乱码| 男女性杂交内射妇女BBWXZ| 日韩精品久久久久久免费| 亚洲AV成人片无码色欲AV自慰| 影音先锋成人无码影院| 扒开女人P添大荫蒂| 国产精品无码无在线观看| 久久久久高潮毛片免费全部播放| 欧美日韩无线码在线观看| 玩小雪跪趴把腿分到最大影视频| 亚洲欧美日韩综合久久| 99RE6在线视频精品免费下载| 妇女被深耕过后的变化| 激情内射人妻1区2区3区| 免费看男阳茎进女阳道动态图| 色狠狠熟女AV一区二区三区| 亚洲AV无码之国产精品| 中文字幕乱偷无码AV先锋蜜桃| 初尝禁果稚嫩宫交H| 黑人大鸡吧操逼日本女人| 免费无码一区二区三区蜜桃| 色噜噜狠狠色综合网| 亚洲成A人片在线观看无码不卡| 18VIDEOSEX性欧美| 国产AⅤ无码专区亚洲AV综合网 | 日本又黄又爽又色又刺激的视频| 亚洲AV福利天堂在线观看| 制服在线无码专区| 丰满少妇被猛烈高清播放| 精品乱人伦一区二区三区| 欧美日韩精品人妻一区二区三区| 无遮挡国产高潮视频免费观看| 婬乱丰满熟妇XXXXX性| 成人午夜亚洲精品无码区| 黑人异族巨大巨大巨粗| 女人18片毛片免费| 无码精品人妻一区二区三区ap| 一本大道香蕉大无线吗| 成熟丰满熟妇高潮XXXX| 精品国产一区AV天美传媒| 欧洲码和亚洲码的尺码区别| 新婚少妇下面真紧| 中文字幕亚洲无线码在线一区| 国产边做饭边被躁在线播放91 | 黑料吃瓜网998.SU永久有效| 女人18毛片A级毛片嫰阝| 无码视频免费一区二三区| 在线看片无码永久AV| 高清乱码一区二区三区| 久久精品久久久久久噜噜| 日产精品高潮呻吟AV久久| 亚洲国产无套无码AV电影| MM131美女大尺度私密照尤果| 国产在线精品一区二区高清不卡| 内射干少妇亚洲69XXX| 无码午夜福利视频一区| 中文字幕AV无码人妻| 国产成人一区二区三区免费| 老赵抱着月月在厨房做视频| 手机在线观看AV片| 野花日本韩国大全免费观看6| 出轨 无码 论坛| 久久九九日本韩国精品| 日文中文字幕乱码一二三区别| 亚洲熟妇av一区二区三区浪潮| 成·人免费午夜无码不卡| 精品无码国产一区二区三区麻豆 | 夜夜未满十八勿进的爽爽影院 | 八戒午夜理论片影院| 狠狠躁夜夜躁人人爽天天不| 琪琪午夜成人理论福利片美容院| 亚洲AV伊人久久青青草原| SEERX性欧美| 精品国产A∨无码一区二区三区| 人妻无码全彩里番ACG视频| 亚洲精品成人无码| 成人午夜亚洲精品无码区| 久久久久久精品免费不卡| 试看120秒男女啪啪免费| 永久免费AV无码网站韩国毛片| 国产成人欧美一区二区三区 | 天堂中文在线最新版| 中国性猛交ⅩXXX免费看| 国产精品美女久久久| 女狠狠噜天天噜日日噜| 亚洲AV少妇高潮30p| ンピースのエロス在线WWW| 精品国产乱码久久久久久1区2区| 日产精品高潮呻吟AV久久| 野花高清在线观看免费官网中文版| 国产AV夜夜欢一区二区三区| 妹妹中考前让我C了1次| 午夜免费无码福利视频| FREESEX性中国熟妇| 精品久久久久久久久久久AⅤ| 日韩一区二区在线视频| 一区二区三区AV在线| 国产精品久久久久久久网 | 久久人妻AV无码中文专区| 天天躁日日躁AAAAXXXX| 24小时日本免费观看WWW| 国内精品九九久久精品| 日本丰满熟妇乱XXXXX软件 | 尺码最大的国产SUV| 久久亚洲欧美国产精品| 午夜亚洲AV日韩AV无码大全| PYTHON人马大战| 久久久久精品少妇9999| 婷婷国产三区四区| 999在线视频精品免费播放观看 | 一区二区三区在线 | 欧| 国产精品美女WWW爽爽爽视频| 欧美一区二区三区啪啪| 亚洲精品无码永久在线观看你懂的| 动漫高H纯肉无码视频在线观看| 美女裸体十八禁免费网站 | 我妈妈的朋友8在完整有限中字木| 99国产精品99久久久久久| 精品国产免费人成网站| 十八款夜间禁用APP| 94久久国产乱子伦精品免费 | 人妻无码一区二区三区蜜桃| 亚洲中文字幕无码不卡电影| 国产精品视频色拍拍| 亲近相奷对白中文字幕片| 一本岛V免费不卡一二三区| 国产麻豆天美果冻无码视频| 人妻聚色窝窝人体www一区91| 夜夜躁日日躁狠狠久久AV| 国产日产欧产美韩系列| 日本中文字幕一区二区有码在线 | 欧美熟妇激情一区二区三区| 亚洲午夜精品久久久久久APP| 国产精品日本一区二区不卡视频| 全黄H全肉边做边吃奶视频| 一进一出一爽又粗又大| 国产亲子伦ⅩⅩⅩⅩX熟妇| 日本熟妇XXXX| 中文字幕热久久久久久久| 经典WC偷窥美女如厕MP4| 天堂AV无码大芭蕉伊人AV孕妇| GAY2022空少被体育生暴菊| 久久久久亚洲国产AV麻豆| 亚洲 暴爽 AV人人爽日日碰| 粗大的内捧猛烈进出动态图| 浓精喷进老师黑色丝袜| 亚洲无人区码二码三码区别图| 国产人与Z0XXⅩⅩ另类|