日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 嵌入式 > 嵌入式軟件
[導(dǎo)讀]  目前嵌入式系統(tǒng)的應(yīng)用越來越廣泛,一臺(tái)通用PC的外部設(shè)備就有5~10個(gè)嵌入式微處理器,如鍵盤、軟驅(qū)、硬盤、顯示器、打印機(jī)、掃描儀、USB接口等均是由嵌入式處理器控制的。在制造工業(yè)、過程控制、通信電視、儀器儀表、汽車船舶、航空航天、消費(fèi)類產(chǎn)品均是嵌入式系統(tǒng)的應(yīng)用領(lǐng)域。嵌入式系統(tǒng)目前主要有:Windows CE、VxWorks、QNX等,它們都具較好的實(shí)時(shí)性,系統(tǒng)可靠性,任務(wù)處理隨機(jī)性等優(yōu)點(diǎn)。但是它們的價(jià)格普遍偏高,很多開發(fā)商承受不起。因而,Linux操作系統(tǒng)成為嵌入式操作系統(tǒng)的首選,原因如下:

引 言:

目前嵌入式系統(tǒng)的應(yīng)用越來越廣泛,一臺(tái)通用PC的外部設(shè)備就有5~10個(gè)嵌入式微處理器,如鍵盤、軟驅(qū)、硬盤、顯示器、打印機(jī)、掃描儀、USB接口等均是由嵌入式處理器控制的。在制造工業(yè)、過程控制、通信電視、儀器儀表、汽車船舶、航空航天、消費(fèi)類產(chǎn)品均是嵌入式系統(tǒng)的應(yīng)用領(lǐng)域。嵌入式系統(tǒng)目前主要有:Windows CE、VxWorks、QNX等,它們都具較好的實(shí)時(shí)性,系統(tǒng)可靠性,任務(wù)處理隨機(jī)性等優(yōu)點(diǎn)。但是它們的價(jià)格普遍偏高,很多開發(fā)商承受不起。因而,Linux操作系統(tǒng)成為嵌入式操作系統(tǒng)的首選,原因如下:

在精簡(jiǎn)內(nèi)核在編譯內(nèi)核之前,首先要明確需要那些驅(qū)動(dòng)和模塊,然后只選擇需要的驅(qū)動(dòng)和模塊,例如,如果系統(tǒng)不需要網(wǎng)絡(luò)支持,則可以去掉網(wǎng)絡(luò)模塊。內(nèi)核一般是以壓縮方式存放的,在系統(tǒng)啟動(dòng)時(shí)會(huì)自行解壓。內(nèi)核都是常駐內(nèi)存的,當(dāng)需要調(diào)用應(yīng)用程序時(shí),再把需要的程序從磁盤
調(diào)入內(nèi)存運(yùn)行。

構(gòu)建內(nèi)核常用的命令包括:

◆ make config:內(nèi)核配置,調(diào)用 ./scripts/Configure 按照 arch/i386/config.in 來進(jìn)行配置。

◆ make dep:尋找依賴關(guān)系。

◆ make clean:清除以前構(gòu)建內(nèi)核所產(chǎn)生的所有目標(biāo)文件、模塊文件、以及一些臨時(shí)文件等。

◆ make rmproper:刪除所有因構(gòu)建內(nèi)核過程中產(chǎn)生的所有文件,把內(nèi)核恢復(fù)到最原始的狀態(tài)。

◆ make:構(gòu)核,通過各目錄的Makefile 文件將會(huì)在各個(gè)目錄下產(chǎn)生許多目標(biāo)文件。如果內(nèi)核沒有錯(cuò)誤,將產(chǎn)生文件vmlinux,這就是構(gòu)建的內(nèi)核。

◆ make zImage:在make 的基礎(chǔ)上產(chǎn)生壓縮的內(nèi)核映象文件./arch/$(ARCH)/boot/zImage 以及在 ./arch/$(ARCH)/boot/compresed/目錄下產(chǎn)生臨時(shí)文件。

◆ make bzImage:在make 的基礎(chǔ)上產(chǎn)生壓縮比例更大的內(nèi)核映象文件./arch/$(ARCH)/boot/bzImage 以及在 ./arch/$(ARCH)/boot/compresed/目錄下產(chǎn)生臨時(shí)文件。

◆ make modules:編譯模塊文件,在make config 時(shí)所配置的所有模塊將在這時(shí)編譯,形成模塊目標(biāo)文件,并把這些目標(biāo)文件存放在modules 目錄中。

◆ make modules_install:把上面編譯好的模塊目標(biāo)文件放置在目錄 ./lib/modules/$KERNEL_VERSION/ 中。上面的編譯內(nèi)核是在沒有改變?cè)创a的情況下實(shí)現(xiàn)的,如果覺得源代碼提供的功能在某些方面不能滿足要求,就要修改源代碼了。源代碼中主要有以下幾個(gè)關(guān)鍵部分:有關(guān)進(jìn)程管理的task_struct 結(jié)構(gòu),這個(gè)結(jié)構(gòu)幾乎包括了與進(jìn)程有關(guān)的所有文件內(nèi)容,還有任務(wù)隊(duì)列、時(shí)鐘管理和中斷管理,各種進(jìn)程間的通信機(jī)制,內(nèi)存管理中各種內(nèi)存分配函數(shù)的實(shí)現(xiàn),虛擬文件系統(tǒng)。

系統(tǒng)啟動(dòng)

引導(dǎo)啟動(dòng)程序主要包括以下三個(gè)文件:bootsect.s,head.s和setup.s 這三個(gè)文件雖然都是匯編程序,但確使用了兩種語法格式。bootsect.s和setup.s 采用了近似于Intel的匯編語言語法,需要使用Intel 8086 匯編器和連接器 as86和ld86。head.s 則使用了GUN的匯編格式,并且運(yùn)行在保護(hù)模式下,需要用GUN的as 進(jìn)行編譯。這是一種AT&T語法的匯編語言格式。 Bootsect.s代碼時(shí)磁盤引導(dǎo)塊程序,駐留在磁盤的第一個(gè)扇區(qū)中,在PC機(jī)加電ROM-BIOS自檢后,引導(dǎo)扇區(qū)由BIOS加載到內(nèi)存0x7C00處,然后將自己移動(dòng)到內(nèi)存0x90000處。該程序的主要作用是首先將setup模塊(由setup.s編譯的)從磁盤加載到內(nèi)存緊接著bootsect的后面位置(0x90200),然后利用BIOS中斷0x13取磁盤參數(shù)表中當(dāng)前啟動(dòng)引導(dǎo)盤的參數(shù),接著在屏幕上顯示“Loading system...”字符串。再將system模塊從磁盤上加載到內(nèi)存0x10000開始的地方。隨后確定根文件系統(tǒng)的設(shè)備號(hào)。


Setup程序的作用主要是利用ROM-BIOS中斷讀取機(jī)器系統(tǒng)數(shù)據(jù),并將這些數(shù)據(jù)保存到0x90000開始的位置(覆蓋了bootsect程序所在的地方)。然后setup程序?qū)ystem模塊從0x10000整塊向下移動(dòng)到內(nèi)存絕對(duì)地址0x0000處,接下來加載中斷描述符表寄存器(idtr)和全局描述表寄存器(gdtr)。開啟A20地址線,重新設(shè)置兩個(gè)中斷控制芯片8259A,將硬件中斷號(hào)重新設(shè)置為0x20-0x2f。最后設(shè)置CPU的控制寄存器CR0(也稱機(jī)器狀態(tài)字),從而進(jìn)入32位保護(hù)模式進(jìn)行,并跳轉(zhuǎn)到位于system模塊最前面部分的head.s程序繼續(xù)運(yùn)行。 Head.s程序在被編譯后,會(huì)被連接成system模塊的最前面開始部分,即頭部(head)程序。從這里開始,內(nèi)核完全都是在保護(hù)模式下運(yùn)行了。這段程序?qū)嶋H上處于內(nèi)存絕對(duì)地址0處開始的地方。這個(gè)程序功能比較單一,首先是加載各個(gè)數(shù)據(jù)段寄存器,重新設(shè)置中斷描述符表idt,共256項(xiàng)。然后重新設(shè)置中斷描述符表gdt,接下來檢測(cè)A20地址線是不是開啟了,再檢測(cè)PC機(jī)是否含有數(shù)學(xué)協(xié)處理器芯片,然后設(shè)置管理內(nèi)存的分頁處理機(jī)制,最后利用返回指令將預(yù)先放置在堆棧中的/init/main.c程序的入口地址彈出,去運(yùn)行main()內(nèi)核初始化程序。

設(shè)備驅(qū)動(dòng)程序

設(shè)備驅(qū)動(dòng)程序在Linux內(nèi)核中扮演著特殊的角色,它們是一個(gè)個(gè)獨(dú)立的“黑盒子”,使某個(gè)特定的硬件響應(yīng)一個(gè)定義良好的內(nèi)部編程接口,同時(shí)完全隱藏了設(shè)備的工作細(xì)節(jié)。用戶操作通過一組標(biāo)準(zhǔn)化的調(diào)用完成,而這些調(diào)用是和特定的驅(qū)動(dòng)程序無關(guān)的。設(shè)備驅(qū)動(dòng)程序提供的功能是同外設(shè)進(jìn)行數(shù)據(jù)傳送。設(shè)備包括三種類型:字符設(shè)備、塊設(shè)備和網(wǎng)絡(luò)接口。每個(gè)模塊通常實(shí)現(xiàn)其中一種類型,相應(yīng)地,模塊可分為字符模塊(char module)、塊模塊(block module)和網(wǎng)絡(luò)模塊(network module)三種。然而這種分類方式并不是十分嚴(yán)格,程序員可以構(gòu)建一個(gè)大的模塊,在其中實(shí)現(xiàn)不同類型的設(shè)備驅(qū)動(dòng)程序。三種類型的設(shè)備如下:

字符模塊

字符設(shè)備是能夠象字節(jié)流(比如文件)一樣被訪問的設(shè)備,由字符設(shè)備驅(qū)動(dòng)程序來實(shí)現(xiàn)這種特性。字符設(shè)備驅(qū)動(dòng)程序通常至少需要實(shí)現(xiàn)open、close、read和write的系統(tǒng)調(diào)用。字符終端(dev/console)和串口(/dev/ttySO以及設(shè)備類型)就是字符設(shè)備的兩個(gè)例子,它們能夠用流抽象很好地表示。

塊設(shè)備

和字符設(shè)備一樣,塊設(shè)備也是通過/dev目錄下的文件系統(tǒng)節(jié)點(diǎn)被訪問的。塊設(shè)備(例如磁盤)上能夠容納文件系統(tǒng)。在大多數(shù)Unix系統(tǒng)中,塊設(shè)備包括整數(shù)個(gè)塊,而每塊包含1KB或2的幾次冪字節(jié)的數(shù)據(jù)。Linux允許應(yīng)用程序如字符設(shè)備那樣讀寫塊設(shè)備,可以一次傳遞任意多字節(jié)的數(shù)據(jù)。因而,塊設(shè)備和字符設(shè)備的區(qū)別僅僅在于內(nèi)核內(nèi)部管理數(shù)據(jù)的方式,也就是內(nèi)核和驅(qū)動(dòng)程序的接口不同。塊設(shè)備的接口必須支持掛裝(mount)文件系統(tǒng)。

網(wǎng)絡(luò)接口

任何網(wǎng)絡(luò)事務(wù)都要經(jīng)過一個(gè)網(wǎng)絡(luò)接口,即一個(gè)能夠和其它主機(jī)交換數(shù)據(jù)的設(shè)備。通常接口是個(gè)硬件設(shè)備,但也可能是個(gè)純軟件設(shè)備,比如回環(huán)(loopback)接口。網(wǎng)絡(luò)接口由內(nèi)核中的網(wǎng)絡(luò)子系統(tǒng)驅(qū)動(dòng),負(fù)責(zé)發(fā)送和接收數(shù)據(jù)包,它必須了解每項(xiàng)事務(wù)是如何映射到實(shí)際傳送的數(shù)據(jù)包的。盡管Telnet和FTP連接都是面向流的,它們都使用了同一個(gè)設(shè)備,但這個(gè)設(shè)備看到的只是數(shù)據(jù)包,而不是獨(dú)立的流。

在Linux里,除了直接修改系統(tǒng)內(nèi)核的源代碼,把設(shè)備驅(qū)動(dòng)程序加進(jìn)內(nèi)核以外,還可以把設(shè)備驅(qū)動(dòng)程序作為可加載的模塊,由系統(tǒng)管理員動(dòng)態(tài)的加載和卸載,使之成為內(nèi)核的一部分。Linux的模塊可以用C語言編寫,用gcc編譯成目標(biāo)文件(不進(jìn)行鏈接,作為*.o文件存在),為此需要在gcc命令行里加上-c的參數(shù)。由于在不鏈接時(shí),gcc只允許一個(gè)輸入文件,因此一個(gè)模塊的所有部分都必須在一個(gè)文件里實(shí)現(xiàn)。編譯好的模塊*.o放在 / lib / modules / xxxx/misc下(x
xxx表示內(nèi)核版本),然后用depmod -a使此模塊成為可加載模塊。模塊用insmod命令加載,用rmmod命令來卸載,并可以用lsmod命令來察看所有已經(jīng)加載的模塊的狀態(tài)。編寫模塊時(shí)必須提供兩個(gè)函數(shù),一個(gè)是init_module(void),供insmod在加載的時(shí)候自動(dòng)調(diào)用,負(fù)責(zé)進(jìn)行設(shè)備驅(qū)動(dòng)程序的初始化工作。Init_module返回0表示初始化成功,返回負(fù)數(shù)表示失敗。另一個(gè)函數(shù)是void cleanup_module(void),載模塊卸載時(shí)調(diào)用,負(fù)責(zé)進(jìn)行設(shè)備驅(qū)動(dòng)程序的清除工作。在成功的向系統(tǒng)注冊(cè)了設(shè)備驅(qū)動(dòng)程序后(調(diào)用register_chrdev成功后),就可以用mknod命令來把設(shè)備映射成一個(gè)特別文件,其它程序社用這個(gè)設(shè)備的時(shí)候,只要對(duì)此特別文件進(jìn)行操作就可以了。

結(jié) 語

本文主要論述了如何構(gòu)造嵌入式Linux系統(tǒng),設(shè)計(jì)和實(shí)現(xiàn)一個(gè)完整并且小巧使用的嵌入式Linux系統(tǒng)是一個(gè)非常復(fù)雜的過程。由于嵌入式Linux是由標(biāo)準(zhǔn)Linux裁減而來的,所以需要對(duì)Linux的內(nèi)核有深入的了解。本文所構(gòu)建的一個(gè)小型嵌入式Linux系統(tǒng),已成功運(yùn)用于S3C2410 。所欠缺的是構(gòu)建的內(nèi)核還不夠小,原因可能是存在一些不必要的硬件驅(qū)動(dòng)程序以及庫的裁減不夠理想導(dǎo)致的。今后的工作主要集中在對(duì)外設(shè)模塊和庫的裁減上,以及開發(fā)一些特定硬件的驅(qū)動(dòng)程序。 參考文獻(xiàn): 1 魏永明,駱剛,姜軍譯。Linux設(shè)備驅(qū)動(dòng)程序(第二版)。中國電力出版社,2002 2 趙炯著。Linux內(nèi)核完全注釋,2004 3 馮永紅,朱善君。裁剪Linux技術(shù)分析。2001嵌入式系統(tǒng)及單片機(jī)國際學(xué)術(shù)交流會(huì)論文集,2001 本文于2004年8月30日收到。劉新朝:研究生,研究方向?yàn)槲C(jī)控制。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

現(xiàn)代社會(huì)對(duì)計(jì)算能力的需求日益增長(zhǎng)。人工智能 (AI) 的飛速發(fā)展推動(dòng)了數(shù)據(jù)量的爆炸式增長(zhǎng),包括數(shù)據(jù)的創(chuàng)建、處理和存儲(chǔ)。AI已滲透到現(xiàn)代生活的方方面面,從汽車到購物方式無所不在。在工業(yè)領(lǐng)域,邊緣計(jì)算改變了制造業(yè),創(chuàng)造了一個(gè)...

關(guān)鍵字: 微處理器 電源 人工智能

CPU親和度通過限制進(jìn)程或線程可以運(yùn)行的CPU核心集合,使得它們只能在指定的CPU核心上執(zhí)行。這可以減少CPU緩存的失效次數(shù),提高緩存命中率,從而提升系統(tǒng)性能。

關(guān)鍵字: Linux 嵌入式

在Linux系統(tǒng)性能優(yōu)化中,內(nèi)存管理與網(wǎng)絡(luò)連接處理是兩大核心領(lǐng)域。vm.swappiness與net.core.somaxconn作為關(guān)鍵內(nèi)核參數(shù),直接影響系統(tǒng)在高負(fù)載場(chǎng)景下的穩(wěn)定性與響應(yīng)速度。本文通過實(shí)戰(zhàn)案例解析這兩個(gè)...

關(guān)鍵字: Linux 內(nèi)存管理

對(duì)于LLM,我使用b谷歌Gemini的免費(fèi)層,所以唯一的成本是n8n托管。在使用了n8n Cloud的免費(fèi)積分后,我決定將其托管在Railway上(5美元/月)。然而,由于n8n是開源的,您可以在自己的服務(wù)器上托管它,而...

關(guān)鍵字: 人工智能 n8n Linux

在Linux系統(tǒng)管理中,權(quán)限控制是安全運(yùn)維的核心。本文通過解析/etc/sudoers文件配置與組策略的深度應(yīng)用,結(jié)合某金融企業(yè)生產(chǎn)環(huán)境案例(成功攔截98.7%的非法提權(quán)嘗試),揭示精細(xì)化權(quán)限管理的關(guān)鍵技術(shù)點(diǎn),包括命令別...

關(guān)鍵字: Linux 用戶權(quán)限 sudoers文件

Linux內(nèi)核中的信號(hào)量(Semaphore)是一種用于資源管理的同步原語,它允許多個(gè)進(jìn)程或線程對(duì)共享資源進(jìn)行訪問控制。信號(hào)量的主要作用是限制對(duì)共享資源的并發(fā)訪問數(shù)量,從而防止系統(tǒng)過載和數(shù)據(jù)不一致的問題。

關(guān)鍵字: Linux 嵌入式

在云計(jì)算與容器化技術(shù)蓬勃發(fā)展的今天,Linux網(wǎng)絡(luò)命名空間(Network Namespace)已成為構(gòu)建輕量級(jí)虛擬網(wǎng)絡(luò)的核心組件。某頭部互聯(lián)網(wǎng)企業(yè)通過命名空間技術(shù)將測(cè)試環(huán)境資源消耗降低75%,故障隔離效率提升90%。本...

關(guān)鍵字: Linux 云計(jì)算

在Linux內(nèi)核4.18+和主流發(fā)行版(RHEL 8/Ubuntu 20.04+)全面轉(zhuǎn)向nftables的背景下,某電商平臺(tái)通過遷移將防火墻規(guī)則處理效率提升40%,延遲降低65%。本文基于真實(shí)生產(chǎn)環(huán)境案例,詳解從ipt...

關(guān)鍵字: nftables Linux

在Linux設(shè)備驅(qū)動(dòng)開發(fā)中,等待隊(duì)列(Wait Queue)是實(shí)現(xiàn)進(jìn)程睡眠與喚醒的核心機(jī)制,它允許進(jìn)程在資源不可用時(shí)主動(dòng)放棄CPU,進(jìn)入可中斷睡眠狀態(tài),待資源就緒后再被喚醒。本文通過C語言模型解析等待隊(duì)列的實(shí)現(xiàn)原理,結(jié)合...

關(guān)鍵字: 驅(qū)動(dòng)開發(fā) C語言 Linux

在Unix/Linux進(jìn)程間通信中,管道(pipe)因其簡(jiǎn)單高效被廣泛使用,但默認(rèn)的半雙工特性和無同步機(jī)制容易導(dǎo)致數(shù)據(jù)競(jìng)爭(zhēng)。本文通過父子進(jìn)程雙向通信案例,深入分析互斥鎖與狀態(tài)機(jī)在管道同步中的應(yīng)用,實(shí)現(xiàn)100%可靠的數(shù)據(jù)傳...

關(guān)鍵字: 管道通信 父子進(jìn)程 Linux
關(guān)閉