一、环境搭建

  源码包下载:git clone https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.10.8.tar.gz

  或者直接去kernel.org上面进行下载。

  交叉编译工具链制作:

  这个已经在u-boot移植中已经做过了:http://www.cnblogs.com/kele-dad/p/6910040.html

二、内核启动过程

2.1 Windows 和 Linux 系统的启动区别

  

  由bootloader确定启动哪块单板。

2.2 修改makefile

  下面的行注释掉:

  

  修改ARCH:

  

  修改交叉编译工具链:

  

2.3 选择默认配置

  找到默认配置:

  

  

  进入arm架构中:

  

  可以看到我们的架构中有 mini2440的架构,同时也有s3c2410的配置文件。

  进入内核根目录,配置成2410:

  

  打开.config 文件

  

  查看CPU,可以看到有2440的CPU:

  

  同时也支持 mini2440 的单板:

  

2.4 编译

  执行:make uImage

  进行编译:

  

  编译提示错误,那是因为没有安装u-boot 依赖包。

  

  提示要安装新包

  

  再执行编译:

  

  编译成功。

2.5 烧写

  通过nfs进行烧写,nfs配置如文档:http://www.cnblogs.com/kele-dad/p/7082765.html

  

  启动内核:bootm 32000000

  

  看一下打印信息,有条错误,无法识别机器ID。下面打印出来了很多机器ID。

  现在我们要根据我们的机器ID 去u-boot 源码中看一下启动内核的代码了。

  进入Cmd_bootm.c (common),搜索bootm,找到下面这行代码:

  

  上面代码调用了 do_bootm 函数,进入函数中查看: 

 U_BOOT_CMD
do_bootm
do_bootm_subcommand
do_bootm_subcommand
do_bootm_states
boot_os_fn *boot_fn;
bootm_start
bootm_find_os
bootm_find_other
bootm_load_os
boot_fn = bootm_os_get_boot_func(images->os.os);
do_bootm_states

  在do_bootm_states 中有一个结构体,boot_os_fn:

 static boot_os_fn *boot_os[] = {
[IH_OS_U_BOOT] = do_bootm_standalone,
#ifdef CONFIG_BOOTM_LINUX
[IH_OS_LINUX] = do_bootm_linux,
#endif
#ifdef CONFIG_BOOTM_NETBSD
[IH_OS_NETBSD] = do_bootm_netbsd,
#endif
#ifdef CONFIG_LYNXKDI
[IH_OS_LYNXOS] = do_bootm_lynxkdi,
#endif
#ifdef CONFIG_BOOTM_RTEMS
[IH_OS_RTEMS] = do_bootm_rtems,
#endif
#if defined(CONFIG_BOOTM_OSE)
[IH_OS_OSE] = do_bootm_ose,
#endif
#if defined(CONFIG_BOOTM_PLAN9)
[IH_OS_PLAN9] = do_bootm_plan9,
#endif
#if defined(CONFIG_BOOTM_VXWORKS) && \
(defined(CONFIG_PPC) || defined(CONFIG_ARM))
[IH_OS_VXWORKS] = do_bootm_vxworks,
#endif
#if defined(CONFIG_CMD_ELF)
[IH_OS_QNX] = do_bootm_qnxelf,
#endif
#ifdef CONFIG_INTEGRITY
[IH_OS_INTEGRITY] = do_bootm_integrity,
#endif
#ifdef CONFIG_BOOTM_OPENRTOS
[IH_OS_OPENRTOS] = do_bootm_openrtos,
#endif
};

  在此结构体中调用的是 do_bootm_linux 函数,进入查看 Bootm.c (arch\arm\lib)

 int do_bootm_linux(int flag, int argc, char * const argv[],
bootm_headers_t *images)
{
/* No need for those on ARM */
if (flag & BOOTM_STATE_OS_BD_T || flag & BOOTM_STATE_OS_CMDLINE)
return -; if (flag & BOOTM_STATE_OS_PREP) {
boot_prep_linux(images);
return ;
} if (flag & (BOOTM_STATE_OS_GO | BOOTM_STATE_OS_FAKE_GO)) {
boot_jump_linux(images, flag);
return ;
} boot_prep_linux(images);
boot_jump_linux(images, flag);
return ;
}

  在最后一句中执行 boot_jump_linux 函数:

 /* Subcommand: GO */
static void boot_jump_linux(bootm_headers_t *images, int flag)
{
unsigned long machid = gd->bd->bi_arch_number;
char *s;
void (*kernel_entry)(int zero, int arch, uint params);
unsigned long r2;
int fake = (flag & BOOTM_STATE_OS_FAKE_GO); kernel_entry = (void (*)(int, int, uint))images->ep; s = getenv("machid");
if (s) {
if (strict_strtoul(s, , &machid) < ) {
debug("strict_strtoul failed!\n");
return;
}
printf("Using machid 0x%lx from environment\n", machid);
}
bootstage_mark(BOOTSTAGE_ID_RUN_OS);
announce_and_cleanup(fake); if (IMAGE_ENABLE_OF_LIBFDT && images->ft_len)
r2 = (unsigned long)images->ft_addr;
else
r2 = gd->bd->bi_boot_params; if (!fake) {
kernel_entry(0, machid, r2);
}
}

  从环境变量中获取mach_id ,然后进入 kernel。如果没有从环境变量获取,就采用默认值,此函数的第一句就是默认值。看看默认值是多少。

  machid = gd->bd->bi_arch_number;

  在Jz2440.c (board\samsung\jz2440) 中 设置了默认ID:

 int board_init(void)
{
/* arch number of JZ2440 board */
gd->bd->bi_arch_number = MACH_TYPE_JZ2440; /* adress of boot parameters */
gd->bd->bi_boot_params = 0x30000100; icache_enable();
dcache_enable(); return ;
}

  同时在Board_f.c (common) 的 setup_machine中也有设置ID:

 static int setup_machine(void)
{
#ifdef CONFIG_MACH_TYPE
gd->bd->bi_arch_number = CONFIG_MACH_TYPE; /* board id for Linux */
#endif
return ;
}

  CONFIG_MACH_TYPE 这个宏我们没有设置。

  那么我们的上一个设置ID的函数是有效的。

  在Mach-types.h (arch\arm\include\asm) 中设置的ID为194。

  

  然后在内核处,进入arch/arm/s3c24x0/ 目录,里面有很多我们的支持s3c24x0的板子,进入smdk2440的单板文件 mach-smdk2440.c:

MACHINE_START(S3C2440, "SMDK2440")
/* Maintainer: Ben Dooks <ben-linux@fluff.org> */
.atag_offset = 0x100, .init_irq = s3c2440_init_irq,
.map_io = smdk2440_map_io,
.init_machine = smdk2440_machine_init,
.init_time = smdk2440_init_time,
MACHINE_END

  在MACHINE_START中,就是根据mchine ID找到单板文件的。MACHINE_START的定义如下:

  

  展开后, .nr = MACH_TYPE_S3C2440,查找一下这个宏。

  

  generated 是临时生成的文件目录。可以看一下 mach-types.h:

  这是smdk2440的机器码

  

  这是mini2440的机器码

  

  可以对照我们的u-boot打印看出来:

  

  16进制转换成10进制就可以算出来了。

  根据以上的内容,我们可以在u-boot 中设置我们的 mach_id 的环境变量来启动内核,或者我们可以直接修改 u-boot 的默认ID值和这里的机器ID匹配即可。

  修改成mini2440的机器ID。直接修改u-boot源码:

  把mini2440改成如下:

  

  jz2440改成如下:

  

  这两个定义的机器码进行了对调而已。

  在 include/configs/jz2440.h 中设置启动参数,要加上波特率设置,否则会有乱码。mini2440的内核文件中设置的波特率为115200,smdk2440的为16M。

  

  然后编译烧写u-boot。

  进入u-boot 记得 print查看一下环境变量,如果 波特率没有改变过来 就重新设置一下:

  

  保存一下。然后烧入内核

  

  启动内核:

  

  已经有打印信息了。

linux4.10.8 内核移植(一)---环境搭建及适配单板。的更多相关文章

  1. linux4.10.8 内核移植(三)---裁剪内核

    一.裁剪内核 1.1 第一次修改 现在的内核大小为2.8M左右,要裁剪到2.0M以下,毕竟给内核分区就只有2.0M. 这两个设备我们没有,裁剪掉. 进入make menuconfig中,搜索mouse ...

  2. linux4.10.8 内核移植(二)---初步裁剪、分区修改和文件系统

    一.初步裁剪 在内核根目录下 执行: make menuconfig 1.1 system type裁剪 选择 SAMSUNG S3C24XX SoCs Support 进入其中,这里是配置我们的单板 ...

  3. linux4.10.8 内核移植(四)---字符设备驱动_led驱动程序

    一.字符设备驱动程序介绍 app里面用 open.read.write等等函数出来操作底层硬件.驱动程序中也有对应的xxx_open等函数.怎么找到驱动程序中的函数依赖于驱动程序框架. 二.搭建驱动程 ...

  4. 【课程分享】深入浅出嵌入式linux系统移植开发 (环境搭建、uboot的移植、嵌入式内核的配置与编译)

    深入浅出嵌入式linux系统移植开发 (环境搭建.uboot的移植.嵌入式内核的配置与编译) 亲爱的网友,我这里有套课程想和大家分享,假设对这个课程有兴趣的,能够加我的QQ2059055336和我联系 ...

  5. Unix/Linux环境C编程新手教程(12) openSUSECCPP以及Linux内核驱动开发环境搭建

    1. openSUSE是一款优秀的linux. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaXRjYXN0Y3Bw/font/5a6L5L2T/font ...

  6. Unix/Linux环境C编程入门教程(12) openSUSECCPP以及Linux内核驱动开发环境搭建

    1. openSUSE是一款优秀的linux. 2.选择默认虚拟机 3.选择稍后安装操作系统 4.选择linux  opensuse 5. 选择默认虚拟机名称 6.设置处理器为双核. 7.内存设置为2 ...

  7. win10 + VS2010 + OpenCV2.4.10重编译OpenCV开发环境搭建

    win10 + VS2010 + OpenCV2.4.10重编译OpenCV开发环境搭建 重编译的优点:能够调试的时候看OpenCV的源码. 重编译要得到的东西:Debug版本号和Release版本号 ...

  8. Unix/Linux环境C编程入门教程(10) SUSE Linux EnterpriseCCPP开发环境搭建

    安装SUSE企业版以及搭建C/C++开发环境 1.      SUSELinux Enterprise是一款服务器操作系统,异常稳定. 2.设置虚拟机类型. 3.选择稍后安装操作系统. 4.选择SUS ...

  9. 10分钟学会Less开发环境搭建与初体验

    Less 是一门 CSS 预处理语言,它扩充了 CSS 语言,增加了诸如变量.混合(mixin).函数等功能,让 CSS 更易维护.方便制作主题.扩充. 今天看一下,10分钟能不能手把手快速教会你Le ...

随机推荐

  1. FICO基础知识(四)

    What is the organizational structure for CO? Operating Concern 经营组织 Controlling Area 成本控制范围 Profit c ...

  2. TF版本的Word2Vec和余弦相似度的计算

    前几天一个同学在看一段代码,内容是使用gensim包提供的Word2Vec方法训练得到词向量,里面有几个变量code.count.index.point看不懂,就向我求助,我大概给他讲了下code是哈 ...

  3. SQL连接:内连接、外连接、交叉连接。

    SQL连接可以分为内连接.外连接.交叉连接. 数据库数据:             book表                                          stu表 1.内连接 ...

  4. 使用libcurl 发送post请求

    SendHttpPost(string& strUrl, string& strPost, string& strResponse, int nTimeOut) { CURLc ...

  5. [资源]--IOS捷径大全,众多实用小功能

    一.实用工具 1.支付助手3.0(新) (扫一扫.微信扫码.微信收款.支付宝扫码.Apple Pay.AA付款.查快递.蚂蚁森林.蚂蚁庄园.彩票.股票.运动.淘票票.乘车码.生活缴费.火车票等等): ...

  6. day30 item系列

    item 会将数据操作类似于字典的操作具体用到的方法 __getitem__(self, item): __setitem__(self, key, value): __delitem__(self, ...

  7. 【 Gym - 101138D 】Strange Queries (莫队算法)

    BUPT2017 wintertraining(15) #4B Gym - 101138D 题意 a数组大小为n.(1 ≤ n ≤ 50 000) (1 ≤ q ≤ 50 000)(1 ≤ ai ≤  ...

  8. 【CF715E】Complete the Permutations(容斥,第一类斯特林数)

    [CF715E]Complete the Permutations(容斥,第一类斯特林数) 题面 CF 洛谷 给定两个排列\(p,q\),但是其中有些位置未知,用\(0\)表示. 现在让你补全两个排列 ...

  9. SharePoint 2013 首页修改

    最近客户要求统一首页的风格,所以对各网站的首页进行了统一的修改. 1. 左边导航菜单修改: 修改的地方: Site Settings –> Look and feel –> Navigat ...

  10. 【转】JVM性能调优监控工具jps、jstack、jmap、jhat、jstat使用详解

    http://www.cnblogs.com/therunningfish/p/5524238.html JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsol ...