ARM Linux静态映射分析

在华清远见上课过程中,发现静态映射方面初学者比较难于掌握和理解,下面分析一下静态映射机制的原理并通过GPIO和USB、LCD等的静态映射作为例子来说明如何通过这种静态映射的方式访问外设资源。

内核提供了一个重要的结构体struct machine_desc ,这个结构体在内核移植中起到相当重要的作用,内核通过machine_desc结构体来控制系统体系架构相关部分的初始化。machine_desc结构体的成员包含了体系架构相关部分的几个最重要的初始化函数,包括map_io,init_irq, init_machine以及phys_io , timer成员等。

machine_desc结构体定义如下:

struct machine_desc {
            /*
                * Note! The first four elements are used
                * by assembler code in head-armv.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);
        };

machine_desc结构体通过MACHINE_START宏来初始化,这里以s3c2410平台为例:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwxfzf.html