本篇内容主要讲解“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&¶meq(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的启动项损坏了。1、将启动U盘接入电脑系统,开启电…