在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可以查看。

在内核文件中arch/arm/tools/mach-types定义目前内核支持的板卡、芯片等:

##machine_is_xxx  CONFIG_xxxx  MACH_TYPE_xxx  number

at91sam9g10ek   MACH_AT91sam9G10EK  AT91SAM9G10EK  2159

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。

参考:

1. http://blog.sina.com.cn/s/blog_753fd0b00100t8js.html

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

linux中MACHINE_START&END在9g10ek上实现的更多相关文章

  1. 第十篇:Linux中权限的再讨论( 上 )

    前言 在Linux系统中,用户分为 个权限位.好了,很多朋友对于Linux权限的了解就仅限于此了.但,Linux目录权限和文件权限一样吗?内核对于权限的检查过程又是怎样的? 如果你不清楚,本文将为你解 ...

  2. Linux 中权限的再讨论( 上 )

    前言 在Linux系统中,用户分为三个部分( 所有者 同组人 其他 ).每个部分的权限又可以赋予读/写/执行权限.这样,文件的权限标记一共包含 9 个权限位.好了,很多朋友对于Linux权限的了解就仅 ...

  3. Linux_window与linux之间文件互传,上传下载

    window与linux之间文件互传 运行环境:Centos os7 + win8.1 +putty putty:是一个Telnet,ssh,rlogin,纯tcp以及串行接口连接软件,由于linux ...

  4. Linux中ftp不能上传文件/目录的解决办法

    在linux中不能上传文件或文件夹最多的问题就是权限问题,但有时也不一定是权限问题了,像我就是空间不够用了,下面我来总结一些ftp不能上传文件/目录的解决办法   在排除用户组和权限等问题后,最可能引 ...

  5. linux中probe函数中传递的参数来源(上)

    点击打开链接 上一篇中,我们追踪了probe函数在何时调用,知道了满足什么条件会调用probe函数,但probe函数中传递的参数我们并不知道在何时定义,到底是谁定义的,反正不是我们在驱动中定义的(当然 ...

  6. Linux中检查本地系统上的开放端口列表的方法

    在 Linux 中很少有用于此目的的实用程序.然而,我提供了四个最重要的 Linux 命令来检查这一点. 你可以使用以下四个命令来完成这个工作.这些命令是非常出名的并被 Linux 管理员广泛使用.n ...

  7. linux中使用lftp上传下载文件

    lftp是linux中一款ftp服务器相比windows中的ftp显得要复杂不少了,下面我来总结一下lftp文件上传,文件下载,及文件查找等等相关命令吧. lftp连接的几种方法,最常用的是lftp ...

  8. 如何在Linux中使用sFTP上传或下载文件与文件夹

    如何在Linux中使用sFTP上传或下载文件与文件夹 sFTP(安全文件传输程序)是一种安全的交互式文件传输程序,其工作方式与 FTP(文件传输协议)类似. 然而,sFTP 比 FTP 更安全;它通过 ...

  9. 【Linux开发】OpenCV在ARM-linux上的移植过程遇到的问题4---共享库中嵌套库带路径【已解决】

    [Linux开发]OpenCV在ARM-linux上的移植过程遇到的问题4-共享库中嵌套库带路径[已解决] 标签:[Linux开发] 紧接着上一篇,我居然又尝试了一下编译opencv,主要是因为由于交 ...

随机推荐

  1. URL重写IIS7(URL Rewrite Module) 比之前的urlrewrite更方便使用

    原文发布时间为:2011-02-24 -- 来源于本人的百度文章 [由搬家工具导入] 微软在IIS7中添加了URL的重写模块,并且免费使用,可以导入.htaccess规则,确实是个不错的选择 URL ...

  2. div切换 div轮换显示

    原文发布时间为:2009-05-10 -- 来源于本人的百度文章 [由搬家工具导入] <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tran ...

  3. MongoDB如何使用“”用户名和密码“”

    在去年的 DB 勒索事件之后, 不少的同学开始加强 Mongodb 的安全性, 其中一种办法就是设置复杂的密码. 那么问题来了, 如果设置的密码里包含一些如 “@”, “:” 一样的特殊字符怎么办? ...

  4. Atcoder CODE FESTIVAL 2017 qual C D - Yet Another Palindrome Partitioning 回文串划分

    题目链接 题意 给定一个字符串(长度\(\leq 2e5\)),将其划分成尽量少的段,使得每段内重新排列后可以成为一个回文串. 题解 分析 每段内重新排列后是一个回文串\(\rightarrow\)该 ...

  5. PE笔记之PE基本结构图(PE笔记索引)

    PE(Portable Execute) 文件是Windows下可执行文件的总称,常见的有DLL,EXE,OCX,SYS等,事实上,一个文件是否是PE文件与其扩展名无关,PE文件可以是任 何扩展名.那 ...

  6. HTML5-contentEditable属性规定是否可编辑元素的内容

    contentEditable='true' :可以编辑 contentEditable='false' :不可以编辑

  7. Factory Method 和AbstractFactory

    对应慕课视频的连接:https://www.imooc.com/video/5316 1,工厂模式的应用场景 有一组类似的对象需要被创建 在编码时不能预见需要被创建哪种类的实例 在系统需要考虑扩展性的 ...

  8. SQLServer出现不允许保存更改的问题解决

    如图所示: 解决方法: [工具]->[选项]

  9. android 内存泄漏出现的情况

    非静态内部类的静态实例由于内部类默认持有外部类的引用,而静态实例属于类.所以,当外部类被销毁时,内部类仍然持有外部类的引用,致使外部类无法被GC回收.因此造成内存泄露. 类的静态变量持有大数据对象静态 ...

  10. New Ubuntu 16.04 Server Checklist

    新的云服务器需要进行一些配置和安装一些软件,推荐Digitalocean社区的一些教程 服务器配置(包括SSH,安全设置):https://www.digitalocean.com/community ...