分享更有价值
被信任是一种快乐

linux内核是否有main函数

文章页正文上

本篇内容主要讲解“linux内核是否有main函数”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“linux内核是否有main函数”吧! linux内核有main函数;main函数是程序的入口,main是应用程序和操作系统之间约定好的一个接口名,所以linux中每个应用程序的第一个函数必须是main。linux内核源码之main函数解析这几天一直在纠结:main函数是程序的入口,一个程序启动后,经过bootloader的初始化就该经main函数进入C语言的世界,但是linux中每个应用程序的开始都是从main函数开始的。linux下有多个应用程序,岂不是有很多个main。那bootloader会知道跳到哪个main?多个main编译怎么不冲突?在网上搜索了很久,渐渐的有些明白了:1、main函数是C语言的入口,这句话没错;但是这句话仅仅是一个约定,而非一个亘古不变的铁律!从程序的更为本质的汇编代码来看,只是大家约定汇编初始化完了后,跳到一个名字叫”main”的标号处;言外之意就是这个标号也是可以改名的,比如linux的C语言入口就是start_kernel();从这个标号地址后就是C语言的天下了。用main这个名字仅仅是因为大家的约定而已,不遵守约定能玩的转也行啊,就像苹果充电线啥的都和别人不一样。2、在编译时是不存多个main函数的!每个应用程序虽说都有一个main函数(从应用程序来看应用程序的入口是main函数哦);但是应用程序都是独立编译的,不会一起编译,操作系统内核就更不可能和应用程序一起编译了!所以根本不存在多个main冲突的!!可能是统一操作系统与应用程序之间的接口,亦或是侧面影响下main是程序入口的说法,main是应用程序和操作系统之间约定好的一个接口名!所以linux中每个应用程序的第一个函数必须是main。除非你改掉了内核调度的接口地方。3、linux的应用程序的安装启动也可以类比下我们每天都在用的Windows。Windows应用程序的安装其实也是把一些执行文件拷贝到指定的文件夹里(从绿色软件看),点击就可以运行。linux下也是这样。编译好的bin文件放到指定的文件夹目录下,然后用命令启动执行。

/*
*linux/init/main.c
*
*Copyright(C)1991,1992LinusTorvalds
*
*GK2/5/95-ChangedtosupportmountingrootfsviaNFS
*Addedinitrd&change_root:WernerAlmesberger&HansLermen,Feb'96
*Moanearlyifgccisold,avoidingboguskernels-PaulGortmaker,May'96
*Simplifiedstartingofinit:MichaelA.Griffith
*start_kernel->rest_init->kernel_init创建用户initpid=1
->kthreadd管理内核线程pid=x
->pid=0,是idle线程
在rest_init中,会创建kernel_init线程,它负责创建用户init进程,完成工作后,自己
化身为idle线程
*/

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

#include
#include
#include
#include
#include

#ifdefCONFIG_X86_LOCAL_APIC
#include
#endif

staticintkernel_init(void*);

externvoidinit_IRQ(void);
externvoidfork_init(unsignedlong);
externvoidmca_init(void);
externvoidsbus_init(void);
externvoidprio_tree_init(void);
externvoidradix_tree_init(void);
#ifndefCONFIG_DEBUG_RODATA
staticinlinevoidmark_rodata_ro(void){}
#endif

#ifdefCONFIG_TC
externvoidtc_init(void);
#endif

/*
*Debughelper:viathisflagweknowthatwearein'earlybootupcode'
*whereonlythebootprocessorisrunningwithIRQdisabled.Thismeans
*twothings-IRQmustnotbeenabledbeforetheflagisclearedandsome
*operationswhicharenotallowedwithIRQdisabledareallowedwhilethe
*flagisset.
*/
boolearly_boot_irqs_disabled__read_mostly;

enumsystem_statessystem_state__read_mostly;
EXPORT_SYMBOL(system_state);

/*
*Bootcommand-linearguments
*/
#defineMAX_INIT_ARGSCONFIG_INIT_ENV_ARG_LIMIT
#defineMAX_INIT_ENVSCONFIG_INIT_ENV_ARG_LIMIT

externvoidtime_init(void);
/*DefaultlatetimeinitisNULL.archscanoverridethislater.*/
void(*__initdatalate_time_init)(void);
externvoidsoftirq_init(void);

/*Untouchedcommandlinesavedbyarch-specificcode.*/
char__initdataboot_command_line[COMMAND_LINE_SIZE];
/*Untouchedsavedcommandline(eg.for/proc)*/
char*saved_command_line;
/*Commandlineforparameterparsing*/
staticchar*static_command_line;

staticchar*execute_command;
staticchar*ramdisk_execute_command;

/*
*Ifset,thisisanindicationtothedriversthatresettheunderlying
*devicebeforegoingaheadwiththeinitializationotherwisedrivermight
*relyontheBIOSandskiptheresetoperation.
*
*Thisisusefulifkernelisbootinginanunreliableenvironment.
*Forex.kdumpsituaitonwherepreviouskernelhascrashed,BIOShasbeen
*skippedanddeviceswillbeinunknownstate.
*/
unsignedintreset_devices;
EXPORT_SYMBOL(reset_devices);

staticint__initset_reset_devices(char*str)
{
reset_devices=1;
return1;
}

__setup("reset_devices",set_reset_devices);

staticconstchar*argv_init[MAX_INIT_ARGS+2]={"init",NULL,};
constchar*envp_init[MAX_INIT_ENVS+2]={"HOME=/","TERM=linux",NULL,};
staticconstchar*panic_later,*panic_param;

externconststructobs_kernel_param__setup_start[],__setup_end[];

staticint__initobsolete_checksetup(char*line)
{
conststructobs_kernel_param*p;
inthad_early_param=0;

p=__setup_start;
do{
intn=strlen(p->str);
if(parameqn(line,p->str,n)){
if(p->early){
/*Alreadydoneinparse_early_param?
*(Needsexactmatchonparampart).
*Keepiterating,aswecanhaveearly
*paramsand__setupsofsamenames8(*/
if(line[n]==''||line[n]=='=')
had_early_param=1;
}elseif(!p->setup_func){
printk(KERN_WARNING"Parameter%sisobsolete,"
"ignoredn",p->str);
return1;
}elseif(p->setup_func(line+n))
return1;
}
p++;
}while(pearly&&parameq(param,p->str))||
(strcmp(param,"console")==0&&
strcmp(p->str,"earlycon")==0)
){
if(p->setup_func(val)!=0)
printk(KERN_WARNING
"Malformedearlyoption'%s'n",param);
}
}
/*Weaccepteverythingatthisstage.*/
return0;
}
void__initparse_early_options(char*cmdline)
{
parse_args("earlyoptions",cmdline,NULL,0,0,0,do_early_param);
}
/*Archcodecallsthisearlyon,orifnot,justbeforeotherparsing.*/
void__initparse_early_param(void)
{
static__initdataintdone=0;
static__initdatachartmp_cmdline[COMMAND_LINE_SIZE];
if(done)
return;
/*Allfallthroughtodo_early_param.*/
strlcpy(tmp_cmdline,boot_command_line,COMMAND_LINE_SIZE);
parse_early_options(tmp_cmdline);
done=1;
}
/*
*Activatethefirstprocessor.
*/
staticvoid__initboot_cpu_init(void)
{
intcpu=smp_processor_id();
/*Markthebootcpu"present","online"etcforSMPandUPcase*/
set_cpu_online(cpu,true);
set_cpu_active(cpu,true);
set_cpu_present(cpu,true);
set_cpu_possible(cpu,true);
}
void__init__weaksmp_setup_processor_id(void)
{
}
void__init__weakthread_info_cache_init(void)
{
}
/*
*Setupkernelmemoryallocators
*/
staticvoid__initmm_init(void)
{
/*
*page_cgrouprequirescontiguouspages,
*biggerthanMAX_ORDERunlessSPARSEMEM.
*/
page_cgroup_init_flatmem();
mem_init();
kmem_cache_init();
percpu_init_late();
pgtable_cache_init();
vmalloc_init();
}
asmlinkagevoid__initstart_kernel(void)
{
char*command_line;
externconststructkernel_param__start___param[],__stop___param[];
/*
*Needtorunasearlyaspossible,toinitializethe
*lockdephash:
*/
//免费云主机、域名初始化2个hash表-LockDependencyValidator(内核依赖的关系表)
lockdep_init();
smp_setup_processor_id();//空函数
debug_objects_early_init(

相关推荐: win7与win10双系统不能选如何解决

本篇内容主要讲解“win7与win10双系统不能选如何解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“win7与win10双系统不能选如何解决”吧!原因:win7的启动项损坏了。1、将启动U盘接入电脑系统,开启电…

文章页内容下
赞(0) 打赏
版权声明:本站采用知识共享、学习交流,不允许用于商业用途;文章由发布者自行承担一切责任,与本站无关。
文章页正文下
文章页评论上

云服务器、web空间可免费试用

宝塔面板主机、支持php,mysql等,SSL部署;安全高速企业专供99.999%稳定,另有高防主机、不限制内容等类型,具体可咨询QQ:360163164,Tel同微信:18905205712

主机选购导航云服务器试用

登录

找回密码

注册