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

📄 init.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 2 页
字号:
/* *  PowerPC version *    Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org) * *  Modifications by Paul Mackerras (PowerMac) (paulus@cs.anu.edu.au) *  and Cort Dougan (PReP) (cort@cs.nmt.edu) *    Copyright (C) 1996 Paul Mackerras *  Amiga/APUS changes by Jesper Skov (jskov@cygnus.co.uk). *  PPC44x/36-bit changes by Matt Porter (mporter@mvista.com) * *  Derived from "arch/i386/mm/init.c" *    Copyright (C) 1991, 1992, 1993, 1994  Linus Torvalds * *  This program is free software; you can redistribute it and/or *  modify it under the terms of the GNU General Public License *  as published by the Free Software Foundation; either version *  2 of the License, or (at your option) any later version. * */#include <linux/config.h>#include <linux/module.h>#include <linux/sched.h>#include <linux/kernel.h>#include <linux/errno.h>#include <linux/string.h>#include <linux/types.h>#include <linux/mm.h>#include <linux/stddef.h>#include <linux/init.h>#include <linux/bootmem.h>#include <linux/highmem.h>#include <linux/initrd.h>#include <linux/pagemap.h>#include <asm/pgalloc.h>#include <asm/prom.h>#include <asm/io.h>#include <asm/mmu_context.h>#include <asm/pgtable.h>#include <asm/mmu.h>#include <asm/smp.h>#include <asm/machdep.h>#include <asm/btext.h>#include <asm/tlb.h>#include <asm/bootinfo.h>#include "mem_pieces.h"#include "mmu_decl.h"#if defined(CONFIG_KERNEL_START_BOOL) || defined(CONFIG_LOWMEM_SIZE_BOOL)/* The ammount of lowmem must be within 0xF0000000 - KERNELBASE. */#if (CONFIG_LOWMEM_SIZE > (0xF0000000 - KERNELBASE))#error "You must adjust CONFIG_LOWMEM_SIZE or CONFIG_START_KERNEL"#endif#endif#define MAX_LOW_MEM	CONFIG_LOWMEM_SIZEDEFINE_PER_CPU(struct mmu_gather, mmu_gathers);unsigned long total_memory;unsigned long total_lowmem;unsigned long ppc_memstart;unsigned long ppc_memoffset = PAGE_OFFSET;int mem_init_done;int init_bootmem_done;int boot_mapsize;#ifdef CONFIG_PPC_PMACunsigned long agp_special_page;EXPORT_SYMBOL(agp_special_page);#endifextern char _end[];extern char etext[], _stext[];extern char __init_begin, __init_end;#ifdef CONFIG_HIGHMEMpte_t *kmap_pte;pgprot_t kmap_prot;EXPORT_SYMBOL(kmap_prot);EXPORT_SYMBOL(kmap_pte);#endifvoid MMU_init(void);void set_phys_avail(unsigned long total_ram);/* XXX should be in current.h  -- paulus */extern struct task_struct *current_set[NR_CPUS];char *klimit = _end;struct mem_pieces phys_avail;/* * this tells the system to map all of ram with the segregs * (i.e. page tables) instead of the bats. * -- Cort */int __map_without_bats;int __map_without_ltlbs;/* max amount of RAM to use */unsigned long __max_memory;/* max amount of low RAM to map in */unsigned long __max_low_memory = MAX_LOW_MEM;void show_mem(void){	int i,free = 0,total = 0,reserved = 0;	int shared = 0, cached = 0;	int highmem = 0;	printk("Mem-info:\n");	show_free_areas();	printk("Free swap:       %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10));	i = max_mapnr;	while (i-- > 0) {		total++;		if (PageHighMem(mem_map+i))			highmem++;		if (PageReserved(mem_map+i))			reserved++;		else if (PageSwapCache(mem_map+i))			cached++;		else if (!page_count(mem_map+i))			free++;		else			shared += page_count(mem_map+i) - 1;	}	printk("%d pages of RAM\n",total);	printk("%d pages of HIGHMEM\n", highmem);	printk("%d free pages\n",free);	printk("%d reserved pages\n",reserved);	printk("%d pages shared\n",shared);	printk("%d pages swap cached\n",cached);}/* Free up now-unused memory */static void free_sec(unsigned long start, unsigned long end, const char *name){	unsigned long cnt = 0;	while (start < end) {		ClearPageReserved(virt_to_page(start));		set_page_count(virt_to_page(start), 1);		free_page(start);		cnt++;		start += PAGE_SIZE; 	}	if (cnt) {		printk(" %ldk %s", cnt << (PAGE_SHIFT - 10), name);		totalram_pages += cnt;	}}void free_initmem(void){#define FREESEC(TYPE) \	free_sec((unsigned long)(&__ ## TYPE ## _begin), \		 (unsigned long)(&__ ## TYPE ## _end), \		 #TYPE);	printk ("Freeing unused kernel memory:");	FREESEC(init); 	printk("\n");	ppc_md.progress = NULL;#undef FREESEC}#ifdef CONFIG_BLK_DEV_INITRDvoid free_initrd_mem(unsigned long start, unsigned long end){	printk ("Freeing initrd memory: %ldk freed\n", (end - start) >> 10);	for (; start < end; start += PAGE_SIZE) {		ClearPageReserved(virt_to_page(start));		set_page_count(virt_to_page(start), 1);		free_page(start);		totalram_pages++;	}}#endif/* * Check for command-line options that affect what MMU_init will do. */void MMU_setup(void){	/* Check for nobats option (used in mapin_ram). */	if (strstr(cmd_line, "nobats")) {		__map_without_bats = 1;	}	if (strstr(cmd_line, "noltlbs")) {		__map_without_ltlbs = 1;	}	/* Look for mem= option on command line */	if (strstr(cmd_line, "mem=")) {		char *p, *q;		unsigned long maxmem = 0;		for (q = cmd_line; (p = strstr(q, "mem=")) != 0; ) {			q = p + 4;			if (p > cmd_line && p[-1] != ' ')				continue;			maxmem = simple_strtoul(q, &q, 0);			if (*q == 'k' || *q == 'K') {				maxmem <<= 10;				++q;			} else if (*q == 'm' || *q == 'M') {				maxmem <<= 20;				++q;			}		}		__max_memory = maxmem;	}}/* * MMU_init sets up the basic memory mappings for the kernel, * including both RAM and possibly some I/O regions, * and sets up the page tables and the MMU hardware ready to go. */void __init MMU_init(void){	if (ppc_md.progress)		ppc_md.progress("MMU:enter", 0x111);	/* parse args from command line */	MMU_setup();	/*	 * Figure out how much memory we have, how much	 * is lowmem, and how much is highmem.  If we were	 * passed the total memory size from the bootloader,	 * just use it.	 */	if (boot_mem_size)		total_memory = boot_mem_size;	else		total_memory = ppc_md.find_end_of_memory();	if (__max_memory && total_memory > __max_memory)		total_memory = __max_memory;	total_lowmem = total_memory;#ifdef CONFIG_FSL_BOOKE	/* Freescale Book-E parts expect lowmem to be mapped by fixed TLB	 * entries, so we need to adjust lowmem to match the amount we can map	 * in the fixed entries */	adjust_total_lowmem();#endif /* CONFIG_FSL_BOOKE */	if (total_lowmem > __max_low_memory) {		total_lowmem = __max_low_memory;#ifndef CONFIG_HIGHMEM		total_memory = total_lowmem;#endif /* CONFIG_HIGHMEM */	}	set_phys_avail(total_lowmem);	/* Initialize the MMU hardware */	if (ppc_md.progress)		ppc_md.progress("MMU:hw init", 0x300);	MMU_init_hw();	/* Map in all of RAM starting at KERNELBASE */	if (ppc_md.progress)		ppc_md.progress("MMU:mapin", 0x301);	mapin_ram();#ifdef CONFIG_HIGHMEM	ioremap_base = PKMAP_BASE;#else	ioremap_base = 0xfe000000UL;	/* for now, could be 0xfffff000 */#endif /* CONFIG_HIGHMEM */	ioremap_bot = ioremap_base;	/* Map in I/O resources */	if (ppc_md.progress)		ppc_md.progress("MMU:setio", 0x302);	if (ppc_md.setup_io_mappings)		ppc_md.setup_io_mappings();	/* Initialize the context management stuff */	mmu_context_init();	if (ppc_md.progress)		ppc_md.progress("MMU:exit", 0x211);#ifdef CONFIG_BOOTX_TEXT	/* By default, we are no longer mapped */       	boot_text_mapped = 0;	/* Must be done last, or ppc_md.progress will die. */	map_boot_text();#endif}/* This is only called until mem_init is done. */void __init *early_get_page(void){	void *p;	if (init_bootmem_done) {		p = alloc_bootmem_pages(PAGE_SIZE);	} else {		p = mem_pieces_find(PAGE_SIZE, PAGE_SIZE);	}	return p;}/* * Initialize the bootmem system and give it all the memory we * have available. */void __init do_init_bootmem(void){	unsigned long start, size;	int i;	/*	 * Find an area to use for the bootmem bitmap.	 * We look for the first area which is at least	 * 128kB in length (128kB is enough for a bitmap	 * for 4GB of memory, using 4kB pages), plus 1 page	 * (in case the address isn't page-aligned).

⌨️ 快捷键说明

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