版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第第7章章嵌入式嵌入式Linux操作系統(tǒng)的移植操作系統(tǒng)的移植 本章主要內(nèi)容本章主要內(nèi)容7.1 Bootloader7.2 Linux的移植的移植7.3 根文件系統(tǒng)的制作根文件系統(tǒng)的制作 思考與習(xí)題思考與習(xí)題本章主要內(nèi)容本章主要內(nèi)容 本章介紹將本章介紹將Linux-Linux-移植到移植到ARMARM平臺(tái)的過平臺(tái)的過程,開發(fā)板為廣州友善之臂公司計(jì)算機(jī)科技有限公程,開發(fā)板為廣州友善之臂公司計(jì)算機(jī)科技有限公司的司的mini2440mini2440開發(fā)板。這里要說明的是,從開發(fā)板。這里要說明的是,從Linux-Linux-2.6.322.6.32開始,開始,LinuxL
2、inux內(nèi)核已經(jīng)對(duì)內(nèi)核已經(jīng)對(duì)mini2440mini2440開發(fā)板有了開發(fā)板有了有限的支持,因此,我們這里主要介紹移植的方法。有限的支持,因此,我們這里主要介紹移植的方法。 Linux Linux移植必然要涉及到驅(qū)動(dòng)程序的移植,而移植必然要涉及到驅(qū)動(dòng)程序的移植,而LinuxLinux驅(qū)動(dòng)程序足足可以寫一本書,所以,本章只簡驅(qū)動(dòng)程序足足可以寫一本書,所以,本章只簡單的介紹移植單的介紹移植LinuxLinux的流程,對(duì)于驅(qū)動(dòng)程序則不作過的流程,對(duì)于驅(qū)動(dòng)程序則不作過多介紹,讀者可以參考相關(guān)書籍進(jìn)行深入學(xué)習(xí)。多介紹,讀者可以參考相關(guān)書籍進(jìn)行深入學(xué)習(xí)。7.1 Bootloader7.1.1 Bootlo
3、ader7.1.1 Bootloader簡介簡介7.1.2 7.1.2 常見常見BootloaderBootloader回本章目錄回本章目錄7.1 Bootloader7.1.1 Bootloader簡介簡介 Bootloader Bootloader是在操作系統(tǒng)內(nèi)核運(yùn)行之前是在操作系統(tǒng)內(nèi)核運(yùn)行之前運(yùn)行的一段程序,它類似于運(yùn)行的一段程序,它類似于PCPC中的中的BIOSBIOS程序。程序。通過這段程序,可以完成硬件設(shè)備的初始化,通過這段程序,可以完成硬件設(shè)備的初始化,并建立內(nèi)存空間的映射關(guān)系,從而將系統(tǒng)的并建立內(nèi)存空間的映射關(guān)系,從而將系統(tǒng)的軟軟/ /硬件環(huán)境帶到一個(gè)合適的狀態(tài),為最終加硬件環(huán)
4、境帶到一個(gè)合適的狀態(tài),為最終加載系統(tǒng)內(nèi)核做好準(zhǔn)備。載系統(tǒng)內(nèi)核做好準(zhǔn)備。 大多數(shù)大多數(shù)BootloaderBootloader都包含兩種不同的操都包含兩種不同的操作模式:作模式:(1) (1) 啟動(dòng)加載模式啟動(dòng)加載模式(2) (2) 下載模式下載模式回本節(jié)目錄回本節(jié)目錄7.1 Bootloader7.1.1 Bootloader簡介(續(xù))(1) (1) 啟動(dòng)加載模式啟動(dòng)加載模式也叫做也叫做“自主自主”模式,該模式下,模式,該模式下,Bootloader從目標(biāo)機(jī)上的某個(gè)固態(tài)存儲(chǔ)從目標(biāo)機(jī)上的某個(gè)固態(tài)存儲(chǔ)設(shè)備上將操作系統(tǒng)加載到設(shè)備上將操作系統(tǒng)加載到RAM中并啟動(dòng)中并啟動(dòng)操作系統(tǒng)運(yùn)行,整個(gè)過程沒有用戶的
5、介操作系統(tǒng)運(yùn)行,整個(gè)過程沒有用戶的介入。入。嵌入式產(chǎn)品發(fā)布時(shí)的使用該模式。嵌入式產(chǎn)品發(fā)布時(shí)的使用該模式。7.1 Bootloader7.1.1 Bootloader簡介(續(xù))(2) (2) 下載模式下載模式 下載模式是目標(biāo)機(jī)上的下載模式是目標(biāo)機(jī)上的BootloaderBootloader將通過串口將通過串口連接或網(wǎng)絡(luò)連接等通信手段從主機(jī)下載文件,如下連接或網(wǎng)絡(luò)連接等通信手段從主機(jī)下載文件,如下載內(nèi)核映像和根文件系統(tǒng)映像等。從主機(jī)下載的文載內(nèi)核映像和根文件系統(tǒng)映像等。從主機(jī)下載的文件通常首先被件通常首先被BootloaderBootloader保存到目標(biāo)機(jī)的保存到目標(biāo)機(jī)的RAMRAM中,中,然后
6、被然后被BootloaderBootloader寫入到目標(biāo)機(jī)上的固態(tài)存儲(chǔ)設(shè)備寫入到目標(biāo)機(jī)上的固態(tài)存儲(chǔ)設(shè)備中。中。BootloaderBootloader的這種模式在系統(tǒng)更新時(shí)使用。的這種模式在系統(tǒng)更新時(shí)使用。 工作于這種模式下的工作于這種模式下的BootloaderBootloader通常都會(huì)向它通常都會(huì)向它的終端用戶提供一個(gè)簡單的命令行接口。的終端用戶提供一個(gè)簡單的命令行接口。7.1 Bootloader7.1.1 Bootloader簡介(續(xù))BootloaderBootloader的啟動(dòng)流程一般分為兩個(gè)階的啟動(dòng)流程一般分為兩個(gè)階段:段:stage1stage1和和stage2stage2
7、。stage1stage1的代碼一般用匯編語言編寫的代碼一般用匯編語言編寫stage2stage2的代碼一般用的代碼一般用C C語言編寫。語言編寫。7.1 Bootloader7.1.1 Bootloader簡介(續(xù))(1 1)stage1stage1階段主要完成以下工作階段主要完成以下工作 基本的硬件初始化,包括屏蔽所有的中斷、設(shè)置基本的硬件初始化,包括屏蔽所有的中斷、設(shè)置CPUCPU的速的速度和時(shí)鐘頻率、度和時(shí)鐘頻率、RAMRAM初始化、外圍設(shè)備初始化、關(guān)閉初始化、外圍設(shè)備初始化、關(guān)閉CPUCPU內(nèi)部指令和數(shù)據(jù)內(nèi)部指令和數(shù)據(jù)CacheCache等。等。 為加載為加載stage2stage2
8、準(zhǔn)備準(zhǔn)備RAMRAM空間,通常為了獲得更快的執(zhí)行速空間,通常為了獲得更快的執(zhí)行速度,通常把度,通常把stage2stage2加載到加載到RAMRAM空間中來執(zhí)行,因此必空間中來執(zhí)行,因此必須為加載須為加載BootloaderBootloader的的stage2stage2準(zhǔn)備好一段可用的準(zhǔn)備好一段可用的RAMRAM空間??臻g。 復(fù)制復(fù)制stage2stage2的代碼到的代碼到RAMRAM中,在這里要確定兩點(diǎn):中,在這里要確定兩點(diǎn):1 1、stage2stage2的可執(zhí)行映像在固態(tài)存儲(chǔ)設(shè)備的存放起的可執(zhí)行映像在固態(tài)存儲(chǔ)設(shè)備的存放起始地址和終止地址;始地址和終止地址;2 2、RAMRAM空間的起始
9、地址??臻g的起始地址。 設(shè)置堆棧指針設(shè)置堆棧指針SPSP,為執(zhí)行,為執(zhí)行stage2stage2的的C C語言代碼做好準(zhǔn)備。語言代碼做好準(zhǔn)備。7.1 Bootloader7.1.1 Bootloader簡介(續(xù))(2 2)stage2stage2主要完成以下工作主要完成以下工作 用匯編語言跳轉(zhuǎn)到用匯編語言跳轉(zhuǎn)到stage2stage2的入口函數(shù)。的入口函數(shù)。 初始化本階段要使用到的硬件設(shè)備,包括初始初始化本階段要使用到的硬件設(shè)備,包括初始化串口、初始化定時(shí)器等。化串口、初始化定時(shí)器等。 檢測系統(tǒng)的內(nèi)存映射,所謂內(nèi)存映射就是指在檢測系統(tǒng)的內(nèi)存映射,所謂內(nèi)存映射就是指在整個(gè)物理地址空間中指出哪些地
10、址范圍被分整個(gè)物理地址空間中指出哪些地址范圍被分配用來尋址系統(tǒng)的內(nèi)存。配用來尋址系統(tǒng)的內(nèi)存。 加載內(nèi)核映像和根文件系統(tǒng)映像,這里包括規(guī)加載內(nèi)核映像和根文件系統(tǒng)映像,這里包括規(guī)劃內(nèi)存占用的布局和從劃內(nèi)存占用的布局和從FlashFlash上復(fù)制數(shù)據(jù)。上復(fù)制數(shù)據(jù)。 設(shè)置內(nèi)核的啟動(dòng)參數(shù)并啟動(dòng)內(nèi)核。設(shè)置內(nèi)核的啟動(dòng)參數(shù)并啟動(dòng)內(nèi)核。7.1 Bootloader7.1.2 常見常見Bootloader1 1)RedbootRedboot Redboot Redboot是是RedhatRedhat公司隨公司隨eCoseCos發(fā)布的一個(gè)發(fā)布的一個(gè)BOOTBOOT方案,是一個(gè)開源項(xiàng)目。方案,是一個(gè)開源項(xiàng)目。Redb
11、ootRedboot支持的處理器構(gòu)支持的處理器構(gòu)架有架有ARMARM、MIPSMIPS、MN10300MN10300、PowerPCPowerPC、Renesas SHxRenesas SHx、v850v850、x86x86等。等。 Redboot Redboot的特性有:的特性有: 支持支持eCoseCos、LinuxLinux操作系統(tǒng)引導(dǎo);操作系統(tǒng)引導(dǎo); 在線讀寫在線讀寫FlashFlash; 支持串行口支持串行口kermitkermit,S-recordS-record下載代碼;下載代碼; 監(jiān)控(監(jiān)控(MonitorMonitor)命令集,包括讀寫)命令集,包括讀寫I/OI/O,內(nèi),內(nèi)存
12、,寄存器、內(nèi)存、外設(shè)測試功能等。存,寄存器、內(nèi)存、外設(shè)測試功能等?;乇竟?jié)目錄回本節(jié)目錄7.1 Bootloader7.1.2 常見Bootloader(續(xù))2 2)UBootUBoot UBoot UBoot(Universal BootloaderUniversal Bootloader)是由開源項(xiàng))是由開源項(xiàng)目目PPCBootPPCBoot發(fā)展起來的,它是在發(fā)展起來的,它是在GPLGPL下資源代碼最完下資源代碼最完整的一個(gè)通用整的一個(gè)通用BootloaderBootloader。目前。目前UBootUBoot差不多以每差不多以每隔隔3 3個(gè)月發(fā)布一次。個(gè)月發(fā)布一次。UBootUBoot的官
13、網(wǎng)是的官網(wǎng)是http:/www.denx.de/wiki/U-Boothttp:/www.denx.de/wiki/U-Boot。 UBoot UBoot支持的處理器構(gòu)架包括支持的處理器構(gòu)架包括PowerPCPowerPC、ARMARM、MIPSMIPS、x86x86等,等,UBootUBoot提供兩種操作模式:啟動(dòng)加載提供兩種操作模式:啟動(dòng)加載模式和下載模式,并具有大型模式和下載模式,并具有大型Boot LoaderBoot Loader的全部的全部功能。功能。7.1 Bootloader7.1.2 常見Bootloader(續(xù))2 2)UBootUBoot UBoot UBoot的主要特性
14、有:的主要特性有: SCC/FEC SCC/FEC以太網(wǎng)支持;以太網(wǎng)支持; BOOTP/TFTP BOOTP/TFTP引導(dǎo);引導(dǎo); IP IP、MACMAC預(yù)置;預(yù)置; 在線讀寫在線讀寫FlashFlash、IDEIDE、IICIIC、EEROMEEROM、RTCRTC等;等; 支持串行口支持串行口kermitkermit,S-recordS-record下載代碼;下載代碼; 支持多種操作系統(tǒng)的引導(dǎo);支持多種操作系統(tǒng)的引導(dǎo); 監(jiān)控命令集,讀寫監(jiān)控命令集,讀寫I/OI/O,內(nèi)存、寄存器、內(nèi)存、,內(nèi)存、寄存器、內(nèi)存、外設(shè)測試功能等;外設(shè)測試功能等; 腳本語言支持(類似腳本語言支持(類似BASHBA
15、SH腳本);腳本); 支持支持WatchdogWatchdog、LCD logoLCD logo,狀態(tài)指示功能等。,狀態(tài)指示功能等。7.1 Bootloader7.1.2 常見Bootloader(續(xù))3 3)vivivivi vivi vivi是當(dāng)前比較流行的專為是當(dāng)前比較流行的專為ARM9ARM9處理器而設(shè)計(jì)處理器而設(shè)計(jì)的一款的一款BootloaderBootloader,它操作簡便,同時(shí)提供了完備,它操作簡便,同時(shí)提供了完備的命令體系。的命令體系。vivivivi是由韓國是由韓國MiziMizi公司開發(fā)的一種公司開發(fā)的一種BootloaderBootloader,適合于,適合于ARM9A
16、RM9處理器,支持處理器,支持S3C2410 xS3C2410 x處處理器,其源代碼可以在理器,其源代碼可以在http:/http:/網(wǎng)站網(wǎng)站下載。下載。 一個(gè)功能完備的大型一個(gè)功能完備的大型BootloaderBootloader的工作量,相的工作量,相當(dāng)于一個(gè)小型的操作系統(tǒng)。由于當(dāng)于一個(gè)小型的操作系統(tǒng)。由于BootloaderBootloader的移植的移植比較復(fù)雜,這里就不能詳述了,讀者可以查閱其他比較復(fù)雜,這里就不能詳述了,讀者可以查閱其他資料。資料。7.2 Linux的移植的移植7.2.1 7.2.1 安裝前的準(zhǔn)備工作安裝前的準(zhǔn)備工作7.2.2 Linux7.2.2 Linux的移植
17、步驟的移植步驟回本章目錄回本章目錄7.2 Linux的移植的移植7.2.1 安裝前的準(zhǔn)備工作安裝前的準(zhǔn)備工作1 1)熟悉硬件)熟悉硬件 由于由于LinuxLinux最終要操作硬件,而嵌入式系統(tǒng)的最終要操作硬件,而嵌入式系統(tǒng)的一個(gè)特點(diǎn)就是硬件可定制,不同的產(chǎn)品其硬件電路一個(gè)特點(diǎn)就是硬件可定制,不同的產(chǎn)品其硬件電路有可能很大的不同,比如有可能很大的不同,比如IICIIC芯片以及地址、網(wǎng)絡(luò)芯片以及地址、網(wǎng)絡(luò)芯片等,所以,在移植前一定要對(duì)要移植的平臺(tái)有芯片等,所以,在移植前一定要對(duì)要移植的平臺(tái)有深入的理解。深入的理解。 對(duì)于對(duì)于mini2440mini2440開發(fā)板,有幾個(gè)關(guān)鍵要了解的內(nèi)開發(fā)板,有幾個(gè)
18、關(guān)鍵要了解的內(nèi)容,如下。容,如下。 mini2440 mini2440開發(fā)板的晶振為開發(fā)板的晶振為12000000Hz12000000Hz?;乇竟?jié)目錄回本節(jié)目錄7.2 Linux的移植的移植7.2.1 安裝前的準(zhǔn)備工作(續(xù))1 1)熟悉硬件)熟悉硬件 mini2440 mini2440的的BootloaderBootloader對(duì)對(duì)NAND FlashNAND Flash的分區(qū)如下。的分區(qū)如下。分區(qū)名稱分區(qū)名稱起始地址起始地址分區(qū)大小分區(qū)大小vivi0 x000000000 x00040000param0 x000400000 x00020000kernel0 x000600000 x0050
19、0000root0 x005600000 x3fa80000 IIC。mini2440具有一個(gè)直接連接具有一個(gè)直接連接CPU的的IIC信號(hào)引腳信號(hào)引腳的的EEPROM 芯片芯片AT24C08,它的容量為,它的容量為1024B,器件地址,器件地址為為A0。 DM9000。mini2440采用了采用了DM9000網(wǎng)卡芯片,它可網(wǎng)卡芯片,它可以自適應(yīng)以自適應(yīng) 10/100Mbit/s網(wǎng)絡(luò)。網(wǎng)絡(luò)。MAC地址需要通過軟件設(shè)定。地址需要通過軟件設(shè)定。7.2 Linux的移植的移植7.2.1 安裝前的準(zhǔn)備工作(續(xù))1 1)熟悉硬件)熟悉硬件 UDA134x UDA134x。mini2440mini2440分
20、別使用分別使用CPUCPU的的GPB2GPB2、GPB3GPB3、GPB4GPB4端口模擬實(shí)現(xiàn)端口模擬實(shí)現(xiàn)L3-BusL3-Bus規(guī)范的規(guī)范的L3MODEL3MODE、L3DATAL3DATA、L3CLOCKL3CLOCK。 以上內(nèi)容在以上內(nèi)容在mini2440mini2440的平臺(tái)設(shè)備文件的平臺(tái)設(shè)備文件(arch/arm/mach-s3c2440/mach-mini2440.carch/arm/mach-s3c2440/mach-mini2440.c)中,讀者可)中,讀者可以查看該文件以了解詳細(xì)內(nèi)容。以查看該文件以了解詳細(xì)內(nèi)容。7.2 Linux的移植的移植7.2.1 安裝前的準(zhǔn)備工作(續(xù))
21、2 2)獲取內(nèi)核源代碼)獲取內(nèi)核源代碼 Linux Linux版本很多,而且更新很快。我們這里選擇版本很多,而且更新很快。我們這里選擇Linux-Linux-作為我們移植的對(duì)象。作為我們移植的對(duì)象。 Linux Linux內(nèi)核的官網(wǎng)地址為內(nèi)核的官網(wǎng)地址為//,該,該網(wǎng)站列出了最近更新的幾個(gè)穩(wěn)定版。讀者要下載歷史版本,網(wǎng)站列出了最近更新的幾個(gè)穩(wěn)定版。讀者要下載歷史版本,可以從可以從/pub/linux/kernel/ftp:/ftp.kernel.
22、org/pub/linux/kernel/下載。下載。7.2 Linux的移植的移植7.2.1 安裝前的準(zhǔn)備工作(續(xù))3 3)檢測移植環(huán)境)檢測移植環(huán)境 桌面桌面LinuxLinux發(fā)行版:這里選擇發(fā)行版:這里選擇fedora 14fedora 14。 make make程序:要編譯程序:要編譯LinuxLinux沒有沒有makemake程序是不行的,用戶可程序是不行的,用戶可以使用以使用make -vmake -v命令來查看命令來查看makemake是否存在以及其版本號(hào)。是否存在以及其版本號(hào)。 交叉編譯器:交叉編譯器的安裝在交叉編譯器:交叉編譯器的安裝在6.26.2節(jié)已經(jīng)介紹過,這節(jié)已經(jīng)介紹
23、過,這里不再重復(fù)。里不再重復(fù)。 必要的庫:這里必要的庫很難一一列出,如果出現(xiàn)了必要的庫:這里必要的庫很難一一列出,如果出現(xiàn)了LinuxLinux需要而系統(tǒng)中不存在的庫,需要而系統(tǒng)中不存在的庫,LinuxLinux會(huì)有提示,會(huì)有提示,fedorafedora用用戶可以使用戶可以使用yumyum命令來下載并安裝所需的庫。命令來下載并安裝所需的庫。7.2 Linux的移植的移植7.2.1 安裝前的準(zhǔn)備工作(續(xù))4 4)下載)下載YAFFS2YAFFS2 YAFFS/YAFFS2 YAFFS/YAFFS2文件系統(tǒng)是專門針對(duì)文件系統(tǒng)是專門針對(duì)NAND FlashNAND Flash設(shè)計(jì),其具有可寫入、修
24、改并能永久保存文件的特設(shè)計(jì),其具有可寫入、修改并能永久保存文件的特性,并提供了損耗平衡和掉電保護(hù)。性,并提供了損耗平衡和掉電保護(hù)。 在在LinuxLinux下,使用命令下,使用命令 git clone git:/www.aleph1.co.uk/yaffs2 git clone git:/www.aleph1.co.uk/yaffs2來下載來下載YAFFS2YAFFS2的源代碼。的源代碼。YAFFSYAFFS的官網(wǎng)地址為的官網(wǎng)地址為http:/ Linux的移植的移植7.2.1 安裝前的準(zhǔn)備工作(續(xù))4 4)下載)下載YAFFS2YAFFS2csufedora Documents$ git c
25、lone git:/www.aleph1.co.uk/yaffs2csufedora Documents$ git clone git:/www.aleph1.co.uk/yaffs2Cloning into yaffs2.Cloning into yaffs2.remote: Counting objects: 6930, doneremote: Counting objects: 6930, doneremote: Compressing objects: 100% remote: Compressing objects: 100% (4153/41534153/4153), done,
26、doneremote: Total 6930 remote: Total 6930 (delta 5484delta 5484), reused 3476 , reused 3476 (delta 2700delta 2700)Receiving Objects: 100% Receiving Objects: 100% (6930/69306930/6930), 3.42MiB | 17 Kibit/s, done., 3.42MiB | 17 Kibit/s, done.Receiving deltas: 100% Receiving deltas: 100% (5484/54845484
27、/5484), done, done7.2 Linux的移植的移植7.2.2 Linux的移植步驟的移植步驟 這里假設(shè)讀者下載的是這里假設(shè)讀者下載的是linux-.tar.bz2linux-.tar.bz2,并,并放到放到csucsu用戶的用戶的DocumentDocument目錄下。目錄下。1 1)解壓)解壓LinuxLinux內(nèi)核并為內(nèi)核打上內(nèi)核并為內(nèi)核打上YAFFS2YAFFS2補(bǔ)丁補(bǔ)丁csufedora Documents$ lscsufedora Documents$ lslinux-.tar.bz2 yaffs2linux-2.6.3
28、8.7.tar.bz2 yaffs2csufedora Documents$ tar xjf linux-.tar.bz2csufedora Documents$ tar xjf linux-.tar.bz2csufedora Documents$ cd yaffs2/csufedora Documents$ cd yaffs2/csufedora yaffs2$ ./patch-ker.sh c m ./linux-csufedora yaffs2$ ./patch-ker.sh c m ./linux-Updating ./l
29、inux-/fs/KconfigUpdating ./linux-/fs/KconfigUpdating ./linux-/fs/MakefileUpdating ./linux-/fs/Makefilecsufedora yaffs2$ cd ./linux-csufedora yaffs2$ cd ./linux-回本節(jié)目錄回本節(jié)目錄7.2 Linux的移植的移植7.2.2 Linux的移植步驟(續(xù))2 2)建立自己的平臺(tái)文件)建立自己的平臺(tái)文件 在在LinuxLinux內(nèi)核中,每個(gè)支持的開發(fā)板
30、都有一個(gè)內(nèi)核中,每個(gè)支持的開發(fā)板都有一個(gè)平臺(tái)文件,平臺(tái)文件,LinuxLinux自帶的自帶的mini2440mini2440開發(fā)板的平臺(tái)文開發(fā)板的平臺(tái)文件為件為“arch/arm/mach-s3c2440/mach-“arch/arm/mach-s3c2440/mach-mini2440.c”mini2440.c”。我們這里就使用內(nèi)核自帶的平臺(tái)設(shè)。我們這里就使用內(nèi)核自帶的平臺(tái)設(shè)備文件,讀者可以自己查看該文件以學(xué)習(xí)平臺(tái)設(shè)備備文件,讀者可以自己查看該文件以學(xué)習(xí)平臺(tái)設(shè)備文件的寫法。文件的寫法。 如果使用內(nèi)核不支持的平臺(tái)移植,或如果使用內(nèi)核不支持的平臺(tái)移植,或?yàn)閮?nèi)核添為內(nèi)核添加一個(gè)新平臺(tái)時(shí),加一個(gè)新平
31、臺(tái)時(shí),需要自己創(chuàng)建一個(gè)新的平臺(tái)設(shè)備需要自己創(chuàng)建一個(gè)新的平臺(tái)設(shè)備文件,并需要修改平臺(tái)設(shè)備文件下的文件,并需要修改平臺(tái)設(shè)備文件下的MakefileMakefile文件文件和和KconfigKconfig文件,其中文件,其中MakefileMakefile文件負(fù)責(zé)編譯,文件負(fù)責(zé)編譯,KconfigKconfig文件用于配置。文件用于配置。7.2 Linux的移植的移植7.2.2 Linux的移植步驟(續(xù))3 3)修改驅(qū)動(dòng)程序)修改驅(qū)動(dòng)程序 驅(qū)動(dòng)程序要根據(jù)實(shí)際情況進(jìn)行修改,對(duì)于驅(qū)動(dòng)程序要根據(jù)實(shí)際情況進(jìn)行修改,對(duì)于mini2440mini2440,這里有三個(gè)關(guān)鍵的地方需要修改,其他,這里有三個(gè)關(guān)鍵的地方
32、需要修改,其他需要修改的內(nèi)容這里就不再一一列舉。需要修改的內(nèi)容這里就不再一一列舉。 (1 1)UDA134xUDA134x驅(qū)動(dòng)驅(qū)動(dòng)mini2440mini2440的聲卡驅(qū)動(dòng)的聲卡驅(qū)動(dòng) (2 2)DM9000DM9000驅(qū)動(dòng)驅(qū)動(dòng)mini2400mini2400的網(wǎng)卡驅(qū)動(dòng)的網(wǎng)卡驅(qū)動(dòng) (3 3)為)為DM9000DM9000指定指定MACMAC地址地址mini2440mini2440所用的所用的DM9000DM9000網(wǎng)卡并沒有外接網(wǎng)卡并沒有外接EEPROMEEPROM用以存儲(chǔ)用以存儲(chǔ)MACMAC地址,即地址,即MACMAC地址需要通地址需要通過軟件進(jìn)行修改過軟件進(jìn)行修改7.2 Linux的移植的移
33、植7.2.2 Linux的移植步驟(續(xù))3 3)修改驅(qū)動(dòng)程序)修改驅(qū)動(dòng)程序(1 1)UDA134xUDA134x驅(qū)動(dòng)驅(qū)動(dòng)static int uda134x_startupstatic int uda134x_startup(struct snd_pcm_substream struct snd_pcm_substream * *substream,substream,) else else uda134x-master_substream = substream; uda134x-master_substream = substream;#if defined#if defined( CON
34、FIG_MACH_MINI2440 CONFIG_MACH_MINI2440 ) /* 把錄音通道改為把錄音通道改為 VIN2 */uda134x_writeuda134x_write(codec, 2, 2 |codec, 2, 2 |(5U25U2); ;#endif#endifreturn 0;return 0; 7.2 Linux的移植的移植7.2.2 Linux的移植步驟(續(xù))3 3)修改驅(qū)動(dòng)程序)修改驅(qū)動(dòng)程序(2 2)DM9000DM9000驅(qū)動(dòng)驅(qū)動(dòng)static int _init dm9000_initstatic int _init dm9000_init(voidvoid)
35、#if defined#if defined(CONFIG_MACH_MINI2440CONFIG_MACH_MINI2440)#include #include unsigned int oldval_bwscon = unsigned int oldval_bwscon = * *(volatile unsigned int volatile unsigned int * *)S3C2410_BWSCON;S3C2410_BWSCON;* *(volatile unsigned int volatile unsigned int * *)S3C2410_BWSCONS3C2410_BWSC
36、ON) = = ( oldval_bwscon & oldval_bwscon & (3163dev_addrndev-dev_addr) / /* * try reading from mac try reading from mac * */ /mac_src = chip;mac_src = chip;for for (i = 0; i 6; i+i = 0; i dev_addri = iorndev-dev_addri = ior(db, i+DM9000_PARdb, i+DM9000_PAR); ; #if defined#if defined(CONFIG_MA
37、CH_MINI2440CONFIG_MACH_MINI2440)/ /* * 指定指定MAC MAC 地址為地址為 08:90:90:90:90:90 08:90:90:90:90:90 * */ /memcpymemcpy(ndev-dev_addr, x08x90 x90 x90 x90 x90, 6ndev-dev_addr, x08x90 x90 x90 x90 x90, 6); ;#endif#endif 7.2 Linux的移植的移植7.2.2 Linux的移植步驟(續(xù))4 4)配置內(nèi)核)配置內(nèi)核cd /home/csu/fedoracd /home/csu/fedoramake
38、ARCH=arm menuconfigmake ARCH=arm menuconfig7.2 Linux的移植的移植7.2.2 Linux的移植步驟(續(xù))4 4)配置內(nèi)核)配置內(nèi)核 內(nèi)核可以配置的選項(xiàng)有兩種:內(nèi)核可以配置的選項(xiàng)有兩種: 一種是使用用方括號(hào)的選項(xiàng),這種選項(xiàng)可以選一種是使用用方括號(hào)的選項(xiàng),這種選項(xiàng)可以選擇編譯進(jìn)內(nèi)核(擇編譯進(jìn)內(nèi)核( * * )或者不編譯()或者不編譯( );); 另一種選項(xiàng)使用的是尖括號(hào),這種選項(xiàng)可以選另一種選項(xiàng)使用的是尖括號(hào),這種選項(xiàng)可以選擇編譯進(jìn)內(nèi)核(擇編譯進(jìn)內(nèi)核( )、編譯成模塊()、編譯成模塊()或)或者不編譯(者不編譯()。)。 按空格鍵可以在這幾個(gè)選項(xiàng)間
39、切換,按按空格鍵可以在這幾個(gè)選項(xiàng)間切換,按Y Y鍵選鍵選擇編譯進(jìn)內(nèi)核,按擇編譯進(jìn)內(nèi)核,按M M鍵選擇編譯成模塊,按鍵選擇編譯成模塊,按N N鍵選擇鍵選擇不編譯。不編譯。7.2 Linux的移植的移植7.2.2 Linux的移植步驟(續(xù))4 4)配置內(nèi)核)配置內(nèi)核 除了使用除了使用menuconfigmenuconfig,還可以使用,還可以使用xconfigxconfig或或gconfiggconfig來使用圖形界面進(jìn)行配置。來使用圖形界面進(jìn)行配置。 內(nèi)核的配置根據(jù)實(shí)際情況進(jìn)行選擇,這里只列內(nèi)核的配置根據(jù)實(shí)際情況進(jìn)行選擇,這里只列出幾個(gè)關(guān)鍵的選項(xiàng),其他選項(xiàng)讀者可以自己查找相出幾個(gè)關(guān)鍵的選項(xiàng),其他
40、選項(xiàng)讀者可以自己查找相關(guān)資料。關(guān)資料。(1 1)系統(tǒng)類型)系統(tǒng)類型(2 2)內(nèi)核特性)內(nèi)核特性(3 3)設(shè)備驅(qū)動(dòng))設(shè)備驅(qū)動(dòng)(4 4)文件系統(tǒng))文件系統(tǒng)7.2 Linux的移植的移植7.2.2 Linux的移植步驟(續(xù))4 4)配置內(nèi)核)配置內(nèi)核(1 1)系統(tǒng)類型)系統(tǒng)類型系統(tǒng)類型決定要將系統(tǒng)類型決定要將Linux移植到哪個(gè)平臺(tái)移植到哪個(gè)平臺(tái)7.2 Linux的移植的移植7.2.2 Linux的移植步驟(續(xù))4 4)配置內(nèi)核)配置內(nèi)核(2 2)內(nèi)核特性)內(nèi)核特性內(nèi)核特性決定內(nèi)核特性決定Linux內(nèi)核的一些基本特性內(nèi)核的一些基本特性7.2 Linux的移植的移植7.2.2 Linux的移植步驟(續(xù)
41、)4 4)配置內(nèi)核)配置內(nèi)核(2 2)內(nèi)核特性)內(nèi)核特性 這里要注意兩點(diǎn):這里要注意兩點(diǎn): 一是使能一是使能Use the ARM EABI to compile the kernel后,要在圖后,要在圖7-3的的Floating point emulation中選擇至少一項(xiàng),一般就選中選擇至少一項(xiàng),一般就選NWFPE math emulation; 二是從二是從Linux- 2.6.36開始,參數(shù)的傳遞方式有所開始,參數(shù)的傳遞方式有所改變,改變,mini2440的的Bootloader仍然使用的是舊方仍然使用的是舊方式,所以這里要選擇式,所以這里要選擇Provide old way to p
42、ass kernel parameters,以允許舊的參數(shù)傳遞方式。,以允許舊的參數(shù)傳遞方式。7.2 Linux的移植的移植7.2.2 Linux的移植步驟(續(xù))4 4)配置內(nèi)核)配置內(nèi)核(3 3)設(shè)備驅(qū)動(dòng))設(shè)備驅(qū)動(dòng) Linux提供的設(shè)備驅(qū)動(dòng)很多,要根據(jù)實(shí)際情況進(jìn)提供的設(shè)備驅(qū)動(dòng)很多,要根據(jù)實(shí)際情況進(jìn)行選擇,這里就不再一一列舉了。行選擇,這里就不再一一列舉了。7.2 Linux的移植的移植7.2.2 Linux的移植步驟(續(xù))4 4)配置內(nèi)核)配置內(nèi)核(4 4)文件系統(tǒng))文件系統(tǒng) 決定決定LinuxLinux支持的文件系統(tǒng),這里選擇支持的文件系統(tǒng),這里選擇yaffs2yaffs2,一般,一般FA
43、TFAT格式要選擇,格式要選擇,這樣就可以讀取這樣就可以讀取SDSD卡上的文件,卡上的文件,NFSNFS文件系統(tǒng)在調(diào)試文件系統(tǒng)時(shí)很有用。文件系統(tǒng)在調(diào)試文件系統(tǒng)時(shí)很有用。7.2 Linux的移植的移植7.2.2 Linux的移植步驟(續(xù))5 5)編譯內(nèi)核)編譯內(nèi)核 使用如下命令編譯內(nèi)核:使用如下命令編譯內(nèi)核:make ARCH=arm CROSS_COMPILE=arm-linux- -j2 zImagemake ARCH=arm CROSS_COMPILE=arm-linux- -j2 zImage 其中,其中,CROSS_COMPILECROSS_COMPILE指定了交叉編譯器的前綴,指定了
44、交叉編譯器的前綴,zImagezImage是最終的目標(biāo),是壓縮版的內(nèi)核,是最終的目標(biāo),是壓縮版的內(nèi)核,-j2-j2表示使用兩個(gè)表示使用兩個(gè)編譯線程,可以加快編譯速度。編譯線程,可以加快編譯速度。 編譯好的編譯好的zImagezImage文件保存在文件保存在arch/arm/bootarch/arm/boot目錄下。目錄下。7.2 Linux的移植的移植7.2.2 Linux的移植步驟(續(xù))6 6)編譯內(nèi)核模塊)編譯內(nèi)核模塊 使用如下命令編譯內(nèi)核模塊:使用如下命令編譯內(nèi)核模塊:make ARCH=arm CROSS_COMPILE=arm-linux- modulesmake ARCH=arm
45、CROSS_COMPILE=arm-linux- modules7.3 根文件系統(tǒng)的制作根文件系統(tǒng)的制作 只有內(nèi)核而沒有文件系統(tǒng)是工作不只有內(nèi)核而沒有文件系統(tǒng)是工作不起來的,根文件系統(tǒng)是內(nèi)核啟動(dòng)時(shí)使用起來的,根文件系統(tǒng)是內(nèi)核啟動(dòng)時(shí)使用的第一個(gè)文件系統(tǒng),根文件系統(tǒng)由一系的第一個(gè)文件系統(tǒng),根文件系統(tǒng)由一系列目錄組成,目錄中包含了應(yīng)用程序、列目錄組成,目錄中包含了應(yīng)用程序、C C語言庫以及相關(guān)的配置文件。語言庫以及相關(guān)的配置文件。回本章目錄回本章目錄7.3 根文件系統(tǒng)的制作根文件系統(tǒng)的制作 Busybox Busybox是一個(gè)集成了一百多個(gè)最常是一個(gè)集成了一百多個(gè)最常用用LinuxLinux命令和工
46、具的軟件,它甚至還集命令和工具的軟件,它甚至還集成了一個(gè)成了一個(gè)httphttp服務(wù)器和一個(gè)服務(wù)器和一個(gè)telnettelnet服務(wù)服務(wù)器,而所有這一切功能卻只有區(qū)區(qū)器,而所有這一切功能卻只有區(qū)區(qū)1MB1MB左左右的大小。右的大小。BusyboxBusybox把常用的工具和命令把常用的工具和命令集成壓縮在一個(gè)可執(zhí)行文件里,功能基集成壓縮在一個(gè)可執(zhí)行文件里,功能基本不變,而大小卻小了很多,在嵌入式本不變,而大小卻小了很多,在嵌入式LinuxLinux中有非常廣的應(yīng)用。中有非常廣的應(yīng)用。7.3 根文件系統(tǒng)的制作根文件系統(tǒng)的制作 Busybox Busybox基于這樣一個(gè)事實(shí):很多標(biāo)準(zhǔn)基于這樣一個(gè)事
47、實(shí):很多標(biāo)準(zhǔn)LinuxLinux工具都可以共享很多共同的元素。例如,工具都可以共享很多共同的元素。例如,很多基于文件的工具(比如很多基于文件的工具(比如grepgrep和和findfind)都)都需要在目錄中搜索文件的代碼。當(dāng)這些工具需要在目錄中搜索文件的代碼。當(dāng)這些工具被合并到一個(gè)可執(zhí)行程序中時(shí),它們就可以被合并到一個(gè)可執(zhí)行程序中時(shí),它們就可以共享這些相同的元素,這樣可以產(chǎn)生更小的共享這些相同的元素,這樣可以產(chǎn)生更小的可執(zhí)行程序。實(shí)際上,可執(zhí)行程序。實(shí)際上,BusyboxBusybox可以將大約可以將大約3.5MB3.5MB的工具包裝成大約的工具包裝成大約200KB200KB大小。這就為大小
48、。這就為可引導(dǎo)的磁盤和使用可引導(dǎo)的磁盤和使用LinuxLinux的嵌入式設(shè)備提供的嵌入式設(shè)備提供了更多功能。了更多功能。7.3 根文件系統(tǒng)的制作根文件系統(tǒng)的制作 根文件系統(tǒng)的制作流程如下所述。根文件系統(tǒng)的制作流程如下所述。1 1)下載)下載BusyboxBusybox Busybox Busybox的官網(wǎng)是的官網(wǎng)是,用,用戶可到戶可到http:/ http:/ 網(wǎng)站下載。網(wǎng)站下載。BusyboxBusybox也有多個(gè)版本,用戶可以也有多個(gè)版本,用戶可以選擇合適的版本下載。這里以最新的選擇合適的版本下載。這里以最新的Busybox-1.19.4Busybox-1.19.4為例來說明。為例來說明。
49、7.3 根文件系統(tǒng)的制作根文件系統(tǒng)的制作2 2)建立根文件系統(tǒng)目錄)建立根文件系統(tǒng)目錄 用戶可以使用如下命令來建立所有必須用戶可以使用如下命令來建立所有必須的文件。的文件。csufedora $ mkdir rootfscsufedora $ mkdir rootfscsufedora $ cd rootfs/csufedora $ cd rootfs/csufedora rootfs$ mkdir bin dev etc home csufedora rootfs$ mkdir bin dev etc home lib mnt opt proc root sbin tmp usr varli
50、b mnt opt proc root sbin tmp usr varcsufedora rootfs$ mkdir usr/bin usr/lib csufedora rootfs$ mkdir usr/bin usr/lib usr/sbin lib/modulesusr/sbin lib/modules7.3 根文件系統(tǒng)的制作根文件系統(tǒng)的制作3 3)創(chuàng)建必要的設(shè)備文件)創(chuàng)建必要的設(shè)備文件 用戶需要使用如下命令來建立用戶需要使用如下命令來建立consoleconsole和和nullnull兩個(gè)設(shè)備文件。兩個(gè)設(shè)備文件。csufedora rootfs$ cd devcsufedora ro
51、otfs$ cd devcsufedora dev$ mknod -m 666 console c 5 1csufedora dev$ mknod -m 666 console c 5 1csufedora dev$ mknod -m 666 null c 1 3csufedora dev$ mknod -m 666 null c 1 37.3 根文件系統(tǒng)的制作根文件系統(tǒng)的制作4 4)配置)配置BusyboxBusybox 依次執(zhí)行如下命令來開始配置依次執(zhí)行如下命令來開始配置BusyboxBusybox:csufedora $ tar xjf busybox-1.19.4.tar.bz2csu
52、fedora $ tar xjf busybox-1.19.4.tar.bz2csufedora $ cd busybox-1.19.4csufedora $ cd busybox-1.19.4csufedora busybox-1.19.4$ make menuconfigcsufedora busybox-1.19.4$ make menuconfig7.3 根文件系統(tǒng)的制作根文件系統(tǒng)的制作4 4)配置)配置BusyboxBusybox Busybox Busybox的配置這里不再詳細(xì)說明,只說明三點(diǎn)。的配置這里不再詳細(xì)說明,只說明三點(diǎn)。(1 1)為了避免出錯(cuò),需要選擇)為了避免出錯(cuò),需要
53、選擇“Dont use /usr”“Dont use /usr”。Busybox Settings -Busybox Settings -General Configuration -General Configuration - * * Dont use /usr Dont use /usr(2 2)這里將)這里將BusyboxBusybox編譯為動(dòng)態(tài)鏈接,并制定交叉編譯器前綴。編譯為動(dòng)態(tài)鏈接,并制定交叉編譯器前綴。Build Options -Build Options - Build BusyBox as a static binary Build BusyBox as a static
54、 binary (arm-linux-arm-linux-) Cross Compiler prefix Cross Compiler prefix(3 3)指定將)指定將BusyboxBusybox安裝的位置,即上面的安裝的位置,即上面的rootfsrootfs文件夾。文件夾。 Installation Options Installation Options (make install behaviormake install behavior) - -What kind of applet links to install What kind of applet links to ins
55、tall (as soft-linksas soft-links) - -(/home/csu/rootfs/home/csu/rootfs) BusyBox installation prefix BusyBox installation prefix7.3 根文件系統(tǒng)的制作根文件系統(tǒng)的制作5 5)編譯并安裝)編譯并安裝BusyboxBusybox 使用命令使用命令makemake來編譯來編譯BusyboxBusybox,使用命令,使用命令make make installinstall命令將命令將BusyboxBusybox安裝到配置時(shí)指定的目錄。安裝到配置時(shí)指定的目錄。6 6)安裝必要的
56、庫)安裝必要的庫 由于這里使用了動(dòng)態(tài)鏈接,所以需要將使用到的由于這里使用了動(dòng)態(tài)鏈接,所以需要將使用到的庫復(fù)制到庫復(fù)制到rootfs/lib目錄下。讀者可以使用目錄下。讀者可以使用arm-linux-readelf -d命令來查看需要的庫。這里為了方命令來查看需要的庫。這里為了方便,將交叉編譯器中所有的庫復(fù)制過來,因?yàn)榧词贡?,將交叉編譯器中所有的庫復(fù)制過來,因?yàn)榧词笲usybox不使用這些庫,其他應(yīng)用程序也可能要使不使用這些庫,其他應(yīng)用程序也可能要使用這些庫。用這些庫。7.3 根文件系統(tǒng)的制作根文件系統(tǒng)的制作7 7)編寫配置文件)編寫配置文件 至少需要編寫如下配置文件:至少需要編寫如下配置文件:
57、etc/init.d/rcSetc/init.d/rcSetc/inittabetc/inittabetc/profileetc/profileetc/resolv.confetc/resolv.confetc/ inetd.confetc/ inetd.confetc/fstabetc/fstabetc/passwdetc/passwd7.3 根文件系統(tǒng)的制作根文件系統(tǒng)的制作7 7)編寫配置文件)編寫配置文件 這幾個(gè)文件的作用是:這幾個(gè)文件的作用是:rcSrcS:啟動(dòng)腳本文件,:啟動(dòng)腳本文件,inittabinittab:initinit進(jìn)程按照進(jìn)程按照inittabinittab文件所提供
58、的信文件所提供的信息創(chuàng)建進(jìn)程,息創(chuàng)建進(jìn)程,profileprofile:主要負(fù)責(zé)系統(tǒng)的環(huán)境變量,:主要負(fù)責(zé)系統(tǒng)的環(huán)境變量,resolv.confresolv.conf:是域名解析器的配置文件,:是域名解析器的配置文件,inetd.confinetd.conf:保存了系統(tǒng)提供:保存了系統(tǒng)提供internetinternet服務(wù)的數(shù)服務(wù)的數(shù)據(jù)庫,據(jù)庫,fstabfstab:存放系統(tǒng)的文件系統(tǒng)信息,:存放系統(tǒng)的文件系統(tǒng)信息,passwdpasswd:用于存放用戶關(guān)鍵信息。:用于存放用戶關(guān)鍵信息。7.3 根文件系統(tǒng)的制作根文件系統(tǒng)的制作7 7)編寫配置文件)編寫配置文件(1 1)etc/init.d/rcSetc/init.d/rcS需要開啟該文件的執(zhí)行權(quán)限。需要開啟該文件的執(zhí)行權(quán)限。#!/bin/sh #!/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin PATH=/sbin:/bin:/usr/sbin:/usr/bin runlevel=S runlevel=S prevlevel=N prevlevel=N umask 022 umask 022 export PATH runlevel prevlevel export PATH runlevel prevlevel /bin/hostname Micro2440/bin/ho
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2021屆湖北省孝感市普通高中高一下學(xué)期期末考試數(shù)學(xué)試題
- 2025年建筑施工《春節(jié)節(jié)后復(fù)工復(fù)產(chǎn)》工作實(shí)施方案 合計(jì)3份
- 小學(xué)一年級(jí)20以內(nèi)數(shù)學(xué)口算練習(xí)題大全
- 學(xué)校聘用教師勞動(dòng)合同書5篇
- 《肌組織課件》課件
- 你聽“你聽多美”命題作文寫作指導(dǎo)與精彩例文
- 湖南高考語文試題分析報(bào)告
- 《勞動(dòng)定額知識(shí)》課件
- 商超連鎖店話務(wù)員工作總結(jié)
- 稅務(wù)籌劃與規(guī)劃實(shí)踐經(jīng)驗(yàn)分享
- (八省聯(lián)考)2025年高考綜合改革適應(yīng)性演練 語文試卷(含答案解析)
- 數(shù)字媒體技術(shù)應(yīng)用基礎(chǔ)知識(shí)單選題及答案解析
- 2025年高考?xì)v史復(fù)習(xí)之小題狂練300題(選擇題):世界多極化與經(jīng)濟(jì)全球化(20題)
- ISO 56001-2024《創(chuàng)新管理體系-要求》專業(yè)解讀與應(yīng)用實(shí)踐指導(dǎo)材料之1:0 引言(雷澤佳編制-2025B0)
- 2024版環(huán)衛(wèi)清潔班車租賃服務(wù)協(xié)議3篇
- 生產(chǎn)安全事故事件管理知識(shí)培訓(xùn)課件
- 項(xiàng)目施工單位與當(dāng)?shù)卣按迕竦膮f(xié)調(diào)措施
- 藥劑科工作人員的專業(yè)提升計(jì)劃
- 2024-2025學(xué)年度第一學(xué)期二年級(jí)語文寒假作業(yè)第二十一天
- 浙江省寧波市寧海縣2023-2024學(xué)年三年級(jí)上學(xué)期語文期末試卷
- 貸款用設(shè)備購銷合同范例
評(píng)論
0/150
提交評(píng)論