当前位置: 首页 > news >正文

linux machine start,linux中MACHINE_STARTEND在9g10ek上实现

在linux的板卡初始化文件中有machine的相关定义

//arch/arm/mach-at91/board-sam9261ek.c

MACHINE_START(AT91SAM9G10EK, "Atmel AT91SAM9G10-EK")

/* Maintainer: Atmel */

.phys_io    = AT91_BASE_SYS,

.io_pg_offst    = (AT91_VA_BASE_SYS >> 18) & 0xfffc,

.boot_params    = AT91_SDRAM_BASE + 0x100,

.timer      = &at91sam926x_timer,

.map_io     = ek_map_io,

.init_irq   = ek_init_irq,

.init_machine   = ek_board_init,

MACHINE_END

其中MACHINE_START和MACHINE_END为宏定义,定义于文件

//arch/arm/include/asm/arch.h

#ifndef __ASSEMBLY__

struct tag;

struct meminfo;

struct sys_timer;

struct machine_desc {

/*

* Note! The first four elements are used

* by assembler code in head.S, head-common.S

*/

unsigned int        nr;     /* architecture number  */

unsigned int        phys_io;    /* start of physical io */

unsigned int        io_pg_offst;    /* byte offset for io

* page tabe entry  */

const char      *name;      /* architecture name    */

unsigned long       boot_params;    /* tagged list      */

unsigned int        video_start;    /* start of video RAM   */

unsigned int        video_end;  /* end of video RAM */

unsigned int        reserve_lp0 :1; /* never has lp0    */

unsigned int        reserve_lp1 :1; /* never has lp1    */

unsigned int        reserve_lp2 :1; /* never has lp2    */

unsigned int        soft_reboot :1; /* soft reboot      */

void            (*fixup)(struct machine_desc *,

struct tag *, char **,

struct meminfo *);

void            (*map_io)(void);/* IO mapping function  */

void            (*init_irq)(void);

struct sys_timer    *timer;     /* system tick timer    */

void            (*init_machine)(void);

};

/*

* Set of macros to define architecture features.  This is built into

* a table by the linker.

*/

#define MACHINE_START(_type,_name)          \

static const struct machine_desc __mach_desc_##_type    \

__used                         \

__attribute__((__section__(".arch.info.init"))) = {    \

.nr     = MACH_TYPE_##_type,        \

.name       = _name,

#define MACHINE_END             \

};

#endif

MACH_TYPE_ AT91SAM9G10EK是9G10ek开发板在linux中的机器号。

“Atmel AT91SAM9G10-EK”是开发板信息,在终端输入cat /proc/cpuinfo可以查看。

MACHINE_START主要定义了“struct machine_desc”的类型,放在section(“.arch.info.init”),是初始化数据,kernel起来之后将被丢弃。

其余各个成员函数在setup_arch()中被赋值到内核结构体,在不同时期被调用:

1. .init_machine 在 arch/arm/kernel/setup.c 中被 customize_machine 调用,放在 arch_initcall() 段里面,会自动按顺序被调用。

arch_initcall(customize_machine);

customize_machine()[setup.c#692] -> init_machine();

2. .init_irq在start_kernel()(文件init/main.c)--> init_IRQ() (在文件arch/arm/kernel/Irq.c)--> init_arch_irq()中被调用

3. .map_io 在 start_kernel()(文件init/main.c)-->setup_arch(&command_line) (在文件arch/arm/kernel/setup.c)-->

paging_init()(在文件arch/arm/kernel/mm/Mmu.c)

--> devicemaps_init()(在文件arch/arm/kernel/mm/Mmu.c)中被调用

4. .timer是定义系统时钟,定义TIMER4为系统时钟,在arch/arm/plat-s3c/time.c中体现。在start_kernel() --> time_init()(在文件arch/arm/kernel/Time.c)-->system_time->init()中调用。

5. .boot_params是bootloader向内核传递的参数的位置,这要和bootloader中参数的定义要一致。

从它们在start_kernel()中被调用的顺序,可知它们执行的先后为:map_io; init_irq; timer->time_init; init_machine。

参考:

2. http://blog.csdn.net/thl789/article/details/6699259

原文:http://www.cnblogs.com/embedded-linux/p/5796245.html

相关文章:

  • android设置按钮大小为屏幕百分比,android – 设置UI元素的位置/大小为屏幕大小的百分比...
  • android4.1用哪个ndk编译,androidstudio中用ndk编译的问题
  • 海美迪盒子android升级,海美迪4K播放器直升安卓7.0 画质再上新境界
  • android 手势旋转,android中手势操作图片的平移、缩放、旋转
  • 微信分身 android,微信分身版安卓版
  • android的设备节点,无法打开设备节点android
  • html加载图标的xpath位置,在格式不正确的HTML中使用XPath查找节点(或...
  • html 布局 id class,不使用class和id进行网页布局的方法
  • html画布模板,html2canvas.js
  • 川信计算机组装维护,凉山州中学生技能大赛信息技术类竞赛总结
  • 计算机应用基础_在线作业_e,计算机应用基础_在线作业_E.doc
  • 会计电算化的过程 实质上是用计算机,河南电大会计学专科《社会实践(会专)》(教考一体化)网上考试试题及答案...
  • html輸出excel,Javascript HTML表單table輸出Excel
  • 论计算机网络犯罪结论,论计算机网络犯罪的立法建议
  • asp无法word转html,word转html实现预览(asp.net)
  • 30秒的PHP代码片段(1)数组 - Array
  • CentOS7简单部署NFS
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • java中的hashCode
  • Making An Indicator With Pure CSS
  • Mithril.js 入门介绍
  • Node + FFmpeg 实现Canvas动画导出视频
  • overflow: hidden IE7无效
  • WePY 在小程序性能调优上做出的探究
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 区块链分支循环
  • linux 淘宝开源监控工具tsar
  • 如何正确理解,内页权重高于首页?
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • #pragam once 和 #ifndef 预编译头
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (ibm)Java 语言的 XPath API
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (二)换源+apt-get基础配置+搜狗拼音
  • (翻译)terry crowley: 写给程序员
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (五)网络优化与超参数选择--九五小庞
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (一)UDP基本编程步骤
  • (转) RFS+AutoItLibrary测试web对话框
  • *p++,*(p++),*++p,(*p)++区别?
  • .NET 5种线程安全集合
  • .Net FrameWork总结
  • .net反编译工具
  • /etc/shadow字段详解
  • ::前边啥也没有
  • @JsonSerialize注解的使用
  • [ 云计算 | AWS 实践 ] Java 如何重命名 Amazon S3 中的文件和文件夹
  • [120_移动开发Android]008_android开发之Pull操作xml文件
  • [20170705]lsnrctl status LISTENER_SCAN1
  • [Angularjs]asp.net mvc+angularjs+web api单页应用之CRUD操作
  • [BZOJ 1040] 骑士
  • [C++]拼图游戏