- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
1
嵌入式系统
An Introduction to Embedded System
浙江大学计算机学院
2012年4月
第8课 内核移植和模块的构建
提纲
1、系统的启动和初始化
2、内核移植
3、 Linux的模块机制
4
1. 系统的启动和初始化
使用bootloader将内核映像载入
内核数据结构初始化(内核引导第一部分) :
start_kernel()中调用了一系列初始化函数,以完成kernel本身的设置
调用init()过程,创建第一个内核线程。
5
Start_kernel():
输出Linux版本信息(printk(linux_banner))
设置与体系结构相关的环境(setup_arch())
页表结构初始化(paging_init())
设置系统自陷入口(trap_init())
初始化系统IRQ(init_IRQ())
核心进程调度器初始化(包括初始化几个缺省的Bottom-half,sched_init())
时间、定时器初始化(包括读取CMOS时钟、估测主频、初始化定时器中断等,time_init())
提取并分析核心启动参数(从环境变量中读取参数,设置相应标志位等待处理,(parse_options())
控制台初始化(为输出信息而先于PCI初始化,console_init())
剖析器数据结构初始化(prof_buffer和prof_len变量)
核心Cache初始化(描述Cache信息的Cache,kmem_cache_init())
延迟校准(获得时钟jiffies与CPU主频ticks的延迟,calibrate_delay())
6
内存初始化(设置内存上下界和页表项初始值,mem_init())
创建和设置内部及通用cache(slab_cache,kmem_cache_sizes_init())
创建uid taskcount SLAB cache(uid_cache,uidcache_init())
创建文件cache(files_cache,filescache_init())
创建目录cache(dentry_cache,dcache_init())
创建与虚存相关的cache(vm_area_struct,mm_struct,vma_init())
块设备读写缓冲区初始化(同时创建buffer_headcache用户加速访问,buffer_init())
创建页cache(内存页hash表初始化,page_cache_init())
创建信号队列cache(signal_queue,signals_init())
初始化内存inode表(inode_init())
创建内存文件描述符表(filp_cache,file_table_init())
SMP机器其余CPU(除当前引导CPU)初始化(对于没有配置SMP的内核,此函数为空,smp_init())
启动init过程(创建第一个核心线程,调用init()函数,原执行序列调用cpu_idle() 等待调度,init())
至此start_kernel()结束,基本的核心环境已经建立起来了。
7
外设初始化--内核引导第二部分:
init()函数作为内核线程,首先锁定内核,然后调用do_basic_setup()完成外设及其驱动程序的加载和初始化
do_basic_setup()返回后,init()使用execve()系统调用加载执行init程序。
8
Do_basic_setup():
总线初始化(比如pci_init())
网络初始化(初始化网络数据结构,包括sk_init()、skb_init()和proto_init()三部分,在proto_init()中,将调用protocols结构中包含的所有协议的初始化过程,sock_init())
创建bdflush核心线程(bdflush()过程常驻核心空间,由核心唤醒来清理被写过的内存缓冲区,当bdflush()由kernel_thread()启动后,它将自己命名为kflushd)
创建kupdate核心线程(kupdate()过程常驻核心空间,由核心按时调度执行,将内存缓冲区中的信息更新到磁盘中,更新的内容包括超级块和inode表)
设置并启动核心调页线程kswapd(为了防止kswapd启动时将版本信息输出到其他信息中间,核心线调用kswapd_setup()设置kswapd运行所要求的环境,然后再创建 kswapd核心线程)
9
创建事件管理核心线程(start_context_thread()函数启动context_thread()过程,并重命名为keventd)
设备初始化(包括并口par
原创力文档


文档评论(0)