丝袜美腿 自拍偷拍 国产 Mini2440之linux内核移植
发布日期:2024-10-08 21:12 点击次数:195
在上一节咱们还是先容了u-boot启动linux内核的过程。这一节咱们将对u-boot进行翻新丝袜美腿 自拍偷拍 国产,使其搭救linux-5.2.8版块内核启动。
linux kernel搭救多种硬件,所谓内核移植笼统的说,就是修改kernel中硬件关系的源码以适合我方的硬件。linux中硬件关系的代码主要集会在arch目次(体系缚构关系、单板关系)以及drivers目次(开发驱动)。linux的移植对于产业链高下流的企业来说,要作念的事情也不同,比如:
IP核厂商:以ARM为例,ARM认真提供教唆集以及搭救该教唆集的硬件达成——CPU核(公版)。ARM在移植kernel的本领,需要达成体系缚构关系的代码,比如kernel启动的汇编阶段; SOC厂商:以ARM阵营为例,SOC厂商基于ARM的CPU核(天然也有自研的),添加一些片表里设变成我方的SOC。况且,一般还会基于自家的SOC作念公版的开发板,从而便捷推论自家产物。因此SOC厂商移植kernel的本领需要作念的是,提供平台开发的驱动(即片表里设的驱动)、提供板级搭救代码(arch/arm/mach-xxx)。 外设芯片厂商:这里的外设芯片指的是诸如ADC、千般传感器芯片等,比如TI的at24c0x芯片,一个竣工的产物需要SOC+各路板载外设协同职责。外设芯片厂商为了推论我方的芯片(裁汰下流开发资本),需要为芯片提供多样环境的驱动能力,对于linux,他们要作念的就是为linux提供其芯片产物的驱动。 电子产物厂商:下流应用厂商主要作念有盘算整合(天然也有通吃全产业链的企业),即采购SOC+多样板载外设芯片,联想我方的电路板。他们要作念的是,参考SOC厂商的公版开发板的板级搭救代码,达成我方的板级搭救代码。对于片表里设,凭证SOC厂商的驱动来写相应的开发树;对于板载外设,凭证外设芯片厂商的驱动来写开发树。是以底层这块,下流厂商其实施展空间不大,底层搭救主要如故看上游厂商,下流厂商的要点在于行业和应用。因此,网上有下流厂商的底软开发者嘲谑我方是“开发树工程师”。不外,即就是不才游厂商职责,熟谙kernel的旨趣亦然相比贫瘠的,毕竟你不可保证任何本领只用毛糙修改就能完成职责请托。 一、u-boot参数建立咱们将u-boot-2016.05-crop,复制一份定名为:u-boot-2016.05-linux。
1.1 源码修改 1.1.1 启动参数建立在smdk2440.h(include/configs/smdk2440.h)文献中建立启动参数:
root:指定文献系统位置这里建立为NAND三号分区,也就是咱们根文献系统场所的分区; init:指定内核启动后履行的第一个应用能力; console:指定使用哪个末端,这里的 ttySAC0 指的就是串口0; 1.1.2 搭救yaffs2烧写绽开u-boot-2016.05-linux名堂,参加nand的呐喊文献cmd/nand.c,在do_nand函数里,有nand read或write的代码,而其中有对jffs2的搭救,却并莫得对yaffs2的搭救。
往日的老版块uboot是有对yaffs文献系统烧写的搭救的,于是咱们参考老版块的uboot代码,在do_nand函数里的nand write/read部分加上一段代码,如下:
在nand_help_text[]里添加nand write.yaffs的匡助信息:
nand_write_skip_bad函数里面也要修改,该函数位于drivers/mtd/nand/nand_util.c文献:
同期,在include/nand.h中添加WITH_YAFFS_OOB宏的界说:
临了在建立文献里include/configs/smdk2440.h添加CONFIG_CMD_NAND_YAFFS宏界说,编译烧写,此uboot还是搭救yaffs2文献系统的烧写。
1.1.3 启动呐喊建立在smdk2440.h文献中建立启动呐喊:
1.1.4 树立matchidlinux内核在启动时,是通过u-boot传入的机器码详情应启动哪种主张平台的。
u-boot在不树立machid环境变量时,u-boot会使用默许的机器id,默许id在board_init函数中树立,该函数位于board/samsung/smdk2440/smdk2440.c:
咱们搜索MACH_TYPE_SMDK2410:
咱们在arch/arm/include/asm/mach-types.h新增一滑:
在文献背面新增:
并修改board_init函数:
1.2 编译下载再行编译,下载u-boot到NAND FLASH:
需要阻扰编译u-boot使用的是arm-linux-gcc4.3.2不要使用高版块,高版块编译出来的u-boot可能运行不了。
1.3 问题处理等看了背面的内核编译,烧录内核到开发板,若是有问题再回过来看这里。
1.3.1 修改分区参数在Mini440之uboot移植之剪辑、分区与环境变量树立(五)中咱们也曾树立分区参数如下:
咱们将u-boot分区树立为512kb,咱们使用MiniTools下载u-boot、内核。
然后启动开发板,串口输出如下信息:
不错发现并莫得找到内核,这里咱们分析一下原因。
咱们凯旋烧入购买开发板时出厂的能力,然后启动linux:
咱们搜检linux启动时输出的日记信息:
不错发现分区情况和咱们树立的不一致。咱们发现内核肇端地址是在0x60000,那么我么修改咱们的分区建立include/configs/smdk2440.h:
同期修改u-boot环境变量的保存地址:
然后再行编译u-boot下载运行(需要阻扰的极少,若是咱们内核为zImage,应该使用go呐喊启动,uImage才是使用bootm呐喊启动):
再次编译u-boot:凯旋运行如下呐喊即可:
下载u-boot.bin、zImage_P35到NAND FLASH运行,发现还是动手解压内核了,诚然还有其他诞妄,然而咱们不错先忽略。
这里在将内核从NAND FLASH 读取出来时出现这么的诞妄
咱们再u-boot呐喊行模式下,尝试读取NAND 0x60000地址处数据,加载到内存:
发现出现相通的诞妄。咱们参考u-boot_2010.6 nandflash驱动透澈分析中的分析。底下进行具体分析nand read履行过程。
1.3.2 nand read 诞妄码-74履行nand read 呐喊后,其实是履行了nand_read_skip_bad(nand, off, &size,(u_char *)addr);
跳过坏块读函数的参数下里巴人,从哪读,读到哪去,读些许,以及一个全球句柄(包含nand的信息,举例有些许个块,块大小等)
咱们定位到nand_read_skip_bad函数,位于drivers/mtd/nand/nand_util.c文献:
这里会调用nand_read从nand读取数据,而nand_read又调用nand_do_read_ops,该函数位于drivers/mtd/nand/nand_base.c:
View CodeEBADMSG界说为74,不出丑出最终履行到了:
是以抛出了非常景况码-74。定位到ecc_fail树立为true的代码:
那么大约阅读一下这个代码,我猜思应该是nand_do_read_ops在履行底下函数时,出现了问题:
这里我凯旋在vs code搜索read_page,咱们很快定位到了nand_scan_tail这个函数,这个函数也位于drivers/mtd/nand/nand_base.c文献,
咱们凯旋定位到底下这段代码:
View Code还记的在Mini440之uboot移植之施行NAND启动(四)中咱们先容过board_nand_init函数,该函数开启了软件ecc校验:
因此:ecc->read_page = nand_read_page_swecc,nand_read_page_swecc在drivers/mtd/nand/nand_base.c文献中界说:
这个带有软件ecc校验的NAND页数据读取函数,这个函数在从NAND读完一页数据后会进行软件ecc校验,若是校验失败就会修改mtd->ecc_stats.failed,从而导致背面履行了:
在连气儿失败chip->read_retry次后,将会跳出轮回,不再进行NAND数据读取。
为了不抛出-74这个非常,咱们不错尝试关闭ecc校验,通过修改board_nand_init,注目掉底下代码,即关闭软件ecc:
此时nand->ecc.mode默许罗致NAND_ECC_NONE:
此时在进行按页读写时就不会进行软件ecc校验了。
咱们编译u-boot、烧写参加NAND,再次启动u-boot,指导Linux启动,此时诞妄信息变成了:
内核在运行的本领ecc校验失败了。背面咱们会我方生成uImage,而不是使用出厂自带的zImage。
1.4 测试NAND读取功能在u-boot指导内核启动前,咱们尝试按下键盘放荡键,参加u-boot呐喊行模式。
搜检NAND第一页数据:
不错凯旋读取NAND FLASH数据到内存来考证该数据:
运行遵守如下:丝袜美腿 自拍偷拍 国产
不错看到nand dump与nand read指定地址到内存中的数据是一样的。这也标明在关闭ecc校验的情况下,咱们能够料定移植的u-boot不错对NAND FLASH进行正确的读和写操作。
二、移植linux内核 2.1 内核源码下载内核源码下载地址为:https://www.kernel.org/,这里咱们不要下载最新的,最新的里面还是莫得s3c24xx系列的默许建立了:
也不错到内核镜像网址下载https://mirrors.edge.kernel.org/pub/linux/kernel/,这里下载速率更快。
若是下载速率太慢,无法下载,提供另一个连气儿:。
咱们这里下载linux-5.2.8版块,捏造机ubuntu系统运行:
将源码解压:
2.2 linux内核目次结构解压就不错取得一起linux内核源能力,目次结构如下:
底下列出了顶层目次下各级目次存放原则:
arch:体系缚构关系的代码,比如 arm、 avr32、 m68k 等,咱们咫尺用的是 ARM 芯片,是以只需要关爱 arm 文献夹即可; block:块开发关系的通用函数; crypto:常用加密和散列算法(如 AES、SHA等),还有一些压缩和CRC校验算法; drivers:总共的开发驱动能力,里面每一个子目次对应一类驱动能力,比如 drivers/block/ 为块开发驱动能力,drivers/char/为字符开发驱动能力,drivers/mtd/为nor flash、nand flash 等存储开发的驱动能力; Documentation:Linux内核的使用匡助文档; fs:Linux 搭救的文献系统的代码,每个子目次对应一种文献系统,比如 fs/jffs2/、fs/ext2/、fs/ext4/等; include:内核头文献,有基本头文献(存放在 include/linux/目次下)、多样驱动或功能部件的头文献(如 include/media/、include/video/、include/net等)、 多样体系关系的头文献(如 include/asm-generic/等); init:内核的运行化代码(不是系统的指导代码),其中的 main.c 文献中的 start_kernel 函数是内核指导后运行的第一个函数; ipc:进度间通讯的代码; kernel:内核管制的中枢代码; lib:内核用到的一些库函数代码,如 crc32.c、string.c、shal.c等,这类文献夹中的内容移植时基本不消管; mm:内存管制代码; net:相聚搭救代码,每个子目次对应子相聚的一个方面; samples:一些示例能力,如断点调试,功能测试等; scripts:用于建立、编译内核的剧本文献 security:安全、密钥关系的代码; sound:音频开发驱动能力; tools:器用类代码,比如 USB 传输等,连续会将 u-boot 下生成的mkimage器用放到此目次下; usr:忽略即可; virt:忽略即可; 2.3 建立Makefile修改顶层的 Makefile,绽开 Makefile 文献,找到底下语句:
修改为:
其中,ARCH 是指定主张平台为arm,CROSS_COMPILE是指定交叉编译器,这里指定的 是系统默许的交叉编译器,如要使用其它的,则要把编译器的全旅途在这里写出。
2.4 内核s3c2440_defconfig建立接下来要作念的就是内核建立、编译了。单板的默许建立文献在arch/arm/configs 目次下,若是莫得2440关系的默许建立,不错选定相比旁边的2410的建立修改,这里我凯旋选定s3c2410_defconfig,并莫得选定mini2440_defconfig。
建立文献s3c2410_defconfig搭救好多单板,包括2440、2410,其界说如下:
View Code在linux内核根目次下履行如下呐喊,履行完之后会在内核根目次下生成默许建立文献.config:
然后不错通过make menuconfig修改建立:
2.4.1 建立EABI编译属性因为arm-none-linux-gnueabi 4.8.3(这个版块的编译器背面会先容)使用了EABI样式,是以这就需要内核相通建立EABI编译属性:
修改完之后,保存文献,输入文献名:
在现时旅途下生成s3c2440_defconfig:
归档:
归档之后,下次若是需要再行编译建立凯旋运行make s3c2440_defconfig,幸免了再行进行menuconfig建立。
在arch/arm/mach-s3c24xx目次下有个mach-smdk2440.c文献,这个文献是三星厂商提供的smdk2440开发版对应的示例能力。背面咱们会对这个文献进行修改来适配Mini2440开发板。
2.5 源码修改 2.5.1 修改时钟频率s3c2440 搭救两种时钟晶振:12MHz 和 16MHz,我这个板子上用的是12MHz,是以修改 arch/arm/mach-s3c24xx/mach-smdk2440.c:
2.5.2 修改mtd分区绽开 arch/arm/mach-s3c24xx/common-smdk.c 文献,仿照u-boot的分区,修改代码如下:
256MB大小的NAND被分红四个分区:
0x00000000~0x00040000:256kb存放u-boot; 0x00040000~0x00060000: 128kb存放环境变量; 0x00060000~0x00460000:4MB存放linux内核; 0x00460000~0x10000000:剩下空间存放根文献系统;上头部分宏的界说位于 include/linux/mtd/partitions.h 文献中,如下所示:
2.5.3 关闭ecc软件校验linux内核在启动的本领回对NAND FLASH进行ecc校验,若是有坏块将会导致ecc覆按欠亨过,导致内核启动失败:
贬责门径是辞谢NAND FLASH进行软件ecc校验。
修改arch/arm/mach-s3c24xx/common-smdk.c文献:
将NAND_ECC_SOFT改为NAND_ECC_NONE,这个去掉ecc校验的问题,在内核中明确诠释是不忽视这么作念的,因为这么就等于忽略了对NAND FLASH坏块的检测。
2.5.4 树立matchidlinux内核在启动时,是通过u-boot传入的机器码详情应启动哪种主张平台的。
若何详情linux内核机器id呢?在linux-5.2.8/arch/arm/mach-s3c24xx/mach-smdk2440.c中,struct machine_desc界说如下:
显豁,SMDK2440使用的机器id是MACH_TYPE_S3C2440。具体的数字不错在arch/arm/tools/mach-types文献中找到(kernel在编译过程中会凭证此文献生成相应的头文献供源码使用),具体数字是0x16A。
这里需要修改为:
168是u-boot里树立的,这个机器码需要跟u-boot中的机器码相对应,要否则u-boot无法指导启动内核,若是你不知谈uboot中的机器码是些许,在uboot呐喊行中输入呐喊bdinfo搜检。
2.6 编译内核制作uImage先运行如下呐喊,搜检编译是否出错:
若是出现底下诞妄:
原因是libssl-dev莫得装配,使用sudo apt-get install libssl-dev来装配libssl-dev:
若是出现雷同底下的诞妄:
一般是由于较新的内核使用了新版块交叉编译器的特色,而我腹地装配的交叉编译器版块较低导致,需要升级版块,这个单独末节先容:
在内核根旅途下运行呐喊:
出现如下诞妄:
诠释枯竭 mkimage ,有两种贬责办法:
诈欺uboot生成mkimage器用,然后拷贝到/usr/bin 目次下 输入 sudo apt-get install u-boot-tools 呐喊在线装配;本文华纳第二种门径,输入呐喊:
2.7 arm-linux-gcc 4.8.3交叉编译环境装配(内核编译失败装配)我之前使用的为4.3.2版块,在编译高版块linux时出现诞妄,这里我将会将交叉编译环境升级到4.8.3:
编译器不错在ARM官网下载:https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads ,或者到下载。
选定编译器时有极少需要阻扰,咱们选定的是arm-none-linux-guneabi-gcc编译器:
arm-none-eabi-gcc (ARM architecture,no vendor,not target an operating system,complies with the ARM EABI): 用于编译 ARM 架构的裸机系统(包括 ARM Linux 的 boot、kernel,不适用编译 Linux 应用 Application), 一般稳妥 ARM7、Cortex-M 和 Cortex-R 内核的芯片使用,是以不搭救那些跟操作系统关系密切的函数, 比如fork(2),它使用的是 newlib 这个专用于镶嵌式系统的C库。 arm-none-linux-gnueabi-gcc (ARM architecture, no vendor, creates binaries that run on the Linux operating system, and uses the GNU EABI) :主要用于基于ARM架构的Linux系统,可用于编译 ARM 架构的 u-boot、Linux内核、linux应用等。 arm-none-linux-gnueabi基于GCC,使用Glibc库,经过 Codesourcery 公司优化过推出的编译器。 arm-none-linux-gnueabi-xxx 交叉编译器用的浮点运算超越优秀。一般ARM9、ARM11、Cortex-A 内 核,带有 Linux 操作系统的会用到。此外,对于EABI和ABI亦然相比贫瘠的,EABI(镶嵌式应用二进制接口)和 ABI(应用能力二进制接口)皆是二进制接口的程序,然而它们的应用场景不同;
ABI 连续指操作系统、处理器等平台在二进制级别上的接口程序。它界说了操作系统内核、库函数和应用能力之间的接口程序,如函数调用、参数传递、复返值、系统调用等等。具体来说,一个 ABI 界说了编译器生成的可履行文献需要满足的程序,以便在特定平台和特定环境下运行。举例,x86 架构上的 Windows ABI 和 Linux ABI 在一些细节上可能有所不同,因为它们使用了不同的寄存器、调用商定等等。在不同 ABI 之间移植代码时,需要阻扰这些各异并进行相应的修改; EABI 则是挑升针对镶嵌式系统的 ABI 程序。与通用的 ABI 不同,EABI 更关注于镶嵌式系统对于可移植性和交叉编译的需求。它界说了编译器生成的二进制代码与镶嵌式系统之间的接口程序,包括函数调用、参数传递、复返值等方面,并搭救软件浮点数运算。因此,通过 EABI 的程序,不错保证在不同的镶嵌式系统之间生成的二进制代码具有致密的可移植性和兼容性。这么,在从一个镶嵌式平台迁徙到另一个平台时,只需要再行编译源代码即可,而不需要修改能力的源代码。总之,ABI 和 EABI 皆是二进制接口程序,它们皆界说了二进制能力和操作系统之间的接口程序,然而应用场景不同。ABI 更关注通用平台上的二进制接口程序,而 EABI 则是挑升针对镶嵌式系统开发的二进制接口程序。
更多不同编译器之间的远离参考ARM交叉编译器GNUEABI、NONE-EABI、ARM-EABI、GNUEABIHF等的远离。
由于官网下载相比慢,这里咱们凯旋从gitee高下载arm-none-linux-gnueabi 4.8.3:
将其拷贝到/usr/local/arm旅途下:
这么在/usr/local/arm下就有咱们装配的三个不同版块的编译器:
接下来建立系统环境变量,把交叉编译器用链的旅途添加到环境变量PATH中去,这么就不错在职何目次下使用这些器用:
编著profile文献,添加环境变量:
添加如下代码:
同期注目掉4.3.2、4.4.3版块的建立:
接下来使用呐喊:source /etc/profile,使修改后的profile文献收效。
由于在/usr/local/arm/4.8.3/bin下莫得arm-linux-gcc、arm-linux-ld、arm-linux-strip连气儿,是以咱们我方创建软连气儿:
然后,使用呐喊:arm-linux-gcc -v搜检现时交叉编译链器用的版块信息:
若是出现如下诞妄:
这是因为64位的系统枯竭32位的库导致的。贬责办法:
这么就不错进行交叉编译了。
三、内核启动测试若是咱们需要修改linux内核代码再行编译,凯旋运行如下呐喊即可:
在 arch/arm/boot 目次下生成 uImage。
若是进行计帐职责:
阻扰:难忘编译linux内核时将arm-linux-gcc树立为4.8.3版块。
3.1 树立u-boot环境变量最初将u-boot烧写进NAND。在使用u-boot启动之后,内核启动之前,还有两件事情要作念:
树立启动参数,若是u-boot smdk2440.h中还是建立好了,这一步忽略:
这里ttySAC0代表的是UART0字符开发/dev/ttySAC0,并不是粗率指定的,是要凭证本色UART驱动来指定。相通/dev/mtdblock3代表的是rootfs根文献系统场所的分区,亦然凭证本色块开发驱动来指定。
树立机器id为0xA8,若是u-boot MACH_TYPE_SMDK2440还是建立好了,这一步忽略:
3.2 烧录内核烧录内核有多种门径,底下咱们就先容两种常见的门径。
3.2.1 通过tftp烧录内核咱们搭建的tftp分享旅途为/work/tftpboot。将uImage复制到该旅途下:
三级片在线观看树立开发板ip地址,从而不错使用相聚作事:
树立tftp作事器地址,也就是咱们ubuntu作事器地址:
下载内核到内存,并写NAND FLASH:
运行遵守如下:
其中nand擦除呐喊不错替换成:
地址树立为0x60000,大小为0x400000。是因为我的u-boot分区建立为:
可知256k+128k=400k,对应肇端地址0x0060000。
3.2.2 通过MiniTools烧录内核除了tftp烧录内核外,咱们不错通过MiniTools器用烧录内核。
3.3 内核启动非常处理开发板罗致NAND启动,u-boot指导内核启动,可能会出现一些诞妄,针对一些常见诞妄处理如下。
3.3.1 machid树立诞妄若是linux内核机器id树立不正确,串口将会输出:
针对这种问题,修改machid即可。
3.3.2 NAND FLASH装假坏块若是开发板启动后出现如下诞妄:
咱们发现NAND FLASH坏块数量非常,而且皆是连着坏的,况且使用nand dump呐喊搜检flash内容,超越有端正,很可能是NAND FLASH好多块区域被标志为坏块了。
贬责门径:在u-boot菜单模式下输入以下呐喊,擦除全片即可:
3.4 肤浅启动 View Code若是输出信息如上所示,标明内核启动肤浅,不才一节咱们将先容根文献系统的制作。
四、内核裁切由于咱们默许建立编译生成的内核文献是相比大,大致有3.5M的样式,这其中咱们编译了许多毋庸的建立。
4.1 单板裁切比如,默许编译的的内核,搭救了多种单板。
履行make menuconfig,去除饱胀的单板:
System Type --->
SAMSUNG S3C24XX SoCs Support --->保留如下建立:
如上图所示,SoC下只选定S3C2440,单板文献下只选定SMDK2440关系。
4.2 文献系统裁切再行make menuconfig,参加File systems,去掉:
[] Second extended fs support [] The Extended 3 (ext3) filesystem [] The Extended 4 (ext4) filesystem CD-ROM/DVD Filesystems [] ISO 9660 CDROM file system support更多裁切不错参考S3C2440移植linux3.4.2内核之内核剪辑。
裁切完之后,难忘保存建立:
五、代码下载Young / s3c2440_project[u-boot-2016.05-linux、linux-5.2.8]
参考著作
[1]七,移植linux-3.19内核
[2]S3C2440 移植最新5.2linux内核
[3]s3c2440 linux3.4.2移植札记
[4]S3C2440移植linux3.4.2内核之内核框架先容及毛糙修改
[5]u-boot-2016.03 在mini2440移植之nandflash读写
[6]TQ2440(S3C2440)移植Linux-4.0.1内核全过程
[7]移植linux-5.4.26到jz2440
[8]u-boot-2016.03 搭救yaffs2文献系统烧写之添加nand write.yaffs2呐喊
[9]linux4.9.2内核在mini2440上的移植丝袜美腿 自拍偷拍 国产
相关资讯