当前位置:编程学习 > 网站相关 >>

由驱动板级初始化发生的联想:内核解压,机器码匹配,uboot之bootm解析

[plain] 
#ifndef _LINUX_INIT_H  
#define _LINUX_INIT_H  
  
#include <linux/compiler.h>  
。。。。。  
  
/* These are for everybody (although not all archs will actually  
   discard it in modules) */  
#define __init        __section(.init.text) __cold notrace  
#define __initdata    __section(.init.data)  
#define __initconst    __section(.init.rodata)  
#define __exitdata    __section(.exit.data)  
#define __exit_call    __used __section(.exitcall.exit)  
  
/* modpost check for section mismatches during the kernel build.  
 * A section mismatch happens when there are references from a  
 * code or data section to an init section (both code or data).  
 * The init sections are (for most archs) discarded by the kernel  
 * when early init has completed so all such references are potential bugs.  
 * For exit sections the same issue exists.  
 * The following markers are used for the cases where the reference to  
 * the *init / *exit section (code or data) is valid and will teach  
 * modpost not to issue a warning.  
 * The markers follow same syntax rules as __init / __initdata. */  
#define __ref            __section(.ref.text) noinline  
#define __refdata        __section(.ref.data)  
#define __refconst       __section(.ref.rodata)  
  
/* compatibility defines */  
#define __init_refok     __ref  
#define __initdata_refok __refdata  
#define __exit_refok     __ref  
  
  
#ifdef MODULE  
#define __exitused  
#else  
#define __exitused  __used  
#endif  
。。。。。。  
  
#ifndef __ASSEMBLY__  
/*  
 * Used for initialization calls..  
 */  
typedef int (*initcall_t)(void);  
typedef void (*exitcall_t)(void);  
  
extern initcall_t __con_initcall_start[], __con_initcall_end[];  
extern initcall_t __security_initcall_start[], __security_initcall_end[];  
  
/* Used for contructor calls. */  
typedef void (*ctor_fn_t)(void);  
  
/* Defined in init/main.c */  
extern int do_one_initcall(initcall_t fn);  
extern char __initdata boot_command_line[];  
extern char *saved_command_line;  
extern unsigned int reset_devices;  
  
。。。。。。  
  
<span style="color:#FF0000;">#define __define_initcall(level,fn,id) \  
    static initcall_t __initcall_##fn##id __used \  
    __attribute__((__section__(".initcall" level ".init"))) = fn  
  
/*</span>  
 * Early initcalls run before initializing SMP.  
 *  
 * Only for built-in code, not modules.  
 */  
#define early_initcall(fn)        __define_initcall("early",fn,early)  
  
/*  
 * A "pure" initcall has no dependencies on anything else, and purely  
 * initializes variables that couldn't be statically initialized.  
 *  
 * This only exists for built-in code, not for modules.  
<span style="color:#FF0000;"> */  
#define pure_initcall(fn)        __define_initcall("0",fn,0)  
  
#define core_initcall(fn)        __define_initcall("1",fn,1)  
#define core_initcall_sync(fn)        __define_initcall("1s",fn,1s)  
#define postcore_initcall(fn)        __define_initcall("2",fn,2)  
#define postcore_initcall_sync(fn)    __define_initcall("2s",fn,2s)  
#define arch_initcall(fn)        __define_initcall("3",fn,3)  
#define arch_initcall_sync(fn)        __define_initcall("3s",fn,3s)  
#define subsys_initcall(fn)        __define_initcall("4",fn,4)  
#define subsys_initcall_sync(fn)    __define_initcall("4s",fn,4s)  
#define fs_initcall(fn)            __define_initcall("5",fn,5)  
#define fs_initcall_sync(fn)        __define_initcall("5s",fn,5s)  
#define rootfs_initcall(fn)        __define_initcall("rootfs",fn,rootfs)  
#define device_initcall(fn)        __define_initcall("6",fn,6)  
#define device_initcall_sync(fn)    __define_initcall("6s",fn,6s)  
#define late_initcall(fn)        __define_initcall("7",fn,7)  
#define late_initcall_sync(fn)        __define_initcall("7s",fn,7s)  
</span>  
<span style="color:#FF0000;">#define __initcall(fn) device_initcall(fn)</span>  
  
#define __exitcall(fn) \  
    static exitcall_t __exitcall_##fn __exit_call = fn  
  
#define console_initcall(fn) \  
    static initcall_t __initcall_##fn \  
    __used __section(.con_initcall.init) = fn  
  
#define security_initcall(fn) \  
    static initcall_t __initcall_##fn \  
    __used __section(.security_initcall.init) = fn  
  
struct obs_kernel_param {  
    const char *str;  
    int (*setup_func)(char *);  
    int early;  
};  
  
/*  
 * Only for really core code.  See moduleparam.h for the normal way.  
 *  
 * Force the alignment so the compiler doesn't space elements of the  
 * obs_kernel_param "array" too far apart in .init.setup.  
 */  
#define __setup_param(str, unique_id, fn, early)            \  
    static const char __setup_str_##unique_id[] __initconst    \  
        __aligned(1) = str; \  
    static struct obs_kernel_param __setup_##unique_id    \  
  &n
补充:综合编程 , 其他综合 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,