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

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

?? malloc.c

?? LINUX1.0源代碼,代碼條理清晰
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*
 * malloc.c --- a general purpose kernel memory allocator for Linux.
 *
 * Written by Theodore Ts'o (tytso@mit.edu), 11/29/91
 *
 * This routine is written to be as fast as possible, so that it
 * can be called from the interrupt level.
 *
 * Limitations: maximum size of memory we can allocate using this routine
 *	is 4k, the size of a page in Linux.
 *
 * The general game plan is that each page (called a bucket) will only hold
 * objects of a given size.  When all of the object on a page are released,
 * the page can be returned to the general free pool.  When kmalloc() is
 * called, it looks for the smallest bucket size which will fulfill its
 * request, and allocate a piece of memory from that bucket pool.
 *
 * Each bucket has as its control block a bucket descriptor which keeps
 * track of how many objects are in use on that page, and the free list
 * for that page.  Like the buckets themselves, bucket descriptors are
 * stored on pages requested from get_free_page().  However, unlike buckets,
 * pages devoted to bucket descriptor pages are never released back to the
 * system.  Fortunately, a system should probably only need 1 or 2 bucket
 * descriptor pages, since a page can hold 256 bucket descriptors (which
 * corresponds to 1 megabyte worth of bucket pages.)  If the kernel is using
 * that much allocated memory, it's probably doing something wrong.  :-)
 *
 * Note: kmalloc() and kfree() both call get_free_page() and free_page()
 *	in sections of code where interrupts are turned off, to allow
 *	kmalloc() and kfree() to be safely called from an interrupt routine.
 *	(We will probably need this functionality when networking code,
 *	particularily things like NFS, is added to Linux.)  However, this
 *	presumes that get_free_page() and free_page() are interrupt-level
 *	safe, which they may not be once paging is added.  If this is the
 *	case, we will need to modify kmalloc() to keep a few unused pages
 *	"pre-allocated" so that it can safely draw upon those pages if
 * 	it is called from an interrupt routine.
 *
 * 	Another concern is that get_free_page() should not sleep; if it
 *	does, the code is carefully ordered so as to avoid any race
 *	conditions.  The catch is that if kmalloc() is called re-entrantly,
 *	there is a chance that unecessary pages will be grabbed from the
 *	system.  Except for the pages for the bucket descriptor page, the
 *	extra pages will eventually get released back to the system, though,
 *	so it isn't all that bad.
 */

/* I'm going to modify it to keep some free pages around.  Get free page
   can sleep, and tcp/ip needs to call kmalloc at interrupt time  (Or keep
   big buffers around for itself.)  I guess I'll have return from
   syscall fill up the free page descriptors. -RAB */

/* since the advent of GFP_ATOMIC, I've changed the kmalloc code to
   use it and return NULL if it can't get a page. -RAB  */
/* (mostly just undid the previous changes -RAB) */

/* I've added the priority argument to kmalloc so routines can
   sleep on memory if they want. - RAB */

/* I've also got to make sure that kmalloc is reentrant now. */

/* Debugging support: add file/line info, add beginning+end markers. -M.U- */

#include <linux/kernel.h>
#include <linux/mm.h>
#include <linux/string.h>
#include <linux/malloc.h>

#include <asm/system.h>

struct bucket_desc {	/* 16 bytes */
	void			*page;
	struct bucket_desc	*next;
	void			*freeptr;
	unsigned short		refcnt;
	unsigned short		bucket_size;
};

struct _bucket_dir {	/* 8 bytes */
	unsigned int		size;
	struct bucket_desc	*chain;
};

#ifdef CONFIG_DEBUG_MALLOC

struct hdr_start {
	const char *file;
	const char *ok_file;
	unsigned short line;
	unsigned short ok_line;
	unsigned short size;
	int magic;
};
struct hdr_end {
	int magic;
};

#define DEB_MAGIC_FREE  0x13579BDF /* free block */
#define DEB_MAGIC_ALLOC 0x2468ACE0 /* allocated block */
#define DEB_MAGIC_USED  0x147AD036 /* allocated but bad */
#define DEB_MAGIC_FREED 0x258BE169 /* free but abused */

#define DEB_MAGIC_END   0x369CF258 /* end marker */

#endif
/*
 * The following is the where we store a pointer to the first bucket
 * descriptor for a given size.
 *
 * If it turns out that the Linux kernel allocates a lot of objects of a
 * specific size, then we may want to add that specific size to this list,
 * since that will allow the memory to be allocated more efficiently.
 * However, since an entire page must be dedicated to each specific size
 * on this list, some amount of temperance must be exercised here.
 *
 * Note that this list *must* be kept in order.
 */
struct _bucket_dir bucket_dir[] = {
#ifndef CONFIG_DEBUG_MALLOC /* Debug headers have too much overhead */
	{ 16,	(struct bucket_desc *) 0},
#endif
	{ 32,	(struct bucket_desc *) 0},
	{ 64,	(struct bucket_desc *) 0},
	{ 128,	(struct bucket_desc *) 0},
	{ 256,	(struct bucket_desc *) 0},
	{ 512,	(struct bucket_desc *) 0},
	{ 1024,	(struct bucket_desc *) 0},
	{ 2048, (struct bucket_desc *) 0},
	{ 4096, (struct bucket_desc *) 0},
	{ 0,    (struct bucket_desc *) 0}};   /* End of list marker */

/*
 * This contains a linked list of free bucket descriptor blocks
 */
static struct bucket_desc *free_bucket_desc = (struct bucket_desc *) 0;

/*
 * This routine initializes a bucket description page.
 */

/* It assumes it is called with interrupts on. and will
   return that way.  It also can sleep if priority != GFP_ATOMIC. */
 
static inline void init_bucket_desc(unsigned long page)
{
	struct bucket_desc *bdesc;
	int i;

	bdesc = (struct bucket_desc *) page;
	for (i = PAGE_SIZE/sizeof(struct bucket_desc); --i > 0; bdesc++ )
		bdesc->next = bdesc+1;
	/*
	 * This is done last, to avoid race conditions in case
	 * get_free_page() sleeps and this routine gets called again....
	 */
	cli();
	bdesc->next = free_bucket_desc;
	free_bucket_desc = (struct bucket_desc *) page;
}

/*
 * Re-organized some code to give cleaner assembly output for easier
 * verification.. LBT
 */
#ifdef CONFIG_DEBUG_MALLOC
void *
deb_kmalloc(const char *deb_file, unsigned short deb_line,
	unsigned int len, int priority)
#else
void *
kmalloc(unsigned int len, int priority)
#endif
{
	int i;
	unsigned long		flags;
	unsigned long		page;
	struct _bucket_dir	*bdir;
	struct bucket_desc	*bdesc;
	void			*retval;

#ifdef CONFIG_DEBUG_MALLOC
	len += sizeof(struct hdr_start)+sizeof(struct hdr_end);
#endif
	/*
	 * First we search the bucket_dir to find the right bucket change
	 * for this request.
	 */

	/* The sizes are static so there is no reentry problem here. */
	bdir = bucket_dir;
	for (bdir = bucket_dir ; bdir->size < len ; bdir++) {
		if (!bdir->size)
			goto too_large;
	}

	/*
	 * Now we search for a bucket descriptor which has free space
	 */
	save_flags(flags);
	cli();			/* Avoid race conditions */
	for (bdesc = bdir->chain; bdesc != NULL; bdesc = bdesc->next)
		if (bdesc->freeptr)
			goto found_bdesc;
	/*
	 * If we didn't find a bucket with free space, then we'll
	 * allocate a new one.
	 */
	
	/*
	 * Note that init_bucket_descriptor() does its
	 * own cli() before returning, and guarantees that
	 * there is a bucket desc in the page.
	 */
	if (!free_bucket_desc) {
		restore_flags(flags);
		if(!(page=__get_free_page(priority)))
			return NULL;
		init_bucket_desc(page);
	}
	
	bdesc = free_bucket_desc;
	free_bucket_desc = bdesc->next;
	restore_flags(flags);

	if(!(page=__get_free_page(priority))) {
	/*
	 * Out of memory? Put the bucket descriptor back on the free list
	 */
		cli();
		bdesc->next = free_bucket_desc;
		free_bucket_desc = bdesc;
		restore_flags(flags);
		return NULL;
	}
		
	bdesc->refcnt = 0;
	bdesc->bucket_size = bdir->size;
	bdesc->page = bdesc->freeptr = (void *) page;
	
	/* Set up the chain of free objects */
	for (i=PAGE_SIZE/bdir->size; i > 0 ; i--) {
#ifdef CONFIG_DEBUG_MALLOC
		struct hdr_start *hd;
		struct hdr_end *he;
		hd = (struct hdr_start *) page;
		he = (struct hdr_end *)(page+(bdir->size-sizeof(struct hdr_end)));
		hd->magic = DEB_MAGIC_FREE;
		hd->file = hd->ok_file = "(expand)"; 
		hd->line = hd->ok_line = 0;
		hd->size = bdir->size-sizeof(struct hdr_start)-sizeof(struct hdr_end);
		he->magic = DEB_MAGIC_END;

		memset(hd+1,0xF8,hd->size);

		*((void **) (hd+1)) = (i==1) ? NULL : (void *)(page + bdir->size);
#else
		*((void **) page) = (i==1) ? NULL : (void *)(page + bdir->size);
#endif
		page += bdir->size;
	}
	
	/* turn interrupts back off for putting the
	   thing onto the chain. */
	cli();
	/* remember bdir is not changed. */
	bdesc->next = bdir->chain; /* OK, link it in! */
	bdir->chain = bdesc;

found_bdesc:
	retval = (void *) bdesc->freeptr;
#ifdef CONFIG_DEBUG_MALLOC

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91丨porny丨国产入口| 欧美久久免费观看| 欧美日韩精品系列| 久久尤物电影视频在线观看| 亚洲综合色婷婷| 成人中文字幕合集| 91精品国产免费| 亚洲欧美激情视频在线观看一区二区三区| 日韩精品一二区| 色就色 综合激情| 国产精品美女久久久久aⅴ| 蜜桃视频一区二区| 欧美丝袜自拍制服另类| 国产精品第五页| 国产精品一区二区在线播放| 56国语精品自产拍在线观看| 一区二区三区在线免费| 成人在线视频一区二区| 久久综合久久鬼色中文字| 婷婷一区二区三区| 欧美日韩的一区二区| 亚洲精品欧美激情| 色爱区综合激月婷婷| 亚洲欧美另类小说| 91麻豆蜜桃一区二区三区| 国产精品情趣视频| 成人免费视频视频| 中文字幕一区二区三区视频| 成人一区在线看| 国产精品网曝门| av不卡免费电影| 亚洲色图一区二区| 色屁屁一区二区| 亚洲一二三四久久| 欧美丝袜丝nylons| 日韩精品亚洲一区二区三区免费| 777xxx欧美| 精品一区中文字幕| 久久久亚洲精华液精华液精华液| 国产精品一卡二| 国产精品传媒入口麻豆| 色拍拍在线精品视频8848| 一区二区免费在线播放| 精品视频在线免费看| 日日骚欧美日韩| 精品三级在线看| 国产麻豆成人精品| 自拍偷拍欧美精品| 欧美在线免费视屏| 日韩精品乱码免费| 久久众筹精品私拍模特| 成人激情动漫在线观看| 亚洲精品视频在线观看免费| 69堂精品视频| 国产一区二区三区久久悠悠色av| 久久精品人人做人人综合| 97国产一区二区| 首页综合国产亚洲丝袜| 久久久99免费| 色香蕉成人二区免费| 蜜臀av性久久久久蜜臀aⅴ四虎| 久久免费视频一区| 欧美亚洲动漫精品| 国产老女人精品毛片久久| 亚洲日穴在线视频| 91麻豆精品国产91久久久资源速度| 久久99国产精品麻豆| 亚洲欧美日韩一区| 日韩欧美成人一区| 91在线视频免费观看| 欧美aaaaaa午夜精品| 国产精品成人免费| 日韩欧美一级精品久久| 91老师片黄在线观看| 日本视频中文字幕一区二区三区| 久久久三级国产网站| 欧美日韩精品免费观看视频| 成人精品鲁一区一区二区| 日韩精品一区第一页| 亚洲欧美日韩在线| 国产午夜精品一区二区三区视频| 精品视频在线免费观看| 99久久国产综合精品女不卡| 免费高清在线一区| 亚洲一区二区三区四区在线免费观看| 2021国产精品久久精品| 91精品国产综合久久福利| 91亚洲大成网污www| 国产精品1024| 美女视频一区二区| 五月婷婷欧美视频| 亚洲欧美另类图片小说| 欧美国产欧美综合| 精品成人佐山爱一区二区| 欧美日本国产视频| 在线观看亚洲精品视频| 99久久国产综合精品色伊| 大白屁股一区二区视频| 国产精品一区二区三区四区| 捆绑调教美女网站视频一区| 五月天一区二区| 亚洲午夜私人影院| 亚洲国产精品一区二区久久恐怖片 | 久久久久一区二区三区四区| 欧美精品v国产精品v日韩精品| 在线观看日韩电影| 日本国产一区二区| 色婷婷激情一区二区三区| 91欧美一区二区| 91在线视频观看| 91久久精品国产91性色tv| 91欧美一区二区| 欧美在线免费观看视频| 欧美在线观看你懂的| 欧美亚洲动漫精品| 欧美一区二区女人| 欧美一区二区在线免费播放| 欧美精品电影在线播放| 日韩欧美一级二级三级| 精品捆绑美女sm三区| 精品国内片67194| 国产亚洲欧美中文| 国产精品日韩成人| 亚洲欧洲综合另类在线| 亚洲第一主播视频| 五月天精品一区二区三区| 麻豆一区二区99久久久久| 麻豆免费看一区二区三区| 国产麻豆日韩欧美久久| 99视频国产精品| 精品视频在线看| 日韩欧美的一区| 中文子幕无线码一区tr | 久久综合视频网| 中文字幕国产一区二区| 亚洲精品国产一区二区精华液| 亚洲一区二区三区小说| 激情亚洲综合在线| av不卡免费电影| 欧美一区在线视频| 亚洲国产精品激情在线观看| 亚洲永久精品国产| 精品综合免费视频观看| 99久精品国产| 欧美一区二区二区| 国产精品水嫩水嫩| 视频一区在线播放| 国产成人亚洲综合a∨猫咪| 91丨porny丨国产入口| 555夜色666亚洲国产免| 国产婷婷精品av在线| 亚洲第一狼人社区| 成人免费观看视频| 欧美一区二区国产| 一区二区在线观看免费 | 免费高清视频精品| av中文字幕一区| 日韩一级大片在线| 最新日韩在线视频| 久久福利视频一区二区| 欧美伊人久久久久久久久影院 | 最新热久久免费视频| 视频一区二区欧美| gogo大胆日本视频一区| 日韩一级成人av| 亚洲一区二区三区中文字幕| 国产69精品一区二区亚洲孕妇| 欧美日本在线播放| 亚洲精品视频观看| 福利视频网站一区二区三区| 制服丝袜中文字幕一区| 亚洲精品大片www| 国产成人免费视频网站| 欧美一区二区网站| 亚洲国产精品一区二区久久恐怖片| 国产成人精品一区二| 日韩午夜电影av| 天天综合天天做天天综合| 99riav一区二区三区| 久久精品男人天堂av| 免费xxxx性欧美18vr| 欧美精品在线一区二区| 亚洲精品乱码久久久久久黑人| 成人深夜视频在线观看| 久久久精品日韩欧美| 久久精品久久精品| 日韩免费成人网| 免费在线观看精品| 91精品国产综合久久精品app| 一区二区三区在线观看国产| 99re亚洲国产精品| 亚洲欧洲精品一区二区三区不卡| 国产精品18久久久久久久久| 久久免费午夜影院| 国产激情91久久精品导航| 久久久www成人免费无遮挡大片| 精品中文字幕一区二区小辣椒 | 免费欧美在线视频| 91精品国产色综合久久ai换脸| 午夜精品在线看|