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

📄 sun3mmu.c

📁 Linux内核源代码 为压缩文件 是<<Linux内核>>一书中的源代码
💻 C
字号:
/*  * linux/arch/m68k/mm/sun3mmu.c * * Implementations of mm routines specific to the sun3 MMU. * * Moved here 8/20/1999 Sam Creasey * */#include <linux/config.h>#include <linux/signal.h>#include <linux/sched.h>#include <linux/mm.h>#include <linux/swap.h>#include <linux/kernel.h>#include <linux/string.h>#include <linux/types.h>#include <linux/init.h>#ifdef CONFIG_BLK_DEV_RAM#include <linux/blk.h>#endif#include <linux/bootmem.h>#include <asm/setup.h>#include <asm/uaccess.h>#include <asm/page.h>#include <asm/pgtable.h>#include <asm/system.h>#include <asm/machdep.h>#include <asm/io.h>extern void mmu_emu_init (unsigned long bootmem_end);const char bad_pmd_string[] = "Bad pmd in pte_alloc: %08lx\n";extern unsigned long empty_bad_page_table;extern unsigned long empty_bad_page;extern unsigned long num_pages;void free_initmem(void){}/* For the sun3 we try to follow the i386 paging_init() more closely *//* start_mem and end_mem have PAGE_OFFSET added already *//* now sets up tables using sun3 PTEs rather than i386 as before. --m */void __init paging_init(void){	pgd_t * pg_dir;	pte_t * pg_table;	int i;	unsigned long address;	unsigned long next_pgtable;	unsigned long bootmem_end;	unsigned long zones_size[3] = {0, 0, 0};	unsigned long size;#ifdef TEST_VERIFY_AREA	wp_works_ok = 0;#endif	empty_bad_page_table = (unsigned long)alloc_bootmem_pages(PAGE_SIZE);	empty_bad_page = (unsigned long)alloc_bootmem_pages(PAGE_SIZE);	empty_zero_page = (unsigned long)alloc_bootmem_pages(PAGE_SIZE);	memset((void *)empty_zero_page, 0, PAGE_SIZE);	address = PAGE_OFFSET;	pg_dir = swapper_pg_dir;	memset (swapper_pg_dir, 0, sizeof (swapper_pg_dir));	memset (kernel_pg_dir,  0, sizeof (kernel_pg_dir));	size = num_pages * sizeof(pte_t);	size = (size + PAGE_SIZE) & ~(PAGE_SIZE-1);		next_pgtable = (unsigned long)alloc_bootmem_pages(size);	bootmem_end = (next_pgtable + size + PAGE_SIZE) & PAGE_MASK;	/* Map whole memory from PAGE_OFFSET (0x0E000000) */	pg_dir += PAGE_OFFSET >> PGDIR_SHIFT; 	while (address < (unsigned long)high_memory) {		pg_table = (pte_t *) __pa (next_pgtable);		next_pgtable += PTRS_PER_PTE * sizeof (pte_t);		pgd_val(*pg_dir) = (unsigned long) pg_table;		pg_dir++;		/* now change pg_table to kernel virtual addresses */		pg_table = (pte_t *) __va ((unsigned long) pg_table);		for (i=0; i<PTRS_PER_PTE; ++i, ++pg_table) {			pte_t pte = __mk_pte(address, PAGE_INIT);			if (address >= (unsigned long)high_memory)				pte_val (pte) = 0;			set_pte (pg_table, pte);			address += PAGE_SIZE;		}	}	mmu_emu_init(bootmem_end);		current->mm = NULL;	/* memory sizing is a hack stolen from motorola.c..  hope it works for us */	zones_size[1] = ((unsigned long)high_memory - PAGE_OFFSET) >> PAGE_SHIFT;	zones_size[0] = zones_size[1]/2;	zones_size[1] -= zones_size[0];		free_area_init(zones_size);}

⌨️ 快捷键说明

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