Linux_arm_启动_c语言部分详解,[原创]Linux arm 启动 c语言部分详解第四讲

Linux arm启动c语言部分详解第四讲(from setup_per_cpu_areas();)

Written by leeming

上面的setup_arch花了我们大量的篇幅,现在我们要继续往前推进了。

注:黑色为主线,蓝色为函数的一级展开,红色是注意重要的地方。

//因为我们没有定义CONFIG_SMP,所以这两个函数都为空

setup_per_cpu_areas();

smp_prepare_boot_cpu();

/*

* Set up the scheduler prior starting any interrupts (such as the

* timer interrupt). Full topology setup happens at smp_init()

* time - but meanwhile we still have a functioning scheduler.

*/

//和进程初始化有关的函数,进程是任何操作系统的一个大点,因此这部分内容还是很多的,我这次主要是讲解c语言的启动,所以这部分暂时会比较浅的涉及,以后有机会也详细谈到

sched_init();

{

runqueue_t *rq;

int i, j, k;

for_each_cpu(i) {

prio_array_t *array;

//获取每个cpu的运行队列结构体runqurere_t

rq = cpu_rq(i);

spin_lock_init(&rq->lock);

rq->nr_running = 0;//该队列中可运行的进程数

//prio_array_t *active, *expired, arrays[2];

rq->active = rq->arrays;

rq->expired = rq->arrays + 1;

rq->best_expired_prio = MAX_PRIO;

/*此处删除了smp的内容*/

atomic_set(&rq->nr_iowait, 0);

//初始化active和expired队列位图,将优先队列中的0-(MAX_PRIO-1)清0

//将MAX_PRIO对应的置1

for (j = 0; j < 2; j++) {

array = rq->arrays + j;

for (k = 0; k < MAX_PRIO; k++) {

INIT_LIST_HEAD(array->queue + k);

__clear_bit(k, array->bitmap);

}

// delimiter for bitsearch

__set_bit(MAX_PRIO, array->bitmap);

}

}

/*

* The boot idle thread does lazy MMU switching as well:

*/

atomic_inc(&init_mm.mm_count);

//啥都没做

enter_lazy_tlb(&init_mm, current);

/*

* Make us the idle thread. Technically, schedule() should not be

* called from this thread, however somewhere below it might be,

* but because we are the idle thread, we just pick up running again

* when this runqueue becomes "idle".

*/

//初始化当前进程,也就是idle进程

init_idle(current, smp_processor_id());

}

/*

* Disable preemption - early bootup scheduling is extremely

* fragile until we cpu_idle() for the first time.

*/

//禁止抢占,原因如上

preempt_disable();

build_all_zonelists();

//处理器热插拔时的失控函数,类似变频时相应的驱动模块做出的反应,显然嵌入式中不可能用到

page_alloc_init();

//打印启动参数,也就是我们再setup_arch中获得的参数,这里只是打印,对参数的分析就在printk下面

printk(KERN_NOTICE "Kernel command line: %s\n", saved_command_line);

//再次分析参数,之前在setup_arch里面也做了一次,但那次只是得到我们的内存信息

parse_early_param();

parse_args("Booting kernel", command_line, __start___param,

__stop___param - __start___param,

&unknown_bootoption);

sort_main_extable();

//将中断向量表所在的区域(链接的时候的位置不可能是0xffff0000)的内容搬运至0xffff0000;将中断处理部分的代码搬运至0xffff0200处。

trap_init();

rcu_init();

init_IRQ();

{

struct irqdesc *desc;

int irq;

#ifdef CONFIG_SMP

bad_irq_desc.affinity = CPU_MASK_ALL;

bad_irq_desc.cpu = smp_processor_id();

#endif

//NR_IRQS在我们的4020中定义为32个中断,arm本身最多支持128个

for (irq = 0, desc = irq_desc; irq < NR_IRQS; irq++, desc++) {

//将这些中断初始化为bad_irq_desc

*desc = bad_irq_desc;

INIT_LIST_HEAD(&desc->pend);

}

//init_arch_irq是一个全局的函数指针,它初始化的时候是一个空函数

//但是在setup_arch中把它指向了我们4020的函数,init_arch_irq = mdesc->init_irq;

//也就是在arch/arm/mach-sep4020/irq.c中的sep4020_init_irq,这里重新对我们所有的中断进行初始化

init_arch_irq();

}

pidhash_init();

init_timers();

{

//这个函数就是timers_nb这个结构体的call函数

timer_cpu_notify(&timers_nb, (unsigned long)CPU_UP_PREPARE,

(void *)(long)smp_processor_id());

//这个是用的机制和cpufreq的机制是一样的,通过notifier_chain_register(&cpu_chain, nb)注册的;

//只不过这里的链是cpu_chain,而cpufreq是其他的链

register_cpu_notifier(&timers_nb);

//设置软中断行动函数描述结构变量softirq_vec[=1](系统定时器)的设置

//也就是设置timer定时器到期之后的处理函数

open_softirq(TIMER_SOFTIRQ, run_timer_softirq, NULL);

}

//其中函数hrtimers_init()和高精度时钟相关

hrtimers_init();

//和init_timers最后部分是softirq类似,只不过在那里是初始化=1的时候;

//在softirq_init中是初始化=6, =0的情况,对于整个软中断来说有以下几种情况

/*enum

{

HI_SOFTIRQ=0,

TIMER_SOFTIRQ,

NET_TX_SOFTIRQ,

NET_RX_SOFTIRQ,

BLOCK_SOFTIRQ,

TASKLET_SOFTIRQ

};*/

softirq_init();

//调用arch/arm/kernel/time.c中的time_init;它首先会检查system_timer这个全局结构体的偏移是否为空

//system_timer和我们之前在init_IRQ中提到的init_arch_irq类似,也是在setup_arch中赋值的

//system_timer = mdesc->timer;所以之前一直强调setup_arch是一个非常重要的函数,和我们处理器的移植紧密相关的

time_init();

至此,虽然start_kernel的函数只分析了一小部分,但是和平台和处理器相关的部分已经基本完毕,相信看完了这几讲,你会清楚的知道对于arch/arm/mach-sep4020中的那些文件为什么要那么写,是不是可以优化(肯定可以),知其然,知其所以然。

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

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

相关文章

Kudu1.1.0 、 Kudu1.2.0 Kudu1.3.0的版本信息异同比较

不多说&#xff0c;直接上干货&#xff01; Kudu1.1.0 新特性 python API升级&#xff0c;具备JAVA Cclient一样的功能&#xff08;从0.3版本直接升级到1.1&#xff09;&#xff0c;主要的点如下&#xff1a; 1.1. 改进了Parial Row的语义 1.2. 增加了range partition支持 1.3.…

ASP.NET Web API 中 特性路由(Attribute Routing) 的重名问题

刚才忘了说了&#xff0c;在控制器名重名的情况下&#xff0c;特性路由是不生效的。不然的话就可以利用特性路由解决同名的问题了。 而且这种不生效是真的不生效&#xff0c;不会提示任何错误&#xff0c;重名或者什么的&#xff0c;直接会报告404&#xff0c;所以也是个坑。转…

Python3爬取网页信息乱码怎么解决?(更新:已解决)

更新&#xff1a;乱码问题已经解决了。 将下面代码中的红色部分改为下面这样就不会出现个别职位信息乱码的情况了。 soup2 BeautifulSoup(wbdata2, html.parser,from_encoding"GBK") 另外&#xff1a; 建立了一个微信公众号&#xff0c;主要分享软件视频教程、文档笔…

洗衣机洗涤部分c语言程序,51单片机洗衣机控制板及C语言程序

51单片机洗衣机控制板及C语言程序&#xff0c;该控制板单片机采用AT89C51单片机&#xff0c;所设计全自动洗衣机功能有&#xff1a;标准洗衣、经济洗衣、单独洗衣以及排水四种洗衣等四种方式&#xff0c;有强洗、弱洗及运行/暂停、显示及报警功能,程序利用利用Protues仿真软件观…

数据存储

一、NSCoding &#xff1a; 使用NSCoding需要遵守<NSCoding> 保存&#xff1a; /** * 将某个对象写入文件时会调用 * 在这个方法中说清楚哪些属性需要存储 */ MJStudent.m - (void)encodeWithCoder:(NSCoder *)encoder { [encoder encodeObject:self.no forKey:"…

犯人释放的C语言程序,C语言的自动关机程序和一个用来整人的小程序

可以用C语言中的system()函数来实现系统的自动关机程序&#xff0c;可以设置多长时间后将自动关机。当然马上关机也是可以的&#xff0c;我们就可以恶搞别人计算机了(你事先得知道怎么解)&#xff0c;将写好的自动关机程序复制到别人电脑&#xff0c;然后将可执行的文件设为开机…

[mysql] linux下使用yum安装mysql

From: http://www.2cto.com/database/201207/141878.html linux下使用yum安装mysql1、安装查看有没有安装过&#xff1a;yum list installed mysql*rpm -qa | grep mysql*查看有没有安装包&#xff1a;yum list mysql*安装mysql客户端&#xff1a;yum install mysql安装mysql 服…

图解MapReduceMapReduce整体流程图

1.图解MapReduceMapReduce整体流程图 并行读取文本中的内容&#xff0c;然后进行MapReduce操作 Map过程&#xff1a;并行读取三行&#xff0c;对读取的单词进行map操作&#xff0c;每个词都以<key,value>形式生成 reduce操作是对map的结果进行排序&#xff0c;合并&#…

阿里云推出CloudDBA,解决数据库性能优化和问题诊断难题

问题诊断(trouble shooting) 和 性能优化(performance tunning) 一直都是数据库领域的专业问题&#xff0c;需要资深DBA的专业技能才能胜任解决&#xff0c;但这样的人才是稀缺的&#xff0c;无法及时满足大部分的企业紧急需求。如果有一款产品能够在大多数情况下&#xff0c;用…

c语言程序设计学生信息管理系统代码,c语言程序设计学生成绩管理系统源代码.pdf...

c语言程序设计 学 生 成 绩 管 理 系 统 源代码#include#include#include#include#define MAX 80int a;typedef struct /*定义结构体数组*/{ char num[10];char name[20];int score;} Student;Student stu[MAX];int menu_select(){char c;do{system("cls");/*清屏*/p…

初探ArrayList之删除

1.返回删除元素的删除方法 public E remove(int index) {rangeCheck(index);modCount;//记录修改次数的变量E oldValue elementData(index);//根据数组下标拿到指定元素int numMoved size - index - 1;//计算移动位数if (numMoved > 0)System.arraycopy(elementData, inde…

UESTC_秋实大哥与花 2015 UESTC Training for Data StructuresProblem B

B - 秋实大哥与花 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit Status秋实大哥是一个儒雅之人&#xff0c;昼听笙歌夜醉眠&#xff0c;若非月下即花前。 所以秋实大哥精心照料了很多花朵。现在所有的花朵排成了一行&#xff…

java的三大特性,封装,继承,多态

封装 Java代码 /** * 所谓封装&#xff0c;就是将对象具有的成员变量和成员函数包装和隐藏起来&#xff0c;让外界无法直接使用&#xff0c; * 被封装的成员只能通过某些特定的方式才能访问。 * 实现封装有两个步骤&#xff1a; * 1、将不能暴露的成员隐藏起来&#x…

银行家算法实验报告c语言版,银行家算法实验报告C语言版.doc

《操作系统》课程综合性实验报告姓名&#xff1a; 学号&#xff1a; 2016 年 11 月 20 日实验题目进程调度算法程序设计一、实验目的通过对安全性算法和银行家算法的模拟&#xff0c;进一步理解资源分配的基本概念&#xff0c;加深对资源申请&#xff0c;资源分配(银行家算法)以…

GetModuleHandle(NULL)获取当前DLL模块基址?

做一项目想在DLL内部代码实现获取本DLL的模块基址&#xff0c;而且不知道本DLL名称 最简单的方法是想到GetModuleHandle(NULL)&#xff0c;是否可以呢? 参看http://blog.csdn.net/guzhou_diaoke/article/details/8826558到的答案是否 自己尝试了一下: DLL代码(testDll): BOOL …

DataTable是否存在某个列的判断

使用 DataTable.Columns.Contains方法可以判断某个列名是否存在于某个DataTable中 //添加模拟数据 DataTable t new DataTable(); DataColumn col new DataColumn("aaa"); t.Columns.Add(col); col new DataColumn("bbb"); t.Columns.Add(col); col ne…

【评分】第三次作业-团队展示

【评分】第三次作业-团队展示 总结 【2017-10-10】更新&#xff1a; 分数映射至 [1,2] 分 【注意】&#xff1a; 为了保护大家隐私&#xff0c;以后发表博客&#xff1a; 涉及到学号时&#xff0c;仅提供后三位涉及到姓名时&#xff0c;仅提供名&#xff08;省略姓&#xff09;…

c语言变量为什么要定义,C语言为什么要规定对所用到的变量要“先定义,后使用”...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼int a10;以上一句话对变量a进行了声明&#xff0c;定义以及初始化extern int a;以上一句话仅仅对变量a进行了声明&#xff0c;将a的链接属性设置为externalint *p;以上定义了一个指针int a10;int *p;p&a;以上为指针变量进行了赋…

iOS 开发--github的demo

令人惊讶的是&#xff0c;YYText 虽然代码量很大&#xff08;超过一万行&#xff09;&#xff0c;但它只是 ibireme 的作品之一。ibireme 利用业余时间完成了 YYKit 工具库&#xff0c;包括&#xff1a; YYModel — 高性能的 iOS JSON 模型框架。 YYCache — 高性能的 iOS 缓存…

RabbitMQ快速安装配置指南

RabbitMQ快速安装配置指南 官网的安装教程由于需要解释原理很多废话&#xff0c;这里总结一下在CentOS7环境下的安装配置过程。如需理解原理&#xff0c;请看官网原文的安装指南或翻译1. 安装RabbitMQ server ## 安装epel源 yum install -y epel-release## 安装Erlang yum inst…