kernel(三):kernel移植

        本文主要探讨210官方kernel移植。

配置文件选择

    选择配置文件smdkv210_android_defconfig(arch/arm/configs)

修改主Makefile

    配置cpu架构和交叉编译工具链

    vim MakefileARCH            ?= armCROSS_COMPILE   ?= /root/arm-2009q3/bin/arm-none-linux-gnueabi-

初步编译烧录

ubuntu:make smdkv210_android_defconfigmake -j4cp -r arch/arm/boot/zImage ~/tftp/uboot:tftp 30008000 zImagebootm 30008000

        结果显示(无法启动): 

一阶段移植(head.s)

        初步移植未有kernel信息打印则说明一阶段(汇编)异常

        led调试一阶段,添加led熄灭代码逐步测试(初始led亮)

        led亮且未显示解压zImage信息则解压部分异常(实际为物理地址错误)

vim arch/arm/kernel/head.s/** Kernel startup entry point.* ---------------------------** This is normally called from the decompressor code.  The requirements* are: MMU = off, D-cache = off, I-cache = dont care, r0 = 0,* r1 = machine nr, r2 = atags pointer.** This code is mostly position independent, so if you link the kernel at* 0xc0008000, you call this at __pa(0xc0008000).** See linux/arch/arm/tools/mach-types for the complete list of machine* numbers for r1.** We're trying to keep crap to a minimum; DO NOT add any machine specific* crap here - that's what the boot loader (or in extreme, well justified* circumstances, zImage) is for.*/__HEAD
ENTRY(stext)setmode PSR_F_BIT | PSR_I_BIT | SVC_MODE, r9 @ ensure svc mode//test bl led_off@ and irqs disabledmrc     p15, 0, r9, c0, c0              @ get processor idbl      __lookup_processor_type         @ r5=procinfo r9=cpuidmovs    r10, r5                         @ invalid processor (r5=0)?beq     __error_p                       @ yes, error 'p'bl      __lookup_machine_type           @ r5=machinfomovs    r8, r5                          @ invalid machine (r5=0)?beq     __error_a                       @ yes, error 'a'bl      __vet_atagsbl      __create_page_tables/** The following calls CPU specific code in a position independent* manner.  See arch/arm/mm/proc-*.S for details.  r10 = base of* xxx_proc_info structure selected by __lookup_machine_type* above.  On return, the CPU will be ready for the MMU to be* turned on, and r0 will hold the CPU control register value.*/ldr     r13, __switch_data              @ address to jump to after@ mmu has been enabledadr     lr, BSYM(__enable_mmu)          @ return (PIC) addressARM(   add     pc, r10, #PROCINFO_INITFUNC     )THUMB( add     r12, r10, #PROCINFO_INITFUNC    )THUMB( mov     pc, r12                         )
ENDPROC(stext)//led offled_off:ldr r3, =0x11111111ldr r4, = 0xE0200240str r3, [r4]ldr r3, =0xffldr r4, =0xE0200244str r3, [r4]mov pc, lr

        修改物理地址

#define KERNEL_RAM_VADDR	(PAGE_OFFSET + TEXT_OFFSET)
#define KERNEL_RAM_PADDR	(PHYS_OFFSET + TEXT_OFFSET)(arch/arm/include/asm/memory.h)#define PAGE_OFFSET        UL(CONFIG_PAGE_OFFSET)
(.config)CONFIG_PAGE_OFFSET=0xC0000000修改为(arch/arm/mach-s5pv210/include/mach/memory.h)
#if defined(CONFIG_MACH_SMDKV210)
#define PHYS_OFFSET             UL(0x30000000)
#else
#define PHYS_OFFSET             UL(0x30000000)
#endif

        修改解压地址
 

vim  arch/arm/mach-spv210/Makefile.boot# override for SMDKV210
zreladdr-$(CONFIG_MACH_SMDKV210)    := 0x30008000
params_phys-$(CONFIG_MACH_SMDKV210)    := 0x30000100

 

        内核机器码确定分析
            MACHINE_START宏定义机器码数据结构(硬件信息及其相关初始化函数等)
            每个mach-xxx.c文件定义一个机器码machine_desc结构体变量且结构体变量被定义到段(.arch.info.init)    

(arch/arm/mach-s5pv210/s5pc110.c)#ifdef CONFIG_MACH_SMDKC110MACHINE_START(SMDKC110, "SMDKC110")#elif CONFIG_MACH_SMDKV210MACHINE_START(SMDKV210, "SMDKV210")#endif/* Maintainer: Kukjin Kim <kgene.kim@samsung.com> */.phys_io    = S3C_PA_UART & 0xfff00000,.io_pg_offst    = (((u32)S3C_VA_UART) >> 18) & 0xfffc,.boot_params    = S5P_PA_SDRAM + 0x100,.init_irq    = s5pv210_init_irq,.map_io        = smdkc110_map_io,.init_machine    = smdkc110_machine_init,.timer        = &s5p_systimer,MACHINE_END(.config)CONFIG_MACH_SMDKV210=y# CONFIG_MACH_SMDKC110 is not set(arch/arm/include/asm/mach/arch.h)#define MACHINE_START(_type,_name)            \static const struct machine_desc __mach_desc_##_type    \__used                            \__attribute__((__section__(".arch.info.init"))) = {    \.nr        = MACH_TYPE_##_type,        \.name        = _name,#define MACHINE_END                \
};推导出():
static const struct machine_desc __mach_desc_SMDKV210    \__used                            \__attribute__((__section__(".arch.info.init"))) = {    \.nr        = MACH_TYPE_SMDKV210,        \.name        = "SMDKV210",.phys_io    = S3C_PA_UART & 0xfff00000,.io_pg_offst    = (((u32)S3C_VA_UART) >> 18) & 0xfffc,.boot_params    = S5P_PA_SDRAM + 0x100,.init_irq    = s5pv210_init_irq,.map_io        = smdkv210_map_io,.init_machine    = smdkv210_machine_init,.timer        = &s5p_systimer,
};

二阶段 

        修改电源异常

                程序在dev_driver_string或max8698_pmic_probe异常
                max8698_pmic_probe为电源管理IC驱动安装函数,210未使用电源IC

                make menuconfig取消max8698编译进内核

        修改网卡异常

                     修改网卡寄存器配置(移植mach-x210.c)
    

smdkc110_machine_init==>smdkc110_dm9000_set#ifdef CONFIG_DM9000
static void __init smdkc110_dm9000_set(void)
{unsigned int tmp;s3c_gpio_cfgpin(S5PV210_GPH1(2), S3C_GPIO_INPUT);s3c_gpio_setpull(S5PV210_GPH1(2), S3C_GPIO_PULL_NONE);int ret = gpio_request(S5PV210_GPH1(2), "GPH1");if(ret)printk("mach-x210: request gpio GPH1(2) fail");else{s3c_gpio_cfgpin(S5PV210_GPH1(2), 0xf);s3c_gpio_setpull(S5PV210_GPH1(2), S3C_GPIO_PULL_NONE);}tmp = ((0<<28)|(0<<24)|(5<<16)|(0<<12)|(0<<8)|(0<<4)|(0<<0));__raw_writel(tmp, S5P_SROM_BC1);tmp = __raw_readl(S5P_SROM_BW);tmp &= ~(0xf << 4);tmp |= (1<<7) | (1<<6) | (1<<5) | (1<<4); // dm9000 16bit__raw_writel(tmp, S5P_SROM_BW);tmp = __raw_readl(S5PV210_MP01CON);tmp &= ~(0xf << 4);tmp |= (2 << 4);__raw_writel(tmp, S5PV210_MP01CON);
}

                        修改网卡地址和中断号(arch/arm/plat-s5p/devs.c)

/* DM9000 registrations */
#ifdef CONFIG_DM9000
static struct resource s5p_dm9000_resources[] = {[0] = {.start = S5P_PA_DM9000,.end   = S5P_PA_DM9000,.flags = IORESOURCE_MEM,},[1] = {
#if defined(CONFIG_DM9000_16BIT)//.start = S5P_PA_DM9000 + 2,//.end   = S5P_PA_DM9000 + 2,.start = S5P_PA_DM9000 + 4,.end   = S5P_PA_DM9000 + 4,.flags = IORESOURCE_MEM,
#else.start = S5P_PA_DM9000 + 1,.end   = S5P_PA_DM9000 + 1,.flags = IORESOURCE_MEM,
#endif},[2] = {//.start = IRQ_EINT9,//.end   = IRQ_EINT9,.start = IRQ_EINT10,.end   = IRQ_EINT10,.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,}
};依据struct platform_device s5p_device_dm9000 = {.name        = "dm9000",.id        =  0,.num_resources    = ARRAY_SIZE(s5p_dm9000_resources),.resource    = s5p_dm9000_resources,.dev        = {.platform_data = &s5p_dm9000_platdata,}
};

                        修改bank

(arch/arm/mach-s5pv210/include/mach/map.h)//#define S5PV210_PA_DM9000       (0xA8000000)
#define S5PV210_PA_DM9000       (0x88000000)
#define S5P_PA_DM9000           S5PV210_PA_DM9000

                        结果显示

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/220336.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用对象处理流ObjectOutputStream读写文件

注意事项: 1.创建的对象必须实现序列化接口,如果属性也是类&#xff0c;那么对应的类也要序列化 2.读写文件路径问题 3.演示一个例子 &#xff08;1&#xff09;操作的实体类FileModel&#xff0c;实体类中有Map,HashMap这些自带的本身就实现了序列化。 public class File…

Gradio: 实时性能反馈的机器学习演示工具 | 开源日报 No.107

comfyanonymous/ComfyUI Stars: 17.5k License: GPL-3.0 这个项目是 ComfyUI&#xff0c;它提供了一个图形化界面和后端来设计和执行复杂的稳定扩散工作流程。 节点/图表/流程图接口用于实验并创建复杂的稳定扩散工作全面支持不同版本的 Stable Diffusion异步队列系统部分更新…

薅github的羊毛-用pages建自己的博客或资源站 - 博客工具 - 2/2

笔者调研了好多个静态博客工具&#xff0c;最后锁定Hexo了&#xff0c;但不等于其他博客不行。我只吐槽两个 Hugo - 难用Gridea - 简直就是骗钱的&#xff0c;我交钱用不了 theme没有链接&#xff0c;同步也同步不了&#xff0c;估计以前是可以&#xff0c;现在经营不下去&…

十大经典排序算法知识体系终结篇

目录 一. 前言 二. 冒泡排序&#xff08;Bubble Sort&#xff09; 2.1. 概念 2.2. 算法步骤 2.3. 代码实现 三. 选择排序&#xff08;Selection Sort&#xff09; 3.1. 概念 3.2. 算法步骤 3.3. 代码实现 四. 插入排序&#xff08;Insertion Sort&#xff09; 4.1. …

wireshark使用

1、抓包界面介绍 2、过滤 (1) ip过滤 or 端口过滤 ip.src 192.168.1.104 显示源地址为192.168.1.104的数据包列表 ip.dst192.168.1.104, 显示目标地址为192.168.1.104的数据包列表 ip.addr 192.168.1.104 显示源IP地址或目标IP地址为192.168.1.104的数据包列表 port 80 …

C++进阶篇9---类型转换

C语言中的类型转换 在C语言中&#xff0c;如果赋值运算符左右两侧类型不同&#xff0c;或者形参与实参类型不匹配&#xff0c;或者返回值类型与 接收返回值类型不一致时&#xff0c;就需要发生类型转化&#xff0c;C语言中总共有两种形式的类型转换&#xff1a;隐式类型 转换和…

RRC下的NAS层

无线资源控制&#xff08;Radio Resource Control&#xff0c;RRC&#xff09;&#xff0c;又称为无线资源管理&#xff08;RRM&#xff09;或者无线资源分配&#xff08;RRA&#xff09;&#xff0c;是指通过一定的策略和手段进行无线资源管理、控制和调度&#xff0c;在满足服…

2.操作符详解

1.10进制转二进制方法 所以125的二进制就是1111101 2.2进制转8进制: 从2进制序列中右边最低位开始向左每3个2进制位换算为一个8进制位&#xff0c;剩余不够3个2进制位的直接换算 例:01101011转为01 101 011 即1 5 3 即8进制的153 还原回去的话: 将3化为011放最右边,5化…

使用PM2,在生产环境稳定运行你的node项目

PM2 一个 node&#xff0c;本身就用几行代码&#xff0c;就可以启动个 server 进程&#xff0c;监听个端口&#xff0c;为大家提供 Web 服务 一、依赖安装 npm install pm2 -g 二、命令行启动 普通执行启动 pm2 start <js 文件路径 >.js 携带参数启动 pm2 start < 某种…

re:Invent 云端历程:Swami Sivasubramanian 博士主题演讲-数据共生与开放

re:Invent 云端历程&#xff1a;Swami Sivasubramanian 博士主题演讲-数据共生与开放 亚马逊云科技 re:Invent 大会简介 亚马逊云科技 re:Invent 是亚马逊云科技为全球云计算社区举办的学习大会。是云计算领域的行业风向标&#xff0c;科技界的全球年度重磅盛会。 亚马逊云科…

爬虫学习日记第九篇(爬取seebug)

目标&#xff1a;https://www.seebug.org/vuldb/vulnerabilities 需求&#xff1a;爬取cve_id及影响组件 单线程 cookie是有时效的(过一段时间就不行了&#xff0c;大概半小时左右)&#xff0c;但是并不需要登录(直接抓包拿到的请求头) import base64 import json import ur…

cuda version 管理

https://towardsdatascience.com/managing-multiple-cuda-versions-on-a-single-machine-a-comprehensive-guide-97db1b22acdchttps://towardsdatascience.com/managing-multiple-cuda-versions-on-a-single-machine-a-comprehensive-guide-97db1b22acdc不同项目设置不同的cuda…

小航助学2023年9月电子学会Scratch四级真题(含题库答题软件账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09; 单选题3.00分 删除编辑附件图文 答案:A 第1题角色为一个紫色圆圈&#xff0c;运行程序后&#xff0c;舞台上的图案是&#xff1f;&#xff08; &#xff09; A…

永久安装任何 IPA 文件:TrollStore 助你打破限制 | 开源日报 No.106

Azure/azure-quickstart-templates Stars: 13.4k License: MIT 这个项目是 Azure Resource Manager QuickStart Templates&#xff0c;它包含了社区贡献的所有当前可用的 Azure 资源管理器模板。维护着一个可搜索的模板索引&#xff0c;并提供如何使用或向该存储库做出贡献的…

12.12年末大促,退换货寄件5元起 !

促销新闻报道&#xff1a; 在双十二促销季&#xff0c;闪侠惠递携手圆通、申通、中通、京东、德邦推出了一系列寄件促销活动&#xff01;在这场活动中&#xff0c;退换货运费贵&#xff0c;你该怎么办&#xff1f;从今天开始&#xff0c;闪侠惠递和五大物流企业为您带来了一场…

Redis核心知识小结

基础 redis为什么快呢&#xff1f; 单线程基于io多路复用底层C语言对数据结构做了优化完全内存的操作 Redis6.0使用多线程是怎么回事? Redis不是说用单线程的吗&#xff1f;怎么6.0成了多线程的&#xff1f; Redis6.0的多线程是用多线程来处理数据的读写和协议解析&#x…

运筹优化 | 模拟退火求解旅行商问题 | Python实现

"""模拟退火旅行商""" import random import numpy as np import math import time import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False location np.loadtxt(city_location.t…

linux 调试工具 GDB 使用

gdb是linux下常用的代码调试工具&#xff0c;本文记录常用命令。 被调试的应用需要使用 -g 参数进行编译&#xff0c;如不确定可使用如下命令查看是否支持debug readelf -S filename | grep "debug" 启动调试 gdb binFile 例如要调试sshd&#xff1a; 调试带参数…

线性回归问题

目录 一、线性回归关键思想 1、线性模型 2、基础优化算法 二、线性回归的从零开始实现 1、生成数据集 2、读取数据集 3、初始化模型参数 4、定义模型 5、定义损失函数 6、定义优化算法 7、训练 三、线性回归的简洁实现 1、生成数据集 2、读取数据集 3、定义模型…

读这篇文章让你彻底了解Redis

我是Redis 你好&#xff0c;我是Redis&#xff0c;一个叫Antirez的男人把我带到了这个世界上。 说起我的诞生&#xff0c;跟关系数据库MySQL还挺有渊源的。 在我还没来到这个世界上的时候&#xff0c;MySQL过的很辛苦&#xff0c;互联网发展的越来越快&#xff0c;它容纳的数…