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.pswp.cn/news/257380.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/257380.shtml
英文地址,請注明出處:http://en.pswp.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…