国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Linux內(nèi)核移植入門

tomorrowwu / 1401人閱讀

摘要:表示,不是用壓縮的。兩者的不同之處在于,解壓縮內(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.芯片廠商提供

內(nèi)核源碼目錄結(jié)構(gòu)

內(nèi)核配置

  1. Makefile 和 make

由主目錄 Makefile 和 子目錄 Makefile 共同指定內(nèi)核的編譯規(guī)則

2.通過 make menuconfig 及 Kconfig 修改內(nèi)核的配置單,從而自動完成內(nèi)核配置

選擇哪些文件被編譯進(jìn)內(nèi)核

主目錄Makefile

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

各子目錄Makefile

obj-y : 編譯進(jìn)內(nèi)核
obj- : 不編譯進(jìn)去
obj-m : 以模塊形式編譯

如何配置內(nèi)核?

1. 配置倉庫選取

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)于板子的文件

2.交叉編譯器的修改

回到內(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-
3.體系結(jié)構(gòu)體的選擇

將要移植的平臺的參考配置單文件拷貝到主目錄下:

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
4.修改配置文件

可以使用 make menuconfig 以桌面窗口形式對.config 文件進(jìn)行修改, 這比以文本方式修改.config更方便

關(guān)系: make menuconfig —解析Kconfig后修改—> .config —作用于—> Makefile
而且 make menuconfig中出現(xiàn)大量字符串,其來自解析的 Kconfig 文件

內(nèi)核編譯

  1. 將芯片廠商提供的配置單文件名更改為 .config
  2. 查看 Makefile中的交叉編譯器是否設(shè)置正確
  3. make menuconfig 設(shè)置 .config

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:

編譯結(jié)果:幾種linux內(nèi)核文件的區(qū)別

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和解壓縮程序組成的。

開發(fā)板上U-Boot啟動linux內(nèi)核

查看 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

內(nèi)核Kconfig語法使用

1.make menuconfig 是如何找到 Kconfig?

make menuconfig界面選中(*代表選中)配置項時,.config配置單中的配置項也會更改為 “y”(對應(yīng)的文件會被編譯進(jìn)內(nèi)核)

make menuconfig --> Kconfig —> Makefile xxx.c 的過程 是如何組織的?

  1. make menuconfig中查找串口驅(qū)動的 宏CONFIG_SERIAL_SAMSUNG 配置項:




  1. 宏CONFIG_SERIAL_SAMSUNG 在對應(yīng)的 Kconfig 中應(yīng)該有這樣的語法:

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)來了

2.Makefile 要編譯一個 .o 文件是如何在Kconfig中配置的?

即: Makefile .o —> Kconfig, 則可以倒著查找

添加驅(qū)動到內(nèi)核

概念

相比于裸機(jī)的驅(qū)動,內(nèi)核驅(qū)動需要很多冗余的信息:

裸機(jī)的硬件發(fā)生改變則驅(qū)動也會改變; 而內(nèi)核驅(qū)動則不會因為硬件改變而需要改變,因為其涉及一個復(fù)雜的驅(qū)動框架

如有驅(qū)動程序 myleddev.c 和應(yīng)用程序 myledtest.c

添加步驟

1.將我們開發(fā)的驅(qū)動 myleddev.c 放到能自述其意的目錄下,如 /drive/char/myled 目錄
2.在myled 目錄下增加并編輯 Makefile 文件,將 myleddev.c 和 Makefile 關(guān)聯(lián)起來:
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"
3. 使用 make menuconfig

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)核:

執(zhí)行應(yīng)用程序

1.將編譯后的內(nèi)核下載到開發(fā)板上

2.確定內(nèi)核是否運行了LED驅(qū)動

$ cat /proc/devices # devices文件記錄了內(nèi)核支持的設(shè)備信息

3.創(chuàng)建LED驅(qū)動程序與應(yīng)用程序直接銜接的設(shè)備節(jié)點

# mknode /dev/led1 c 253 1 # 創(chuàng)建設(shè)備節(jié)點,名為 /dev/led1

4.測試

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

相關(guān)文章

  • Docker 入門及安裝[Docker 系列-1]

    摘要:核心對名字空間的支持完全隔離了工作環(huán)境中應(yīng)用程序的視野,包括進(jìn)程樹網(wǎng)絡(luò)用戶與掛載文件系統(tǒng),而核心的提供資源隔離,包括存儲器與網(wǎng)絡(luò)。因此更為輕量快速和易于管理。 docker 如日中天,這不是單純的炒概念,docker 確確實實解決了開發(fā)與運維的痛點,因此在企業(yè)開發(fā)中得到了非常廣泛的使用,本文對于 docker 的這些基本知識點再做一些簡單回顧。 什么是 docker 根據(jù) wikip...

    Lin_R 評論0 收藏0
  • Docker入門安裝教程

    摘要:的安裝支持和系統(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...

    justCoding 評論0 收藏0
  • Docker入門(一)用hello world入門docker

    摘要:初識是什么是一個開源的應(yīng)用容器引擎,基于語言并遵從協(xié)議開源。容器是完全使用沙箱機(jī)制,相互之間不會有任何接口更重要的是容器性能開銷極低。命令為,如下由此可知,我們新打包的鏡像的為。登錄賬號再輸入自己的賬號密碼即可。 初識Docker Docker是什么? ??Docker 是一個開源的應(yīng)用容器引擎,基于?Go 語言并遵從Apache2.0協(xié)議開源。??Docker 可以讓開發(fā)者打包他們的...

    tolerious 評論0 收藏0
  • Docker入門學(xué)習(xí)

    摘要:如無論哪個服務(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)建一個輕量級的、...

    xiaodao 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<