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

📄 init.c

📁 内核linux2.4.20,可跟rtlinux3.2打补丁 组成实时linux系统,编译内核
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * BK Id: SCCS/s.init.c 1.40 01/25/02 15:15:24 benh *//* *  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). * *  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/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>#ifdef CONFIG_BLK_DEV_INITRD#include <linux/blk.h>		/* for initrd_* */#endif#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 "mem_pieces.h"#include "mmu_decl.h"mmu_gather_t mmu_gathers[NR_CPUS];void *end_of_DRAM;unsigned long total_memory;unsigned long total_lowmem;int mem_init_done;int init_bootmem_done;int boot_mapsize;unsigned long totalram_pages;unsigned long totalhigh_pages;#ifdef CONFIG_ALL_PPCunsigned long agp_special_page;#endifextern char _end[];extern char etext[], _stext[];extern char __init_begin, __init_end;extern char __prep_begin, __prep_end;extern char __chrp_begin, __chrp_end;extern char __pmac_begin, __pmac_end;extern char __openfirmware_begin, __openfirmware_end;#ifdef CONFIG_HIGHMEMpte_t *kmap_pte;pgprot_t kmap_prot;#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;extern char *sysmap;extern unsigned long sysmap_size;/* * 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;/* max amount of RAM to use */unsigned long __max_memory;int do_check_pgt_cache(int low, int high){	int freed = 0;	if (pgtable_cache_size > high) {		do {                        if (pgd_quicklist) {				free_pgd_slow(get_pgd_fast());				freed++;			}			if (pte_quicklist) {				pte_free_slow(pte_alloc_one_fast(NULL, 0));				freed++;			}		} while (pgtable_cache_size > low);	}	return freed;}void show_mem(void){	int i,free = 0,total = 0,reserved = 0;	int shared = 0, cached = 0;	struct task_struct *p;	int highmem = 0;	printk("Mem-info:\n");	show_free_areas();	printk("Free swap:       %6dkB\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 += atomic_read(&mem_map[i].count) - 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);	printk("%d pages in page table cache\n",(int)pgtable_cache_size);	show_buffers();	printk("%-8s %3s %8s %8s %8s %9s %8s", "Process", "Pid",	       "Ctx", "Ctx<<4", "Last Sys", "pc", "task");#ifdef CONFIG_SMP	printk(" %3s", "CPU");#endif /* CONFIG_SMP */	printk("\n");	for_each_task(p)	{		printk("%-8.8s %3d %8ld %8ld %8ld %c%08lx %08lx ",		       p->comm,p->pid,		       (p->mm)?p->mm->context:0,		       (p->mm)?(p->mm->context<<4):0,		       p->thread.last_syscall,		       (p->thread.regs)?user_mode(p->thread.regs) ? 'u' : 'k' : '?',		       (p->thread.regs)?p->thread.regs->nip:0,		       (ulong)p);		{			int iscur = 0;#ifdef CONFIG_SMP			printk("%3d ", p->processor);			if ( (p->processor != NO_PROC_ID) &&			     (p == current_set[p->processor]) )			{				iscur = 1;				printk("current");			}#else			if ( p == current )			{				iscur = 1;				printk("current");			}						if ( p == last_task_used_math )			{				if ( iscur )					printk(",");				printk("last math");			}			#endif /* CONFIG_SMP */			printk("\n");		}	}}void si_meminfo(struct sysinfo *val){	val->totalram = totalram_pages;	val->sharedram = 0;	val->freeram = nr_free_pages();	val->bufferram = atomic_read(&buffermem_pages);	val->totalhigh = totalhigh_pages;	val->freehigh = nr_free_highpages();	val->mem_unit = PAGE_SIZE;}/* 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);	if (_machine != _MACH_Pmac)		FREESEC(pmac);	if (_machine != _MACH_chrp)		FREESEC(chrp);	if (_machine != _MACH_prep)		FREESEC(prep);	if (!have_of)		FREESEC(openfirmware); 	printk("\n");#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;	}	/* 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.	 */	total_memory = ppc_md.find_end_of_memory();

⌨️ 快捷键说明

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