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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? kmalloc.c

?? LINUX1.0源代碼,代碼條理清晰
?? C
字號(hào):
/*
 *  linux/mm/kmalloc.c
 *
 *  Copyright (C) 1991, 1992  Linus Torvalds & Roger Wolff.
 *
 *  Written by R.E. Wolff Sept/Oct '93.
 *
 */

#include <linux/mm.h>
#include <asm/system.h>
#include <linux/delay.h>

#define GFP_LEVEL_MASK 0xf

/* I want this low enough for a while to catch errors.
   I want this number to be increased in the near future:
        loadable device drivers should use this function to get memory */

#define MAX_KMALLOC_K 4


/* This defines how many times we should try to allocate a free page before
   giving up. Normally this shouldn't happen at all. */
#define MAX_GET_FREE_PAGE_TRIES 4


/* Private flags. */

#define MF_USED 0xffaa0055
#define MF_FREE 0x0055ffaa


/* 
 * Much care has gone into making these routines in this file reentrant.
 *
 * The fancy bookkeeping of nbytesmalloced and the like are only used to
 * report them to the user (oooohhhhh, aaaaahhhhh....) are not 
 * protected by cli(). (If that goes wrong. So what?)
 *
 * These routines restore the interrupt status to allow calling with ints
 * off. 
 */

/* 
 * A block header. This is in front of every malloc-block, whether free or not.
 */
struct block_header {
	unsigned long bh_flags;
	union {
		unsigned long ubh_length;
		struct block_header *fbh_next;
	} vp;
};


#define bh_length vp.ubh_length
#define bh_next   vp.fbh_next
#define BH(p) ((struct block_header *)(p))


/* 
 * The page descriptor is at the front of every page that malloc has in use. 
 */
struct page_descriptor {
	struct page_descriptor *next;
	struct block_header *firstfree;
	int order;
	int nfree;
};


#define PAGE_DESC(p) ((struct page_descriptor *)(((unsigned long)(p)) & PAGE_MASK))


/*
 * A size descriptor describes a specific class of malloc sizes.
 * Each class of sizes has its own freelist.
 */
struct size_descriptor {
	struct page_descriptor *firstfree;
	int size;
	int nblocks;

	int nmallocs;
	int nfrees;
	int nbytesmalloced;
	int npages;
};


struct size_descriptor sizes[] = { 
	{ NULL,  32,127, 0,0,0,0 },
	{ NULL,  64, 63, 0,0,0,0 },
	{ NULL, 128, 31, 0,0,0,0 },
	{ NULL, 252, 16, 0,0,0,0 },
	{ NULL, 508,  8, 0,0,0,0 },
	{ NULL,1020,  4, 0,0,0,0 },
	{ NULL,2040,  2, 0,0,0,0 },
	{ NULL,4080,  1, 0,0,0,0 },
	{ NULL,   0,  0, 0,0,0,0 }
};


#define NBLOCKS(order)          (sizes[order].nblocks)
#define BLOCKSIZE(order)        (sizes[order].size)



long kmalloc_init (long start_mem,long end_mem)
{
	int order;

/* 
 * Check the static info array. Things will blow up terribly if it's
 * incorrect. This is a late "compile time" check.....
 */
for (order = 0;BLOCKSIZE(order);order++)
    {
    if ((NBLOCKS (order)*BLOCKSIZE(order) + sizeof (struct page_descriptor)) >
        PAGE_SIZE) 
        {
        printk ("Cannot use %d bytes out of %d in order = %d block mallocs\n",
                NBLOCKS (order) * BLOCKSIZE(order) + 
                        sizeof (struct page_descriptor),
                (int) PAGE_SIZE,
                BLOCKSIZE (order));
        panic ("This only happens if someone messes with kmalloc");
        }
    }
return start_mem;
}



int get_order (int size)
{
	int order;

	/* Add the size of the header */
	size += sizeof (struct block_header); 
	for (order = 0;BLOCKSIZE(order);order++)
		if (size <= BLOCKSIZE (order))
			return order; 
	return -1;
}

void * kmalloc (size_t size, int priority)
{
	unsigned long flags;
	int order,tries,i,sz;
	struct block_header *p;
	struct page_descriptor *page;
	extern unsigned long intr_count;

/* Sanity check... */
	if (intr_count && priority != GFP_ATOMIC) {
		printk("kmalloc called nonatomically from interrupt %08lx\n",
			((unsigned long *)&size)[-1]);
		priority = GFP_ATOMIC;
	}
if (size > MAX_KMALLOC_K * 1024) 
     {
     printk ("kmalloc: I refuse to allocate %d bytes (for now max = %d).\n",
                size,MAX_KMALLOC_K*1024);
     return (NULL);
     }

order = get_order (size);
if (order < 0)
    {
    printk ("kmalloc of too large a block (%d bytes).\n",size);
    return (NULL);
    }

save_flags(flags);

/* It seems VERY unlikely to me that it would be possible that this 
   loop will get executed more than once. */
tries = MAX_GET_FREE_PAGE_TRIES; 
while (tries --)
    {
    /* Try to allocate a "recently" freed memory block */
    cli ();
    if ((page = sizes[order].firstfree) &&
        (p    =  page->firstfree))
        {
        if (p->bh_flags == MF_FREE)
            {
            page->firstfree = p->bh_next;
            page->nfree--;
            if (!page->nfree)
                {
                sizes[order].firstfree = page->next;
                page->next = NULL;
                }
            restore_flags(flags);

            sizes [order].nmallocs++;
            sizes [order].nbytesmalloced += size;
            p->bh_flags =  MF_USED; /* As of now this block is officially in use */
            p->bh_length = size;
            return p+1; /* Pointer arithmetic: increments past header */
            }
        printk ("Problem: block on freelist at %08lx isn't free.\n",(long)p);
        return (NULL);
        }
    restore_flags(flags);


    /* Now we're in trouble: We need to get a new free page..... */

    sz = BLOCKSIZE(order); /* sz is the size of the blocks we're dealing with */

    /* This can be done with ints on: This is private to this invocation */
    page = (struct page_descriptor *) __get_free_page (priority & GFP_LEVEL_MASK);
    if (!page) 
        {
        printk ("Couldn't get a free page.....\n");
        return NULL;
        }
#if 0
    printk ("Got page %08x to use for %d byte mallocs....",(long)page,sz);
#endif
    sizes[order].npages++;

    /* Loop for all but last block: */
    for (i=NBLOCKS(order),p=BH (page+1);i > 1;i--,p=p->bh_next) 
        {
        p->bh_flags = MF_FREE;
        p->bh_next = BH ( ((long)p)+sz);
        }
    /* Last block: */
    p->bh_flags = MF_FREE;
    p->bh_next = NULL;

    page->order = order;
    page->nfree = NBLOCKS(order); 
    page->firstfree = BH(page+1);
#if 0
    printk ("%d blocks per page\n",page->nfree);
#endif
    /* Now we're going to muck with the "global" freelist for this size:
       this should be uniterruptible */
    cli ();
    /* 
     * sizes[order].firstfree used to be NULL, otherwise we wouldn't be
     * here, but you never know.... 
     */
    page->next = sizes[order].firstfree;
    sizes[order].firstfree = page;
    restore_flags(flags);
    }

/* Pray that printk won't cause this to happen again :-) */

printk ("Hey. This is very funny. I tried %d times to allocate a whole\n"
        "new page for an object only %d bytes long, but some other process\n"
        "beat me to actually allocating it. Also note that this 'error'\n"
        "message is soooo very long to catch your attention. I'd appreciate\n"
        "it if you'd be so kind as to report what conditions caused this to\n"
        "the author of this kmalloc: wolff@dutecai.et.tudelft.nl.\n"
        "(Executive summary: This can't happen)\n", 
                MAX_GET_FREE_PAGE_TRIES,
                size);
return NULL;
}


void kfree_s (void *ptr,int size)
{
unsigned long flags;
int order;
register struct block_header *p=((struct block_header *)ptr) -1;
struct page_descriptor *page,*pg2;

page = PAGE_DESC (p);
order = page->order;
if ((order < 0) || 
    (order > sizeof (sizes)/sizeof (sizes[0])) ||
    (((long)(page->next)) & ~PAGE_MASK) ||
    (p->bh_flags != MF_USED))
    {
    printk ("kfree of non-kmalloced memory: %p, next= %p, order=%d\n",
                p, page->next, page->order);
    return;
    }
if (size &&
    size != p->bh_length)
    {
    printk ("Trying to free pointer at %p with wrong size: %d instead of %lu.\n",
        p,size,p->bh_length);
    return;
    }
size = p->bh_length;
p->bh_flags = MF_FREE; /* As of now this block is officially free */

save_flags(flags);
cli ();
p->bh_next = page->firstfree;
page->firstfree = p;
page->nfree ++;

if (page->nfree == 1)
   { /* Page went from full to one free block: put it on the freelist */
   if (page->next)
        {
        printk ("Page %p already on freelist dazed and confused....\n", page);
        }
   else
        {
        page->next = sizes[order].firstfree;
        sizes[order].firstfree = page;
        }
   }

/* If page is completely free, free it */
if (page->nfree == NBLOCKS (page->order))
    {
#if 0
    printk ("Freeing page %08x.\n", (long)page);
#endif
    if (sizes[order].firstfree == page)
        {
        sizes[order].firstfree = page->next;
        }
    else
        {
        for (pg2=sizes[order].firstfree;
                (pg2 != NULL) && (pg2->next != page);
                        pg2=pg2->next)
            /* Nothing */;
        if (pg2 != NULL)
            pg2->next = page->next;
        else
            printk ("Ooops. page %p doesn't show on freelist.\n", page);
        }
    free_page ((long)page);
    }
restore_flags(flags);

sizes[order].nfrees++;      /* Noncritical (monitoring) admin stuff */
sizes[order].nbytesmalloced -= size;
}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品黄色在线观看| 一区二区三区精品久久久| 成人av动漫网站| 亚洲成人免费电影| 久久精品日韩一区二区三区| 欧美无乱码久久久免费午夜一区| 国产在线精品一区二区三区不卡 | 欧美日韩国产a| 成+人+亚洲+综合天堂| 美女网站在线免费欧美精品| 亚洲摸摸操操av| 久久影视一区二区| 欧美精品黑人性xxxx| 97精品久久久午夜一区二区三区| 久久激情五月婷婷| 亚洲午夜电影在线观看| 国产精品免费aⅴ片在线观看| 欧美一区二区视频网站| 在线中文字幕不卡| 99视频在线观看一区三区| 国产一区二三区好的| 日本aⅴ免费视频一区二区三区| 亚洲欧洲色图综合| 中文字幕不卡一区| 久久综合久久综合久久| 欧美一级高清大全免费观看| 欧美日韩色一区| 91麻豆文化传媒在线观看| 成人一区二区在线观看| 激情欧美日韩一区二区| 免费成人在线影院| 日本不卡一区二区| 免费精品99久久国产综合精品| 亚洲一卡二卡三卡四卡五卡| 日韩美女视频一区二区| 一区在线中文字幕| 国产精品欧美一区二区三区| 亚洲国产精品成人综合色在线婷婷 | 日产精品久久久久久久性色 | 国产精品一区三区| 国产在线一区二区综合免费视频| 老司机一区二区| 久久成人麻豆午夜电影| 激情都市一区二区| 国产精品羞羞答答xxdd| 成人伦理片在线| 成人久久18免费网站麻豆| 粉嫩av一区二区三区| 粉嫩av亚洲一区二区图片| 成人av免费在线| 91丝袜国产在线播放| 91国在线观看| 欧美丰满一区二区免费视频| 91精品免费在线观看| 欧美一卡在线观看| 久久综合视频网| 欧美激情中文不卡| 亚洲伦理在线精品| 婷婷丁香久久五月婷婷| 麻豆精品在线播放| 色婷婷av一区二区三区软件| 色综合久久中文字幕| 欧美日韩小视频| 日韩免费福利电影在线观看| 欧美精品一区二区久久久| 国产欧美视频在线观看| 亚洲丝袜自拍清纯另类| 图片区小说区区亚洲影院| 免费看欧美女人艹b| 国产99精品国产| 在线视频中文字幕一区二区| 一区二区三区四区乱视频| 视频一区国产视频| 国产麻豆精品久久一二三| av一区二区三区在线| 欧美日韩午夜在线视频| 久久婷婷综合激情| 亚洲精品成人悠悠色影视| 青青草原综合久久大伊人精品优势| 国产一区二区三区在线观看免费 | 久久―日本道色综合久久| 国产精品国模大尺度视频| 亚洲一区在线免费观看| 狠狠狠色丁香婷婷综合激情| 91女厕偷拍女厕偷拍高清| 56国语精品自产拍在线观看| 欧美国产国产综合| 天天亚洲美女在线视频| 岛国精品在线观看| 欧美日本不卡视频| 国产婷婷色一区二区三区四区 | 欧美成人国产一区二区| 日韩理论片一区二区| 久久精品国产成人一区二区三区 | 国产成人精品三级麻豆| 欧美日韩一卡二卡三卡| 国产欧美日韩在线视频| 日韩成人av影视| 99久久精品免费看国产| 日韩精品一区二区三区四区视频 | 久久成人免费电影| 欧美在线免费播放| 亚洲国产精品精华液ab| 免费看日韩精品| 欧洲另类一二三四区| 国产三级久久久| 日韩成人伦理电影在线观看| 96av麻豆蜜桃一区二区| 2024国产精品视频| 日本欧美一区二区在线观看| 91麻豆国产精品久久| 国产欧美一区二区精品忘忧草| 日本亚洲免费观看| 欧美在线一二三| 亚洲欧洲av色图| 国产成人亚洲综合a∨婷婷| 日韩精品在线网站| 日韩成人免费看| 欧美日韩一级片网站| 亚洲欧美韩国综合色| 懂色av中文一区二区三区| 精品国产乱码久久| 男男成人高潮片免费网站| 欧美天堂亚洲电影院在线播放| 国产精品成人网| 成人一区二区视频| 国产欧美精品区一区二区三区| 捆绑调教一区二区三区| 欧美一级欧美一级在线播放| 亚洲国产人成综合网站| 欧美亚州韩日在线看免费版国语版| 亚洲国产精品精华液2区45| 国产风韵犹存在线视精品| 久久亚洲综合av| 国产精品亚洲专一区二区三区| 日韩免费成人网| 久久精工是国产品牌吗| 精品久久久久av影院| 国产综合久久久久影院| 日韩精品一区二区三区在线观看| 蜜桃视频一区二区三区| 欧美一区二区美女| 六月丁香婷婷色狠狠久久| 精品国产乱码久久| 国产盗摄一区二区三区| 欧美国产亚洲另类动漫| 成人激情开心网| 18成人在线观看| 欧美中文字幕不卡| 亚洲成av人片一区二区三区| 欧美精品日韩一本| 久久99精品久久只有精品| 久久免费偷拍视频| 成人亚洲精品久久久久软件| 综合电影一区二区三区| 欧美无砖砖区免费| 日韩精品一级中文字幕精品视频免费观看 | 欧美电影免费观看高清完整版| 日本va欧美va精品发布| 欧美电视剧在线看免费| 国产精品综合一区二区三区| 国产精品伦一区| 色综合天天性综合| 天堂av在线一区| www一区二区| 色综合久久久久网| 日本欧美一区二区在线观看| 久久久久久夜精品精品免费| 成人av集中营| 婷婷六月综合网| 26uuuu精品一区二区| 99精品视频在线播放观看| 亚洲国产精品天堂| 久久奇米777| 在线观看日韩精品| 久久99精品网久久| 亚洲精品欧美激情| 日韩免费一区二区| 91美女福利视频| 麻豆成人91精品二区三区| 国产精品女同互慰在线看| 欧美色综合天天久久综合精品| 蜜臀av一区二区在线观看| 国产精品视频观看| 91精品国产色综合久久ai换脸 | 欧洲人成人精品| 国内成人精品2018免费看| 亚洲欧美视频在线观看| 欧美电影免费观看高清完整版在线 | 日韩美女啊v在线免费观看| 欧美一区二区三区免费在线看 | 欧美在线看片a免费观看| 国内精品自线一区二区三区视频| 亚洲天天做日日做天天谢日日欢 | 尤物在线观看一区| 久久久久久久久久久久久久久99| 在线观看亚洲一区| 成人动漫一区二区三区| 麻豆精品一区二区综合av| 亚洲精品高清视频在线观看|