摘要:表示,不是用壓縮的。兩者的不同之處在于,解壓縮內(nèi)核到低端內(nèi)存第一個,解壓縮內(nèi)核到高端內(nèi)存以上。如果內(nèi)核比較小,那么采用或都行,如果比較大應(yīng)該用。使得內(nèi)核可以啟動文件的拷貝或指向的鏈接。
linux內(nèi)核特性:
1.可移植性,支持的硬件平臺廣泛
2.超強(qiáng)的網(wǎng)絡(luò)功能
3.多任務(wù)多用戶系統(tǒng)
4.模塊化的設(shè)計
五大子系統(tǒng):
1.進(jìn)程管理子系統(tǒng)
2.內(nèi)存管理子系統(tǒng)
3.文件系統(tǒng)子系統(tǒng)
4.網(wǎng)絡(luò)協(xié)議子系統(tǒng)
5.設(shè)備管理子系統(tǒng)
獲取linux內(nèi)核:
1.內(nèi)核官方發(fā)布點
2.芯片廠商提供
由主目錄 Makefile 和 子目錄 Makefile 共同指定內(nèi)核的編譯規(guī)則
2.通過 make menuconfig 及 Kconfig 修改內(nèi)核的配置單,從而自動完成內(nèi)核配置
選擇哪些文件被編譯進(jìn)內(nèi)核
Makefile文件位置: linux-3.0.8/Makefile
以下為Makefile文件中的部分代碼,根據(jù)arch平臺,配置包含子目錄的頭文件目錄和子目錄的Makefile
根據(jù)SUBARCH配置 SRCARCH,SUBARCH默認(rèn) X86
export KBUILD_BUILDHOST := $(SUBARCH)ARCH ?= $(SUBARCH)CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%) // 交叉編譯器設(shè)置# Architecture as present in compile.hUTS_MACHINE := $(ARCH)SRCARCH := $(ARCH)# Additional ARCH settings for x86ifeq ($(ARCH),i386) SRCARCH := x86endififeq ($(ARCH),x86_64) SRCARCH := x86endif
包含子目錄的頭文件目錄 arch/arm/include:
-I$(srctree)/arch/$(hdr-arch)/include
包含子目錄 arch/arm/Makefile 文件:
include $(srctree)/arch/$(SRCARCH)/Makefile
SRCARCH = arm
hdr-arch arm
obj-y : 編譯進(jìn)內(nèi)核
obj- : 不編譯進(jìn)去
obj-m : 以模塊形式編譯
1、SUBARCH 默認(rèn)就是X86的,內(nèi)容默認(rèn)配置安裝X86
ARCH 這個變量改為 arm 單詞
交叉編譯 CROSS_COMPILE:在一種計算機(jī)環(huán)境中運行的編譯程序,能編譯出在另外一種環(huán)境下運行的代碼
2、哪些文件會被編譯?
這些文件是否被編譯是由子目錄中的Makfile文件中 CONFIG_xxx 變量是否被定義而決定(obj-y編譯進(jìn)內(nèi)核,obj-m以模塊形式編譯)
主Makefile是如何將這些文件引入到我們的整個環(huán)境變量中?通過配置單 中定義的 CONFIG_xxx
3、配置單: 由芯片商提供BSP時會提供參考配置單,能夠大大簡化我們的配置過程
cs@cspc:/mnt/d/linux/linux-3.0.8/arch/arm$ ls # arm架構(gòu)下的子目錄Kconfig common mach-at91 mach-dove mach-gemini mach-iop32x mach-kirkwood mach-mmp mach-netx mach-orion5x mach-s3c2400 mach-s3c2443 mach-s5pv210 mach-spear6xx mach-versatile nwfpe plat-omap plat-samsung vfpKconfig-nommu configs mach-bcmring mach-ebsa110 mach-h720x mach-iop33x mach-ks8695 mach-msm mach-nomadik mach-pnx4008 mach-s3c2410 mach-s3c24a0 mach-sa1100 mach-tcc8k mach-vexpress oprofile plat-orion plat-spearKconfig.debug include mach-clps711x mach-ep93xx mach-imx mach-ixp2000 mach-l7200 mach-mv78xx0 mach-nuc93x mach-pxa mach-s3c2412 mach-s3c64xx mach-shark mach-tegra mach-vt8500 plat-iop plat-pxa plat-tccMakefile kernel mach-cns3xxx mach-exynos4 mach-integrator mach-ixp23xx mach-loki mach-mx5 mach-omap1 mach-realview mach-s3c2416 mach-s5p64x0 mach-shmobile mach-u300 mach-w90x900 plat-mxc plat-s3c24xx plat-versatileboot lib mach-davinci mach-footbridge mach-iop13xx mach-ixp4xx mach-lpc32xx mach-mxs mach-omap2 mach-rpc mach-s3c2440 mach-s5pc100 mach-spear3xx mach-ux500 mm plat-nomadik plat-s5p toolscs@cspc:/mnt/d/linux/linux-3.0.8/arch/arm$ cd configs/cs@cspc:/mnt/d/linux/linux-3.0.8/arch/arm/configs$ ls # 配置單所在目錄 configsacs5k_defconfig at91sam9260ek_defconfig cerfcube_defconfig cpu9g20_defconfig exynos4_defconfig h7202_defconfig ixp4xx_defconfig magician_defconfig mx3_defconfig nuc960_defconfig pxa168_defconfig s3c2410_defconfig spear3xx_defconfig usb-a9260_defconfigacs5k_tiny_defconfig at91sam9261_defconfig cm_x2xx_defconfig da8xx_omapl_defconfig ezx_defconfig hackkit_defconfig jornada720_defconfig mainstone_defconfig mx51_defconfig omap1_defconfig pxa255-idp_defconfig s3c6400_defconfig spear6xx_defconfig versatile_defconfigafeb9260_defconfig at91sam9263_defconfig cm_x300_defconfig davinci_all_defconfig footbridge_defconfig imote2_defconfig kirkwood_defconfig mini2440_defconfig mxs_defconfig omap2plus_defconfig pxa3xx_defconfig s5p64x0_defconfig spitz_defconfig vexpress_defconfigag5evm_defconfig at91sam9g20ek_defconfig cns3420vb_defconfig dove_defconfig fortunet_defconfig integrator_defconfig ks8695_defconfig mmp2_defconfig neponset_defconfig orion5x_defconfig pxa910_defconfig s5pc100_defconfig stamp9g20_defconfig viper_defconfigam200epdkit_defconfig at91sam9rlek_defconfig colibri_pxa270_defconfig ebsa110_defconfig g3evm_defconfig iop13xx_defconfig lart_defconfig msm_defconfig netwinder_defconfig palmz72_defconfig qil-a9260_defconfig s5pv210_defconfig tct_hammer_defconfig xcep_defconfigap4evb_defconfig at91x40_defconfig colibri_pxa300_defconfig edb7211_defconfig g4evm_defconfig iop32x_defconfig loki_defconfig mv78xx0_defconfig netx_defconfig pcm027_defconfig raumfeld_defconfig sam9_l9260_defconfig tegra_defconfig zeus_defconfigassabet_defconfig badge4_defconfig collie_defconfig em_x270_defconfig h3600_defconfig iop33x_defconfig lpd270_defconfig mx1_defconfig nhk8815_defconfig pcontrol_g20_defconfig realview-smp_defconfig shannon_defconfig trizeps4_defconfigat91cap9adk_defconfig bcmring_defconfig corgi_defconfig ep93xx_defconfig h5000_defconfig ixp2000_defconfig lubbock_defconfig mx21_defconfig nuc910_defconfig pleb_defconfig realview_defconfig shark_defconfig u300_defconfigat91rm9200_defconfig cam60_defconfig cpu9260_defconfig eseries_pxa_defconfig h7201_defconfig ixp23xx_defconfig mackerel_defconfig mx27_defconfig nuc950_defconfig pnx4008_defconfig rpc_defconfig simpad_defconfig u8500_defconfig
配置單文件的后綴 “_defconfig” 表示默認(rèn)配置,且每個配置單對應(yīng) arm 架構(gòu)下的目錄,如 “ixp2000_defconfig” 對應(yīng)
“mach-ixp2000”
配置單內(nèi)容如下(為y則代表其對應(yīng)的文件會被編譯進(jìn)內(nèi)核):
cs@cspc:/mnt/d/linux/linux-3.0.8/arch/arm/configs$ cat s5pv210_defconfigCONFIG_EXPERIMENTAL=yCONFIG_SYSFS_DEPRECATED_V2=yCONFIG_BLK_DEV_INITRD=yCONFIG_KALLSYMS_ALL=yCONFIG_MODULES=yCONFIG_MODULE_UNLOAD=y# CONFIG_BLK_DEV_BSG is not set...
我們將將配置單導(dǎo)出到內(nèi)核的主目錄下 .config
4、修改defconfig 配置單變成適應(yīng)于板子的文件
回到內(nèi)核的主目錄,修改Makefile
修改以下兩行:
ARCH ?= $(SUBARCH) # 設(shè)置架構(gòu)體系, 如直接設(shè) arm;也可以在make中修改CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%) # 設(shè)置交叉編譯器
修改后的結(jié)果如:
ARCH ?= arm CROSS_COMPILE ?= /opt/FriendlyARM/toolschain/4.5.1/bin/arm-linux-
將要移植的平臺的參考配置單文件拷貝到主目錄下:
cs@cspc:/mnt/d/linux/linux-3.0.8$ cp arch/arm/configs/s5pv210_defconfig .configcs@cspc:/mnt/d/linux/linux-3.0.8$ ls -a. .. .config .gitignore .mailmap COPYING CREDITS Documentation Kbuild Kconfig MAINTAINERS Makefile README REPORTING-BUGS arch block crypto drivers firmware fs include init ipc kernel lib mm net samples scripts security sound tools usr virt
可以使用 make menuconfig 以桌面窗口形式對.config 文件進(jìn)行修改, 這比以文本方式修改.config更方便
關(guān)系: make menuconfig —解析Kconfig后修改—> .config —作用于—> Makefile
而且 make menuconfig中出現(xiàn)大量字符串,其來自解析的 Kconfig 文件
4.make編譯文件
內(nèi)核編譯(make)之后會生成兩個文件,一個Image,一個zImage,
其中Image為內(nèi)核映像文件,而zImage為內(nèi)核的一種映像壓縮文件,Image大約為4M,而zImage不到2M
uImage又是什么的?
它是uboot專用的映像文件,它是在zImage之前加上一個長度為64字節(jié)的“頭”,說明這個內(nèi)核的版本、加載位置、生成時間、大小等信息;其0x40之后與zImage沒區(qū)別。
生成uImage文件:
1.首先在uboot的/tools目錄下尋找mkimage文件,把其copy到系統(tǒng)/usr/local/bin目錄下,這樣就完成制作工具
2.在內(nèi)核目錄下運行make uImage,如果成功,便可以在arch/arm/boot/目錄下發(fā)現(xiàn)uImage文件,其大小比zImage多64個字節(jié)
有了uImage頭部的描述, u-boot就知道對應(yīng)Image的信息, 如果沒有頭部則需要自己手動去設(shè)置那些參數(shù)
vmlinum --> Image --> zImage --> uImage:
1、vmlinux :編譯出來后未壓縮最原始的elf內(nèi)核文件,該文件不能燒寫到flash中
2、Image: vmlinux 經(jīng)過 OBJCOPY 之后會產(chǎn)生的文件,比較大,但已經(jīng)可以具備燒寫到flash
2、zImage :Image經(jīng)過gzip壓縮后的文件。
3、bzImage:bz表示“big zImage”,不是用bzip2壓縮的。兩者的不同之處在于,zImage解壓縮內(nèi)核到低端內(nèi)存(第一個640K),bzImage解壓縮內(nèi)核到高端內(nèi)存(1M以上)。如果內(nèi)核比較小,那么采用zImage或bzImage都行,如果比較大應(yīng)該用bzImage。
4、uImage : U-boot專用的映像文件,它是在zImage之前加上一個長度為0x40的TAG。使得內(nèi)核可以啟動
5、vmlinuz: bzImage/zImage文件的拷貝或指向bzImage/zImage的鏈接。
6、initrd ,: “initial ramdisk”的簡寫。一般被用來臨時的引導(dǎo)硬件到實際內(nèi)核vmlinuz能夠接管并繼續(xù)引導(dǎo)的狀態(tài)
一般情況下都在生成vmlinux后,再對內(nèi)核進(jìn)行壓縮成為zImage,壓縮的目錄是kernel/arch/arm/boot。
下載到 flash 中的是壓縮后的zImage文件,zImage是由壓縮后的vmlinux和解壓縮程序組成的。
查看 2440 的 datasheet , 發(fā)現(xiàn)內(nèi)存映射的基址是 0x3000 0000 , 那么0x30008000 又是如何來的呢?
在內(nèi)核文檔kernel/Document/arm/Booting 文件中有:
Calling the kernel image
Existingboot loaders: MANDATORY New boot loaders: MANDATORY There are two options for calling the kernel zImage. If the zImage is stored inflash, and is linked correctly to be run from flash, then it is legal for the boot loader to call the zImage in flashdirectly. The zImage may also be placed in system RAM (at any location) and called there.Note that the kernel uses 16K of RAM below the image to store page tables. The recommended placement is 32KiBinto RAM.
看來在image下面用了32K(0x8000)的空間存放內(nèi)核頁表,0x30008000 就是 2440 的內(nèi)核在 RAM 中的啟動地址,這個地址就是這么來的
啟動內(nèi)核:
1、下載uImage.bin到SDRAM的0x30008000處,tftp是一個類似于ftp的下載軟件,在uboot的shell下,輸入:
tftp 0x30008000 uImage
2、啟動內(nèi)核,從0x30008000
bootm 0x30008000
make menuconfig界面選中(*代表選中)配置項時,.config配置單中的配置項也會更改為 “y”(對應(yīng)的文件會被編譯進(jìn)內(nèi)核)
make menuconfig --> Kconfig —> Makefile xxx.c 的過程 是如何組織的?
config SERIAL_SAMSUNG # make menuconfig運行時會在 .config 中自動生成 CONFIG_SERIAL_SAMSUNG 配置項
3.查找 Samsung SoC serial support 關(guān)鍵字,獲得所在的Kconfig文件:
4.查看Kconfig文件獲得 CONFIG_SERIAL_SAMSUNG 對應(yīng)的 "config SERIAL_SAMSUNG"語法:
5.在Kconfig的同級目錄下查看Makefile文件中的 “CONFIG_SERIAL_SAMSUNG” 配置項:
這里就將 samsung.c 文件編譯進(jìn)來了
即: Makefile .o —> Kconfig, 則可以倒著查找
相比于裸機(jī)的驅(qū)動,內(nèi)核驅(qū)動需要很多冗余的信息:
裸機(jī)的硬件發(fā)生改變則驅(qū)動也會改變; 而內(nèi)核驅(qū)動則不會因為硬件改變而需要改變,因為其涉及一個復(fù)雜的驅(qū)動框架
如有驅(qū)動程序 myleddev.c 和應(yīng)用程序 myledtest.c
obj-$(CONFIG_MYLEDTEST) += myleddev.o // 前綴必須為 "CONFIG_",如果$(CONFIG_MYLEDTEST)為y,即"obj-y"則指示編譯器將myleddev.c被編譯進(jìn)內(nèi)核
在myled目錄的上級目錄的Makefile中添加:
obj-y += myled/ # 內(nèi)核會以myled目錄作為下一個目標(biāo)進(jìn)入或者obj-$(CONFIG_MYLEDTEST) += myled/ # 需要將 CONFIG_MYLEDTEST 配置項設(shè)置為 "y"
1.在myled目錄下增加并編輯 Kconfig 文件:
menu "my char device"config MYLEDTEST bool "Support myled device driver" help Support led device driver for S5PV210endmenu
2.在上級目錄的 Kconfig 文件中包含子目錄 myled 的 Kconfig文件:
source "drivers/char/myled/Kconfig"
3.使用make menuconfig將.config配置單中的 CONFIG_MYLEDTEST 配置為 y:
使用 make uImage 將驅(qū)動編譯進(jìn)內(nèi)核,目錄下驅(qū)動對應(yīng)的 .o 文件則代表驅(qū)動成功編譯進(jìn)內(nèi)核:
$ cat /proc/devices # devices文件記錄了內(nèi)核支持的設(shè)備信息
# mknode /dev/led1 c 253 1 # 創(chuàng)建設(shè)備節(jié)點,名為 /dev/led1
1.需要將應(yīng)用程序放在開發(fā)板上運行,可以先將PC的目錄掛載到開發(fā)板的 /mnt 下:
1.PC開啟 ntf服務(wù), netstat -tua | grep nfs: 檢查ntf服務(wù)是否開啟
2.exportfs 查看PC當(dāng)前 NFS 共享的文件系統(tǒng)列表
3.將共享目錄掛載到開發(fā)板的 /mnt 下(注意開發(fā)板要設(shè)置IP地址): mount -t nfs -o nolock 192.168.10.10:/work/ /mnt
2.將應(yīng)用程序復(fù)制到共享目錄下
3.PC上對應(yīng)用程序進(jìn)行交叉編譯
arm-linux-gcc -o ledtest myledtest.c
4.開發(fā)板上執(zhí)行應(yīng)用程序
./ledtest
添加驅(qū)動到內(nèi)核的過程:
https://www.youtube.com/watch?v=qNeLmPCK7xE&list=PLljKjXpjNpgdY8fNIhHQG0ErUDldOCQxh&index=12
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/124034.html
摘要:核心對名字空間的支持完全隔離了工作環(huán)境中應(yīng)用程序的視野,包括進(jìn)程樹網(wǎng)絡(luò)用戶與掛載文件系統(tǒng),而核心的提供資源隔離,包括存儲器與網(wǎng)絡(luò)。因此更為輕量快速和易于管理。 docker 如日中天,這不是單純的炒概念,docker 確確實實解決了開發(fā)與運維的痛點,因此在企業(yè)開發(fā)中得到了非常廣泛的使用,本文對于 docker 的這些基本知識點再做一些簡單回顧。 什么是 docker 根據(jù) wikip...
摘要:的安裝支持和系統(tǒng),置于安裝過程大家可以去查看官方的文檔,也可以搜索別的教程,需要一點基礎(chǔ)。注意我們是安裝的,是用于商業(yè)模式的。 Dokcer介紹: Docker是一種容器相關(guān)的技術(shù),簡單來說你可以把它當(dāng)做一個微型的獨立系統(tǒng),在這個系統(tǒng)里面運行各種軟件,然后又在linux服務(wù)器上或者是電腦上運行這個系統(tǒng),這個系統(tǒng)就被稱為Docker容器,而運行Docker容器的機(jī)器就被稱為宿主機(jī)。Doc...
摘要:初識是什么是一個開源的應(yīng)用容器引擎,基于語言并遵從協(xié)議開源。容器是完全使用沙箱機(jī)制,相互之間不會有任何接口更重要的是容器性能開銷極低。命令為,如下由此可知,我們新打包的鏡像的為。登錄賬號再輸入自己的賬號密碼即可。 初識Docker Docker是什么? ??Docker 是一個開源的應(yīng)用容器引擎,基于?Go 語言并遵從Apache2.0協(xié)議開源。??Docker 可以讓開發(fā)者打包他們的...
摘要:如無論哪個服務(wù)器,下載的文件內(nèi)容是一樣的。如果需要啟動,通過命令執(zhí)行完后,再打開文件,可以看到的了。 docker的官網(wǎng):https://www.docker.com/官方文檔:https://docs.docker.com/github: https://github.com/docker/lab... Docker類似虛擬機(jī),是一個開源的引擎,可以輕松的為任何應(yīng)用創(chuàng)建一個輕量級的、...
閱讀 1402·2021-11-22 09:34
閱讀 1377·2021-09-22 14:57
閱讀 3400·2021-09-10 10:50
閱讀 1370·2019-08-30 15:54
閱讀 3689·2019-08-29 17:02
閱讀 3471·2019-08-29 12:54
閱讀 2610·2019-08-27 10:57
閱讀 3315·2019-08-26 12:24