⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 嵌入式系统设计与实例开发实验教材二源码 多线程应用程序设计 串行端口程序设计 AD接口实验 CAN总线通信实验 GPS通信实验 Linux内核移植与编译实验 IC卡读写实验 SD驱动使
💻 C
📖 第 1 页 / 共 2 页
字号:
/* *  linux/init/main.c * *  Copyright (C) 1991, 1992  Linus Torvalds * *  GK 2/5/95  -  Changed to support mounting root fs via NFS *  Added initrd & change_root: Werner Almesberger & Hans Lermen, Feb '96 *  Moan early if gcc is old, avoiding bogus kernels - Paul Gortmaker, May '96 *  Simplified starting of init:  Michael A. Griffith <grif@acm.org>  */#define __KERNEL_SYSCALLS__#include <linux/config.h>#include <linux/proc_fs.h>#include <linux/devfs_fs_kernel.h>#include <linux/unistd.h>#include <linux/string.h>#include <linux/ctype.h>#include <linux/delay.h>#include <linux/utsname.h>#include <linux/ioport.h>#include <linux/init.h>#include <linux/smp_lock.h>#include <linux/blk.h>#include <linux/hdreg.h>#include <linux/iobuf.h>#include <linux/bootmem.h>#include <linux/tty.h>#include <asm/io.h>#include <asm/bugs.h>#if defined(CONFIG_ARCH_S390)#include <asm/s390mach.h>#include <asm/ccwcache.h>#endif#ifdef CONFIG_PCI#include <linux/pci.h>#endif#ifdef CONFIG_DIO#include <linux/dio.h>#endif#ifdef CONFIG_ZORRO#include <linux/zorro.h>#endif#ifdef CONFIG_MTRR#  include <asm/mtrr.h>#endif#ifdef CONFIG_NUBUS#include <linux/nubus.h>#endif#ifdef CONFIG_ISAPNP#include <linux/isapnp.h>#endif#ifdef CONFIG_IRDAextern int irda_proto_init(void);extern int irda_device_init(void);#endif#ifdef CONFIG_X86_LOCAL_APIC#include <asm/smp.h>#endif/* * Versions of gcc older than that listed below may actually compile * and link okay, but the end product can have subtle run time bugs. * To avoid associated bogus bug reports, we flatly refuse to compile * with a gcc that is known to be too old from the very beginning. */#if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 91)#error Sorry, your GCC is too old. It builds incorrect kernels.#endifextern char _stext, _etext;extern char *linux_banner;static int init(void *);extern void init_IRQ(void);extern void init_modules(void);extern void sock_init(void);extern void fork_init(unsigned long);extern void mca_init(void);extern void sbus_init(void);extern void ppc_init(void);extern void sysctl_init(void);extern void signals_init(void);extern int init_pcmcia_ds(void);extern void free_initmem(void);#ifdef CONFIG_TCextern void tc_init(void);#endifextern void ecard_init(void);#if defined(CONFIG_SYSVIPC)extern void ipc_init(void);#endif#ifdef CONFIG_PERFMONextern void perfmon_init(void);#endif/* * Boot command-line arguments */#define MAX_INIT_ARGS 8#define MAX_INIT_ENVS 8extern void time_init(void);extern void softirq_init(void);int rows, cols;#ifdef CONFIG_BLK_DEV_INITRDunsigned int real_root_dev;	/* do_proc_dointvec cannot handle kdev_t */#endifint root_mountflags = MS_RDONLY;char *execute_command;char root_device_name[64];static char * argv_init[MAX_INIT_ARGS+2] = { "init", NULL, };static char * envp_init[MAX_INIT_ENVS+2] = { "HOME=/", "TERM=linux", NULL, };static int __init profile_setup(char *str){    int par;    if (get_option(&str,&par)) prof_shift = par;	return 1;}__setup("profile=", profile_setup);static struct dev_name_struct {	const char *name;	const int num;} root_dev_names[] __initdata = {	{ "nfs",     0x00ff },	{ "hda",     0x0300 },	{ "hdb",     0x0340 },	{ "loop",    0x0700 },	{ "hdc",     0x1600 },	{ "hdd",     0x1640 },	{ "hde",     0x2100 },	{ "hdf",     0x2140 },	{ "hdg",     0x2200 },	{ "hdh",     0x2240 },	{ "hdi",     0x3800 },	{ "hdj",     0x3840 },	{ "hdk",     0x3900 },	{ "hdl",     0x3940 },	{ "hdm",     0x5800 },	{ "hdn",     0x5840 },	{ "hdo",     0x5900 },	{ "hdp",     0x5940 },	{ "hdq",     0x5A00 },	{ "hdr",     0x5A40 },	{ "hds",     0x5B00 },	{ "hdt",     0x5B40 },	{ "sda",     0x0800 },	{ "sdb",     0x0810 },	{ "sdc",     0x0820 },	{ "sdd",     0x0830 },	{ "sde",     0x0840 },	{ "sdf",     0x0850 },	{ "sdg",     0x0860 },	{ "sdh",     0x0870 },	{ "sdi",     0x0880 },	{ "sdj",     0x0890 },	{ "sdk",     0x08a0 },	{ "sdl",     0x08b0 },	{ "sdm",     0x08c0 },	{ "sdn",     0x08d0 },	{ "sdo",     0x08e0 },	{ "sdp",     0x08f0 },	{ "ada",     0x1c00 },	{ "adb",     0x1c10 },	{ "adc",     0x1c20 },	{ "add",     0x1c30 },	{ "ade",     0x1c40 },	{ "fd",      0x0200 },	{ "md",      0x0900 },	     	{ "xda",     0x0d00 },	{ "xdb",     0x0d40 },	{ "ram",     0x0100 },	{ "scd",     0x0b00 },	{ "mcd",     0x1700 },	{ "cdu535",  0x1800 },	{ "sonycd",  0x1800 },	{ "aztcd",   0x1d00 },	{ "cm206cd", 0x2000 },	{ "gscd",    0x1000 },	{ "sbpcd",   0x1900 },	{ "eda",     0x2400 },	{ "edb",     0x2440 },	{ "pda",	0x2d00 },	{ "pdb",	0x2d10 },	{ "pdc",	0x2d20 },	{ "pdd",	0x2d30 },	{ "pcd",	0x2e00 },	{ "pf",		0x2f00 },	{ "apblock", APBLOCK_MAJOR << 8},	{ "ddv", DDV_MAJOR << 8},	{ "jsfd",    JSFD_MAJOR << 8},#if defined(CONFIG_ARCH_S390)	{ "dasda", (DASD_MAJOR << MINORBITS) },	{ "dasdb", (DASD_MAJOR << MINORBITS) + (1 << 2) },	{ "dasdc", (DASD_MAJOR << MINORBITS) + (2 << 2) },	{ "dasdd", (DASD_MAJOR << MINORBITS) + (3 << 2) },	{ "dasde", (DASD_MAJOR << MINORBITS) + (4 << 2) },	{ "dasdf", (DASD_MAJOR << MINORBITS) + (5 << 2) },	{ "dasdg", (DASD_MAJOR << MINORBITS) + (6 << 2) },	{ "dasdh", (DASD_MAJOR << MINORBITS) + (7 << 2) },#endif#if defined(CONFIG_BLK_CPQ_DA) || defined(CONFIG_BLK_CPQ_DA_MODULE)	{ "ida/c0d0p",0x4800 },	{ "ida/c0d1p",0x4810 },	{ "ida/c0d2p",0x4820 },	{ "ida/c0d3p",0x4830 },	{ "ida/c0d4p",0x4840 },	{ "ida/c0d5p",0x4850 },	{ "ida/c0d6p",0x4860 },	{ "ida/c0d7p",0x4870 },	{ "ida/c0d8p",0x4880 },	{ "ida/c0d9p",0x4890 },	{ "ida/c0d10p",0x48A0 },	{ "ida/c0d11p",0x48B0 },	{ "ida/c0d12p",0x48C0 },	{ "ida/c0d13p",0x48D0 },	{ "ida/c0d14p",0x48E0 },	{ "ida/c0d15p",0x48F0 },#endif#if defined(CONFIG_BLK_CPQ_CISS_DA) || defined(CONFIG_BLK_CPQ_CISS_DA_MODULE)	{ "cciss/c0d0p",0x6800 },	{ "cciss/c0d1p",0x6810 },	{ "cciss/c0d2p",0x6820 },	{ "cciss/c0d3p",0x6830 },	{ "cciss/c0d4p",0x6840 },	{ "cciss/c0d5p",0x6850 },	{ "cciss/c0d6p",0x6860 },	{ "cciss/c0d7p",0x6870 },	{ "cciss/c0d8p",0x6880 },	{ "cciss/c0d9p",0x6890 },	{ "cciss/c0d10p",0x68A0 },	{ "cciss/c0d11p",0x68B0 },	{ "cciss/c0d12p",0x68C0 },	{ "cciss/c0d13p",0x68D0 },	{ "cciss/c0d14p",0x68E0 },	{ "cciss/c0d15p",0x68F0 },#endif	{ "nftla", 0x5d00 },	{ "nftlb", 0x5d10 },	{ "nftlc", 0x5d20 },	{ "nftld", 0x5d30 },	{ "ftla", 0x2c00 },	{ "ftlb", 0x2c08 },	{ "ftlc", 0x2c10 },	{ "ftld", 0x2c18 },	{ "mtdblock", 0x1f00 },	{ NULL, 0 }};kdev_t __init name_to_kdev_t(char *line){	int base = 0;	if (strncmp(line,"/dev/",5) == 0) {		struct dev_name_struct *dev = root_dev_names;		line += 5;		do {			int len = strlen(dev->name);			if (strncmp(line,dev->name,len) == 0) {				line += len;				base = dev->num;				break;			}			dev++;		} while (dev->name);	}	return to_kdev_t(base + simple_strtoul(line,NULL,base?10:16));}static int __init root_dev_setup(char *line){	int i;	char ch;	ROOT_DEV = name_to_kdev_t(line);	memset (root_device_name, 0, sizeof root_device_name);	if (strncmp (line, "/dev/", 5) == 0) line += 5;	for (i = 0; i < sizeof root_device_name - 1; ++i)	{	    ch = line[i];	    if ( isspace (ch) || (ch == ',') || (ch == '\0') ) break;	    root_device_name[i] = ch;	}	return 1;}__setup("root=", root_dev_setup);static int __init checksetup(char *line){	struct kernel_param *p;	p = &__setup_start;	do {		int n = strlen(p->str);		if (!strncmp(line,p->str,n)) {			if (p->setup_func(line+n))				return 1;		}		p++;	} while (p < &__setup_end);	return 0;}/* this should be approx 2 Bo*oMips to start (note initial shift), and will   still work even if initially too large, it will just take slightly longer */unsigned long loops_per_jiffy = (1<<12);/* This is the number of bits of precision for the loops_per_jiffy.  Each   bit takes on average 1.5/HZ seconds.  This (like the original) is a little   better than 1% */#define LPS_PREC 8void __init calibrate_delay(void){	unsigned long ticks, loopbit;	int lps_precision = LPS_PREC;	loops_per_jiffy = (1<<12);	printk("Calibrating delay loop... ");	while (loops_per_jiffy <<= 1) {		/* wait for "start of" clock tick */		ticks = jiffies;		while (ticks == jiffies)			/* nothing */;		/* Go .. */		ticks = jiffies;		__delay(loops_per_jiffy);		ticks = jiffies - ticks;		if (ticks)			break;	}/* Do a binary approximation to get loops_per_jiffy set to equal one clock   (up to lps_precision bits) */	loops_per_jiffy >>= 1;	loopbit = loops_per_jiffy;	while ( lps_precision-- && (loopbit >>= 1) ) {		loops_per_jiffy |= loopbit;		ticks = jiffies;		while (ticks == jiffies);		ticks = jiffies;		__delay(loops_per_jiffy);		if (jiffies != ticks)	/* longer than 1 tick */			loops_per_jiffy &= ~loopbit;	}/* Round the value and print it */		printk("%lu.%02lu BogoMIPS\n",		loops_per_jiffy/(500000/HZ),		(loops_per_jiffy/(5000/HZ)) % 100);}static int __init readonly(char *str){	if (*str)		return 0;	root_mountflags |= MS_RDONLY;	return 1;}static int __init readwrite(char *str){	if (*str)		return 0;	root_mountflags &= ~MS_RDONLY;	return 1;}static int __init debug_kernel(char *str){	if (*str)		return 0;	console_loglevel = 10;	return 1;}static int __init quiet_kernel(char *str){	if (*str)		return 0;	console_loglevel = 4;	return 1;}__setup("ro", readonly);__setup("rw", readwrite);__setup("debug", debug_kernel);__setup("quiet", quiet_kernel);/* * This is a simple kernel command line parsing function: it parses * the command line, and fills in the arguments/environment to init * as appropriate. Any cmd-line option is taken to be an environment * variable if it contains the character '='.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -