亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? vmalloc.c

?? LINUX1.0源代碼,代碼條理清晰
?? C
字號:
/*
 *  linux/mm/vmalloc.c
 *
 *  Copyright (C) 1993  Linus Torvalds
 */

#include <asm/system.h>
#include <linux/config.h>

#include <linux/signal.h>
#include <linux/sched.h>
#include <linux/head.h>
#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/types.h>
#include <linux/malloc.h>
#include <asm/segment.h>

struct vm_struct {
	unsigned long flags;
	void * addr;
	unsigned long size;
	struct vm_struct * next;
};

static struct vm_struct * vmlist = NULL;

/* Just any arbitrary offset to the start of the vmalloc VM area: the
 * current 8MB value just means that there will be a 8MB "hole" after the
 * physical memory until the kernel virtual memory starts.  That means that
 * any out-of-bounds memory accesses will hopefully be caught.
 * The vmalloc() routines leaves a hole of 4kB between each vmalloced
 * area for the same reason. ;)
 */
#define VMALLOC_OFFSET	(8*1024*1024)

static inline void set_pgdir(unsigned long dindex, unsigned long value)
{
	struct task_struct * p;

	p = &init_task;
	do {
		((unsigned long *) p->tss.cr3)[dindex] = value;
		p = p->next_task;
	} while (p != &init_task);
}

static int free_area_pages(unsigned long dindex, unsigned long index, unsigned long nr)
{
	unsigned long page, *pte;

	if (!(PAGE_PRESENT & (page = swapper_pg_dir[dindex])))
		return 0;
	page &= PAGE_MASK;
	pte = index + (unsigned long *) page;
	do {
		unsigned long pg = *pte;
		*pte = 0;
		if (pg & PAGE_PRESENT)
			free_page(pg);
		pte++;
	} while (--nr);
	pte = (unsigned long *) page;
	for (nr = 0 ; nr < 1024 ; nr++, pte++)
		if (*pte)
			return 0;
	set_pgdir(dindex,0);
	mem_map[MAP_NR(page)] = 1;
	free_page(page);
	invalidate();
	return 0;
}

static int alloc_area_pages(unsigned long dindex, unsigned long index, unsigned long nr)
{
	unsigned long page, *pte;

	page = swapper_pg_dir[dindex];
	if (!page) {
		page = get_free_page(GFP_KERNEL);
		if (!page)
			return -ENOMEM;
		if (swapper_pg_dir[dindex]) {
			free_page(page);
			page = swapper_pg_dir[dindex];
		} else {
			mem_map[MAP_NR(page)] = MAP_PAGE_RESERVED;
			set_pgdir(dindex, page | PAGE_SHARED);
		}
	}
	page &= PAGE_MASK;
	pte = index + (unsigned long *) page;
	*pte = PAGE_SHARED;		/* remove a race with vfree() */
	do {
		unsigned long pg = get_free_page(GFP_KERNEL);

		if (!pg)
			return -ENOMEM;
		*pte = pg | PAGE_SHARED;
		pte++;
	} while (--nr);
	invalidate();
	return 0;
}

static int do_area(void * addr, unsigned long size,
	int (*area_fn)(unsigned long,unsigned long,unsigned long))
{
	unsigned long nr, dindex, index;

	nr = size >> PAGE_SHIFT;
	dindex = (TASK_SIZE + (unsigned long) addr) >> 22;
	index = (((unsigned long) addr) >> PAGE_SHIFT) & (PTRS_PER_PAGE-1);
	while (nr > 0) {
		unsigned long i = PTRS_PER_PAGE - index;

		if (i > nr)
			i = nr;
		nr -= i;
		if (area_fn(dindex, index, i))
			return -1;
		index = 0;
		dindex++;
	}
	return 0;
}

void vfree(void * addr)
{
	struct vm_struct **p, *tmp;

	if (!addr)
		return;
	if ((PAGE_SIZE-1) & (unsigned long) addr) {
		printk("Trying to vfree() bad address (%p)\n", addr);
		return;
	}
	for (p = &vmlist ; (tmp = *p) ; p = &tmp->next) {
		if (tmp->addr == addr) {
			*p = tmp->next;
			do_area(tmp->addr, tmp->size, free_area_pages);
			kfree(tmp);
			return;
		}
	}
	printk("Trying to vfree() nonexistent vm area (%p)\n", addr);
}

void * vmalloc(unsigned long size)
{
	void * addr;
	struct vm_struct **p, *tmp, *area;

	size = PAGE_ALIGN(size);
	if (!size || size > high_memory)
		return NULL;
	area = (struct vm_struct *) kmalloc(sizeof(*area), GFP_KERNEL);
	if (!area)
		return NULL;
	addr = (void *) ((high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1));
	area->size = size + PAGE_SIZE;
	area->next = NULL;
	for (p = &vmlist; (tmp = *p) ; p = &tmp->next) {
		if (size + (unsigned long) addr < (unsigned long) tmp->addr)
			break;
		addr = (void *) (tmp->size + (unsigned long) tmp->addr);
	}
	area->addr = addr;
	area->next = *p;
	*p = area;
	if (do_area(addr, size, alloc_area_pages)) {
		vfree(addr);
		return NULL;
	}
	return addr;
}

int vread(char *buf, char *addr, int count)
{
	struct vm_struct **p, *tmp;
	char *vaddr, *buf_start = buf;
	int n;

	for (p = &vmlist; (tmp = *p) ; p = &tmp->next) {
		vaddr = (char *) tmp->addr;
		while (addr < vaddr) {
			if (count == 0)
				goto finished;
			put_fs_byte('\0', buf++), addr++, count--;
		}
		n = tmp->size - PAGE_SIZE;
		if (addr > vaddr)
			n -= addr - vaddr;
		while (--n >= 0) {
			if (count == 0)
				goto finished;
			put_fs_byte(*addr++, buf++), count--;
		}
	}
finished:
	return buf - buf_start;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91麻豆精品久久久久蜜臀| 91超碰这里只有精品国产| 欧美中文字幕一区二区三区 | 日韩一区二区在线播放| 欧美精品丝袜久久久中文字幕| 欧美一区二区三区色| 国产网站一区二区| 午夜久久久久久| 国产精品一品二品| 欧美系列一区二区| 国产精品美女久久福利网站| 日韩不卡一区二区| 国产高清精品网站| 日本电影欧美片| 欧美色精品在线视频| 国产亚洲欧洲一区高清在线观看| 亚洲黄色性网站| 国产高清久久久久| 在线视频国产一区| 中文字幕 久热精品 视频在线| 亚洲一区二区在线免费看| 大胆亚洲人体视频| 欧美网站一区二区| 欧美sm美女调教| 亚洲国产精品久久一线不卡| 成人综合在线观看| 日韩你懂的在线观看| 亚洲电影在线免费观看| 国产美女视频一区| 制服.丝袜.亚洲.中文.综合 | 日韩精品中文字幕在线一区| 亚洲一线二线三线久久久| 国产不卡在线视频| 精品1区2区在线观看| 亚洲成人一区二区| 欧美性大战久久久久久久蜜臀| 国产婷婷色一区二区三区四区| 洋洋av久久久久久久一区| www.成人在线| 国产精品久久久久影视| 国产精品白丝jk黑袜喷水| 欧美电影免费观看高清完整版在 | 91激情五月电影| 久久久久久久久99精品| 久久99日本精品| 欧美一区永久视频免费观看| 亚洲电影视频在线| 欧美日韩精品一区二区三区| 一区二区三区在线视频观看| 色婷婷亚洲一区二区三区| 中文字幕视频一区| 国产精品亚洲视频| 欧美一区二区成人| 老汉av免费一区二区三区| 日韩一区二区免费电影| 麻豆成人综合网| 精品国产乱子伦一区| 国内欧美视频一区二区| 久久精品男人天堂av| 国产91在线看| 中文字幕亚洲区| 欧美在线观看一二区| 日韩精品亚洲一区二区三区免费| 欧美一级理论性理论a| 美国毛片一区二区三区| 国产亚洲精品7777| 91丨porny丨中文| 亚洲精品国产视频| 99精品国产91久久久久久| 国产精品黄色在线观看| 91麻豆免费观看| 日韩电影一区二区三区四区| 26uuu亚洲综合色欧美| 国产剧情一区二区三区| ...xxx性欧美| 91精品国产色综合久久ai换脸| 美国三级日本三级久久99| 久久久www成人免费无遮挡大片| fc2成人免费人成在线观看播放 | 亚洲成av人影院| 日韩一区二区三区免费看| 国产高清不卡二三区| 成人免费一区二区三区在线观看| 99久久99久久免费精品蜜臀| 一二三四社区欧美黄| 日韩精品一区二区三区四区视频| 东方欧美亚洲色图在线| 亚洲国产精品视频| 久久久久久久久一| 在线中文字幕一区二区| 久久精品国产亚洲一区二区三区| 欧美成人精品二区三区99精品| 波多野结衣亚洲一区| 午夜天堂影视香蕉久久| 久久久精品中文字幕麻豆发布| 91久久一区二区| 激情六月婷婷综合| 亚洲午夜三级在线| 精品国产电影一区二区| 欧美在线高清视频| 国产 欧美在线| 免费观看30秒视频久久| ●精品国产综合乱码久久久久| 日韩视频中午一区| 欧美三级电影在线观看| 丁香婷婷综合网| 亚洲va在线va天堂| 亚洲欧美电影一区二区| 久久亚洲一区二区三区四区| 欧美日韩三级在线| 一本大道av伊人久久综合| 国产一区在线不卡| 亚洲日本在线视频观看| 久久久久久综合| 91精品国产91热久久久做人人| 91福利国产成人精品照片| 成人午夜视频网站| 午夜精品福利视频网站| 一区二区三区精品久久久| 国产精品电影一区二区| 国产无遮挡一区二区三区毛片日本| 日韩西西人体444www| 欧美人牲a欧美精品| 色菇凉天天综合网| 91丨九色丨黑人外教| 福利电影一区二区三区| 日本v片在线高清不卡在线观看| 一区二区高清视频在线观看| 中文字幕亚洲综合久久菠萝蜜| 中文无字幕一区二区三区| 精品国产乱码久久久久久1区2区| 一本久久精品一区二区| 99热国产精品| 色偷偷88欧美精品久久久| 99r国产精品| 色婷婷av久久久久久久| 欧美一区二区性放荡片| 国产肉丝袜一区二区| 亚洲女与黑人做爰| 三级在线观看一区二区| 国产老肥熟一区二区三区| 一本到三区不卡视频| 日韩欧美久久一区| 国产精品成人免费精品自在线观看| 亚洲综合另类小说| 九九热在线视频观看这里只有精品| 国产a级毛片一区| 欧美日韩美女一区二区| 久久中文字幕电影| 一区二区三区欧美日韩| 激情丁香综合五月| 99re这里都是精品| 日韩精品专区在线影院重磅| 最新不卡av在线| 精品一区二区三区视频在线观看| 不卡一区中文字幕| 日韩欧美一区中文| 亚洲激情校园春色| 国产麻豆精品95视频| 欧美日韩国产精品自在自线| 国产精品乱人伦| 久久9热精品视频| 在线看国产一区| 国产精品丝袜91| 久久综合综合久久综合| 在线亚洲一区二区| 国产丝袜欧美中文另类| 日韩激情av在线| 在线亚洲一区观看| 国产精品人成在线观看免费| 久久精品国产久精国产| 欧美日韩精品三区| 一区二区三区在线高清| 成人综合在线观看| 26uuu久久综合| 美女在线视频一区| 欧美另类变人与禽xxxxx| 综合在线观看色| 成人高清在线视频| 久久精品欧美一区二区三区不卡 | 亚洲精品一二三区| 国v精品久久久网| 久久先锋资源网| 蜜桃av一区二区三区电影| 69精品人人人人| 亚洲中国最大av网站| 91视频观看视频| 综合激情网...| 9色porny自拍视频一区二区| 久久久久久久性| 国产成人午夜高潮毛片| 久久久久免费观看| 国产成人在线观看免费网站| 久久网站热最新地址| 国产精品亚洲一区二区三区在线 | 欧美精品乱码久久久久久| 亚洲综合久久久| 欧美日韩aaa| 日韩精品成人一区二区在线| 制服.丝袜.亚洲.另类.中文|