start_kernel是内核启动时比较重要的一个函数,然而我发现一个问题,我编译出来的目标文件中的汇编代码与C源码并不完全对应,这是怎么一回事呢?

asmlinkage void __init start_kernel(void)
{
char * command_line;
extern const struct kernel_param __start___param[], __stop___param[]; /*
* Need to run as early as possible, to initialize the
* lockdep hash:
*/
lockdep_init();
smp_setup_processor_id();
debug_objects_early_init(); /*
* Set up the the initial canary ASAP:
*/
boot_init_stack_canary(); cgroup_init_early(); local_irq_disable();
early_boot_irqs_disabled = true;
/*
 * Interrupts are still disabled. Do necessary setups, then
 * enable them
 */
        boot_cpu_init();
        page_address_init();
        pr_notice("%s", linux_banner);
        setup_arch(&command_line);
        mm_init_owner(&init_mm, &init_task);
        mm_init_cpumask(&init_mm);
        setup_command_line(command_line);
        setup_nr_cpu_ids();
        setup_per_cpu_areas();
        smp_prepare_boot_cpu(); /* arch-specific boot-cpu hooks */
objdump -d main.o
00000337 <start_kernel>:
337: 55 push %ebp
338: 89 e5 mov %esp,%ebp
33a: 53 push %ebx
33b: 83 ec 14 sub $0x14,%esp
33e: e8 fc ff ff ff call 33f <start_kernel+0x8>
343: e8 fc ff ff ff call 344 <start_kernel+0xd>
348: ff 15 08 00 00 00 call *0x8
34e: 64 8b 1d 00 00 00 00 mov %fs:0x0,%ebx
355: ba 01 00 00 00 mov $0x1,%edx
35a: 89 d8 mov %ebx,%eax
35c: c6 05 00 00 00 00 01 movb $0x1,0x0
363: e8 fc ff ff ff call 364 <start_kernel+0x2d>
368: 89 d8 mov %ebx,%eax
36a: ba 01 00 00 00 mov $0x1,%edx
36f: e8 fc ff ff ff call 370 <start_kernel+0x39>
374: 89 d8 mov %ebx,%eax
376: ba 01 00 00 00 mov $0x1,%edx
37b: e8 fc ff ff ff call 37c <start_kernel+0x45>
380: ba 01 00 00 00 mov $0x1,%edx
385: 89 d8 mov %ebx,%eax
387: e8 fc ff ff ff call 388 <start_kernel+0x51>
38c: e8 fc ff ff ff call 38d <start_kernel+0x56>
391: c7 44 24 04 00 00 00 movl $0x0,0x4(%esp)
objdump -r main.o
00000309 R_386_32          boot_command_line
0000030e R_386_32 .init.data
00000313 R_386_PC32 strlcpy
00000318 R_386_32 .init.data
0000031d R_386_PC32 parse_early_options
00000324 R_386_32 .init.data
0000033f R_386_PC32 smp_setup_processor_id
00000344 R_386_PC32 cgroup_init_early
0000034a R_386_32 pv_irq_ops
00000351 R_386_32 cpu_number
0000035e R_386_32 early_boot_irqs_disabled
00000364 R_386_PC32 set_cpu_online
00000370 R_386_PC32 set_cpu_active
0000037c R_386_PC32 set_cpu_present
00000388 R_386_PC32 set_cpu_possible
0000038d R_386_PC32 page_address_init
00000395 R_386_32 linux_banner
0000039c R_386_32 .rodata.str1.1
000003a1 R_386_PC32 printk
000003a9 R_386_PC32 setup_arch
000003ae R_386_32 init_task
000003b3 R_386_32 init_mm
000003b8 R_386_PC32 mm_init_owner
000003bd R_386_32 boot_command_line

那么,lockdep_init函数哪里去了呢,start_kernel究竟有没有调用到它呢。

首先可以肯定的是,lockdep_init没有被内核导出,因为在System.map中找不到它。

然后,在重定位信息中也找不到lockdep_init。

lockdep_init是在哪个文件中定义的?

kernel/locking/lockdep.c

但是在kernel/locking目录下并没有生成lockdep.o,这又是为什么?

void lockdep_init(void)
{
int i; /*
* Some architectures have their own start_kernel()
* code which calls lockdep_init(), while we also
* call lockdep_init() from the start_kernel() itself,
* and we want to initialize the hashes only once:
*/
if (lockdep_initialized)
return; for (i = 0; i < CLASSHASH_SIZE; i++)
INIT_LIST_HEAD(classhash_table + i); for (i = 0; i < CHAINHASH_SIZE; i++)
INIT_LIST_HEAD(chainhash_table + i); lockdep_initialized = 1;
}

Linux源码与编译出的目标文件汇编代码的一致性问题的更多相关文章

  1. Android源码中编译出指定jar包

    今天想把android源码/vendor/letv/frameworks/base/java下的源码编译成 framework-letv.jar供乐乐语音客户端使用,编译完后,发现jar包文件虽然生成 ...

  2. linux 源码编译(转)

    源代码的用处无非是以下两点;1、软件根据用户的需要加以定制;2、二次开发;注:要根据软件的许可证书约定为准,开发者许可二次开发才行;1、源码包的打包格式;源代码一般以file.tar.gz file. ...

  3. Linux 源码编译Python 3.6

    Linux 源码编译Python 3.6 1.操作系统以及版本显示 # uname -sr Linux 3.10.0-514.el7.x86_64 # uname -sr Linux 3.10.0-5 ...

  4. Linux中源码安装编译Vim

    Linux中源码安装编译Vim Linux下学习工作少不了编辑器,Vim能使你的工作效率成倍的提高.在Ubuntu上安装vim使用命令直接安装很简单.但有时还是需要自己手动编译安装.例如: vim中的 ...

  5. 从谷歌官网下载android 6.0源码、编译并刷入nexus 6p手机

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/fuchaosz/article/details/52473660 1 前言 经过一周的奋战,终于从谷 ...

  6. 【跟我一起读 linux 源码 01】boot

    计算机启动流程在我的上一个学习计划<自制操作系统>系列中,已经从完全不知道,过渡到了现在的了如指掌了,虽然有些夸张,但整个大体流程已经像过电影一样在我脑海里了,所以在看 linux 源码的 ...

  7. 【Android 系统开发】CyanogenMod 13.0 源码下载 编译 ROM 制作 ( 手机平台 : 小米4 | 编译平台 : Ubuntu 14.04 LTS 虚拟机)

                 分类: Android 系统开发(5)                                              作者同类文章X 版权声明:本文为博主原创文章 ...

  8. CentOS 7.2使用源码包编译安装MySQL 5.7.22及一些操作

    CentOS 7.2使用源码包编译安装MySQL 5.7.22及一些操作 2018年07月05日 00:28:38 String峰峰 阅读数:2614   使用yum安装的MySQL一般版本比较旧,但 ...

  9. php源码的编译

    本片文章主要介绍windows下的php源码的编译. 1.1 编译环境 软件 环境 操作系统 Windows 7 专业版 32bit Visual studio 2012 专业版 PHP 5.5.2. ...

随机推荐

  1. Name your feature branches by convention

    https://docs.microsoft.com/en-us/azure/devops/repos/git/git-branching-guidance?view=azure-devops Nam ...

  2. 有关JWT(Json Web Token)的那些事

    用户认证是计算机安全领域一个永恒的热点话题,然而你会发现,开发者很少讨论有关Json Web Token的话题,其实使用Json Web Token集成到API身份验证机制中是容易,本文给大家普及基础 ...

  3. JS对象中属性的增删改查

    对象属于一种复合的数据类型,在对象中可以保存多个不同数据类型的属性 对象的分类:           1.内建对象                 -在ES标准中定义的对象,在任何的ES的实现中都可以 ...

  4. 运维 05 Shell基本命令

    Shell基本命令   前言 前面咱们已经成功安装了Linux系统--centos7,那么现在跟着超哥奔向Linux的大门. Linux命令行的组成结构 [root@oldboy_python ~]# ...

  5. MHA+atlas(数据库的高可用与读写分离)

    学习完了mycat的高可用还是复习一下MHA+atlas吧,个人感觉还是比mycat好用,毕竟MHA有数据补全和切换主从的机制 1 MHA是什么? MHA(Master High Availabili ...

  6. list列表操作(创建、增加、删除、取值)

    list ####(一)列表的创建[].追加(append,extend,insert).删除(remove.del.poop).修改 ##创建一个空列表.一个字符串列表.一个数字列表 lis0 = ...

  7. MYSQL索引的深入学习

    通常大型网站单日就可能会产生几十万甚至几百万的数据,对于没有索引的表,单表查询可能几十万数据就是瓶颈. 一个简单的对比测试 以我去年测试的数据作为一个简单示例,20多条数据源随机生成200万条数据,平 ...

  8. centors7 和 win7 修改开机顺序

    打开/boot/grub2/grub.cfg,找到windows对应的项 我的是 Windows 7 (loader) (on /dev/sda1) 执行命令 grub2-set-default &q ...

  9. Java原理领悟-JMM(java内存模型认知)

    总线锁.缓存锁.MESI缓存一致性协议.CPU 层面的内存屏障 1.JMM定义: Java Memory Model(java内存模型)是一系列的Java虚拟机平台对开发者提供的多线程环境下的内存可见 ...

  10. python--知识小结和集合

    知识小结 一. = 表示赋值 ==表示比较值的大小 is 比较内存地址 二. 数字小数据池:在-5~256之内,id在电脑里是一样的 字符串id一样要求: ①:不能有特殊字符 ②:s(一个单字符)*2 ...