start_kernel函数部分分析

简介: start_kernel函数部分分析

根据板子里面的启动信息,cat /proc/kmsg,对着代码看。

start_kernel函数分析

1. set_task_stack_end_magic(&init_task);

抽取关键部分

//找到栈顶位置并设置个魔术字,防止堆栈 将 thread_info 的数据覆盖;  //如果是向上生长的栈,直接通过(task_thread_info + 8K - 1)找到栈底并设置魔术字  //内核栈大小一般为4K或者8K.  set_task_stack_end_magic(&init_task);    stackend = end_of_stack(tsk);      return (unsigned long *)(task_thread_info(p) + 1);    *stackend = STACK_END_MAGIC; // 0x57AC6E9D

//宏定义了就是向上生长static inline unsigned long *end_of_stack(struct task_struct *p){#ifdef CONFIG_STACK_GROWSUP  return (unsigned long *)((unsigned long)task_thread_info(p) + THREAD_SIZE) - 1;#else  return (unsigned long *)(task_thread_info(p) + 1);#endif}

640.png

(栈向下生长的情况)

640.png

(栈向上生长的情况)

2. smp_setup_processor_id

int i;  u32 mpidr = is_smp() ? read_cpuid_mpidr() & MPIDR_HWID_BITMASK : 0;  u32 cpu = MPIDR_AFFINITY_LEVEL(mpidr, 0);
  cpu_logical_map(0) = cpu;  for (i = 1; i < nr_cpu_ids; ++i)    cpu_logical_map(i) = i == cpu ? 0 : i;
  /*   * clear __my_cpu_offset on boot CPU to avoid hang caused by   * using percpu variable early, for example, lockdep will   * access percpu variable inside lock_release   */  set_my_cpu_offset(0);
  pr_info("Booting Linux on physical CPU 0x%x\n", mpidr);

先通过is_smp()函数判断是否为smp处理器

static inline bool is_smp(void){#ifndef CONFIG_SMP  return false;#elif defined(CONFIG_SMP_ON_UP)  extern unsigned int smp_on_up;  return !!smp_on_up;#else  return true;#endif}

我的是imx6ull板子,不是对称多处理器,这里宏没定义,直接返回false。

所以mpidr 为0

3. local_irq_disable

暂时禁止本地中断, 设置完相关的东西后再开启

// 禁止本地中断  local_irq_disable    raw_local_irq_disable      arch_local_irq_disable

4. boot_cpu_init

初始化 Boot CPU

// 设置boot cpu  boot_cpu_init    smp_processor_id      raw_smp_processor_id        current_thread_info()->cpu    set_cpu_online    set_cpu_active    set_cpu_present    set_cpu_possible

5.page_address_init

初始化高端内存线性地址中永久映射的全局变量.IMX6ULL这里的宏没开,所以这里应该是空

page_address_init    // page_address_htable 是个全局结构体数组,     for (i = 0; i < ARRAY_SIZE(page_address_htable); i++)      INIT_LIST_HEAD(&page_address_htable[i].lh);      spin_lock_init(&page_address_htable[i].lock);

6.pr_notice("%s", linux_banner);

linux_banner 字符串保存了 linux 版本号,编译主机,GCC 版本,编译 时间等信息。在开机过程中可以看到log

640.png

/* FIXED STRINGS! Don't touc.h! */const char linux_banner[] =  "Linux version " UTS_RELEASE " (" LINUX_COMPILE_BY "@"  LINUX_COMPILE_HOST ") (" LINUX_COMPILER ") " UTS_VERSION "\n";

 以下是编译生成的文件,路径在include\generated\compile.h

#define UTS_MACHINE "arm"#define UTS_VERSION "#9 SMP PREEMPT Sat Dec 25 20:49:44 CST 2021"#define LINUX_COMPILE_BY "zrc"#define LINUX_COMPILE_HOST "zrc"#define LINUX_COMPILER "gcc version 4.9.4 (Linaro GCC 4.9-2017.01) "

7. setup_arch

初始化体系相关的部分,实现与体系和芯片有关

// 初始化体系相关的部分,实现与体系和芯片有关  setup_arch(&command_line)    setup_processor(); // 从硬件获得体系相关的信息,并将该信息用于系统的初始化    // __atags_pointer 指向 DTB 所在的物理地址    mdesc = setup_machine_fdt(__atags_pointer)

号主:一枚机械专业本科生,经历了转行,从外包逆袭到芯片原厂的Linux驱动开发工程师,深入操作系统的世界,贯彻终身学习、终身成长的理念。平时喜欢折腾,寒冬之下,抱团取暖,期待你来一起探讨技术、搞自媒体副业,程序员接单和投资理财。【对了,不定期送闲置开发板、书籍、键盘等等】。

如果你想了解我的转行经验,欢迎找我交流~gongzhong号【哆哆jarvis】

一起不断探索自我、走出迷茫、找到热爱,希望和你成为朋友,一起成长~

相关文章
|
Oracle Ubuntu 关系型数据库
Ubuntu安装MySQL(RPM包安装)
Ubuntu安装MySQL(RPM包安装)
895 0
|
5月前
|
存储 缓存 人工智能
Mooncake 最新进展:SGLang 和 LMCache 基于 Mooncake 实现高效 PD 分离框架
Mooncake 的架构设计兼具高性能和灵活性,为未来的扩展性和生态建设奠定了坚实基础。
|
3月前
|
缓存 人工智能 负载均衡
Scale Up!阿里云让大模型一体机真正实现“算得快”、“用得好”
当前,人工智能技术快速发展,中国智能计算市场进入成长期。大模型推理场景面临实时性、负载均衡与成本控制等多重挑战。阿里云通过芯片算子库升级、模型量化创新及推理引擎优化,实现性能加速,并应用于AI Stack训推一体机和百炼专属版等产品,支持大规模模型高效运行,显著提升性价比与用户体验。
615 0
|
Web App开发 Go C语言
ptmalloc、tcmalloc与jemalloc对比分析(二)
ptmalloc、tcmalloc与jemalloc对比分析(二)
460 0
|
开发框架 缓存 .NET
并发请求太多,服务器崩溃了?试试使用 ASP.NET Core Web API 操作筛选器对请求进行限流
并发请求太多,服务器崩溃了?试试使用 ASP.NET Core Web API 操作筛选器对请求进行限流
479 0
|
XML Java UED
使用 Spring Boot 实现重试和补偿功能:从理论到实践
【6月更文挑战第17天】在分布式系统中,服务之间的调用可能会因为网络故障、服务器负载等原因偶尔失败。为了提高系统的可靠性和稳定性,我们经常需要实现重试和补偿功能。
497 6
|
调度 PyTorch 算法框架/工具
PyTorch 2.2 中文官方教程(十三)(1)
流畅的 Python 第二版(GPT 重译)(十一)
201 1
|
Linux UED iOS开发
Python colorama 设置控制台、命令行输出彩色文字
Python colorama 设置控制台、命令行输出彩色文字
215 0
|
Linux Android开发
Linux内核学习(五):linux kernel源码结构以及makefile分析
Linux内核学习(五):linux kernel源码结构以及makefile分析
881 0