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

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

?? sched.c

?? LINXS基礎學習代碼 分析是一個很不錯的資料
?? C
字號:
/* *  linux/kernel/sched.c * *  (C) 1991  Linus Torvalds *//* * 'sched.c' is the main kernel file. It contains scheduling primitives * (sleep_on, wakeup, schedule etc) as well as a number of simple system * call functions (type getpid(), which just extracts a field from * current-task */#include <linux/sched.h>#include <linux/kernel.h>#include <linux/sys.h>#include <linux/fdreg.h>#include <asm/system.h>#include <asm/io.h>#include <asm/segment.h>#include <signal.h>#define _S(nr) (1<<((nr)-1))#define _BLOCKABLE (~(_S(SIGKILL) | _S(SIGSTOP)))void show_task(int nr,struct task_struct * p){	int i,j = 4096-sizeof(struct task_struct);	printk("%d: pid=%d, state=%d, ",nr,p->pid,p->state);	i=0;	while (i<j && !((char *)(p+1))[i])		i++;	printk("%d (of %d) chars free in kernel stack\n\r",i,j);}void show_stat(void){	int i;	for (i=0;i<NR_TASKS;i++)		if (task[i])			show_task(i,task[i]);}#define LATCH (1193180/HZ)extern void mem_use(void);extern int timer_interrupt(void);extern int system_call(void);union task_union {	struct task_struct task;	char stack[PAGE_SIZE];};static union task_union init_task = {INIT_TASK,};long volatile jiffies=0;long startup_time=0;struct task_struct *current = &(init_task.task);struct task_struct *last_task_used_math = NULL;struct task_struct * task[NR_TASKS] = {&(init_task.task), };long user_stack [ PAGE_SIZE>>2 ] ;struct {	long * a;	short b;	} stack_start = { & user_stack [PAGE_SIZE>>2] , 0x10 };/* *  'math_state_restore()' saves the current math information in the * old math state array, and gets the new ones from the current task */void math_state_restore(){	if (last_task_used_math == current)		return;	__asm__("fwait");	if (last_task_used_math) {		__asm__("fnsave %0"::"m" (last_task_used_math->tss.i387));	}	last_task_used_math=current;	if (current->used_math) {		__asm__("frstor %0"::"m" (current->tss.i387));	} else {		__asm__("fninit"::);		current->used_math=1;	}}/* *  'schedule()' is the scheduler function. This is GOOD CODE! There * probably won't be any reason to change this, as it should work well * in all circumstances (ie gives IO-bound processes good response etc). * The one thing you might take a look at is the signal-handler code here. * *   NOTE!!  Task 0 is the 'idle' task, which gets called when no other * tasks can run. It can not be killed, and it cannot sleep. The 'state' * information in task[0] is never used. */void schedule(void){	int i,next,c;	struct task_struct ** p;/* check alarm, wake up any interruptible tasks that have got a signal */	for(p = &LAST_TASK ; p > &FIRST_TASK ; --p)		if (*p) {			if ((*p)->alarm && (*p)->alarm < jiffies) {					(*p)->signal |= (1<<(SIGALRM-1));					(*p)->alarm = 0;				}			if (((*p)->signal & ~(_BLOCKABLE & (*p)->blocked)) &&			(*p)->state==TASK_INTERRUPTIBLE)				(*p)->state=TASK_RUNNING;		}/* this is the scheduler proper: */	while (1) {		c = -1;		next = 0;		i = NR_TASKS;		p = &task[NR_TASKS];		while (--i) {			if (!*--p)				continue;			if ((*p)->state == TASK_RUNNING && (*p)->counter > c)				c = (*p)->counter, next = i;		}		if (c) break;		for(p = &LAST_TASK ; p > &FIRST_TASK ; --p)			if (*p)				(*p)->counter = ((*p)->counter >> 1) +						(*p)->priority;	}	switch_to(next);}int sys_pause(void){	current->state = TASK_INTERRUPTIBLE;	schedule();	return 0;}void sleep_on(struct task_struct **p){	struct task_struct *tmp;	if (!p)		return;	if (current == &(init_task.task))		panic("task[0] trying to sleep");	tmp = *p;	*p = current;	current->state = TASK_UNINTERRUPTIBLE;	schedule();	if (tmp)		tmp->state=0;}void interruptible_sleep_on(struct task_struct **p){	struct task_struct *tmp;	if (!p)		return;	if (current == &(init_task.task))		panic("task[0] trying to sleep");	tmp=*p;	*p=current;repeat:	current->state = TASK_INTERRUPTIBLE;	schedule();	if (*p && *p != current) {		(**p).state=0;		goto repeat;	}	*p=NULL;	if (tmp)		tmp->state=0;}void wake_up(struct task_struct **p){	if (p && *p) {		(**p).state=0;		*p=NULL;	}}/* * OK, here are some floppy things that shouldn't be in the kernel * proper. They are here because the floppy needs a timer, and this * was the easiest way of doing it. */static struct task_struct * wait_motor[4] = {NULL,NULL,NULL,NULL};static int  mon_timer[4]={0,0,0,0};static int moff_timer[4]={0,0,0,0};unsigned char current_DOR = 0x0C;int ticks_to_floppy_on(unsigned int nr){	extern unsigned char selected;	unsigned char mask = 0x10 << nr;	if (nr>3)		panic("floppy_on: nr>3");	moff_timer[nr]=10000;		/* 100 s = very big :-) */	cli();				/* use floppy_off to turn it off */	mask |= current_DOR;	if (!selected) {		mask &= 0xFC;		mask |= nr;	}	if (mask != current_DOR) {		outb(mask,FD_DOR);		if ((mask ^ current_DOR) & 0xf0)			mon_timer[nr] = HZ/2;		else if (mon_timer[nr] < 2)			mon_timer[nr] = 2;		current_DOR = mask;	}	sti();	return mon_timer[nr];}void floppy_on(unsigned int nr){	cli();	while (ticks_to_floppy_on(nr))		sleep_on(nr+wait_motor);	sti();}void floppy_off(unsigned int nr){	moff_timer[nr]=3*HZ;}void do_floppy_timer(void){	int i;	unsigned char mask = 0x10;	for (i=0 ; i<4 ; i++,mask <<= 1) {		if (!(mask & current_DOR))			continue;		if (mon_timer[i]) {			if (!--mon_timer[i])				wake_up(i+wait_motor);		} else if (!moff_timer[i]) {			current_DOR &= ~mask;			outb(current_DOR,FD_DOR);		} else			moff_timer[i]--;	}}#define TIME_REQUESTS 64static struct timer_list {	long jiffies;	void (*fn)();	struct timer_list * next;} timer_list[TIME_REQUESTS], * next_timer = NULL;void add_timer(long jiffies, void (*fn)(void)){	struct timer_list * p;	if (!fn)		return;	cli();	if (jiffies <= 0)		(fn)();	else {		for (p = timer_list ; p < timer_list + TIME_REQUESTS ; p++)			if (!p->fn)				break;		if (p >= timer_list + TIME_REQUESTS)			panic("No more time requests free");		p->fn = fn;		p->jiffies = jiffies;		p->next = next_timer;		next_timer = p;		while (p->next && p->next->jiffies < p->jiffies) {			p->jiffies -= p->next->jiffies;			fn = p->fn;			p->fn = p->next->fn;			p->next->fn = fn;			jiffies = p->jiffies;			p->jiffies = p->next->jiffies;			p->next->jiffies = jiffies;			p = p->next;		}	}	sti();}void do_timer(long cpl){	extern int beepcount;	extern void sysbeepstop(void);	if (beepcount)		if (!--beepcount)			sysbeepstop();	if (cpl)		current->utime++;	else		current->stime++;	if (next_timer) {		next_timer->jiffies--;		while (next_timer && next_timer->jiffies <= 0) {			void (*fn)(void);						fn = next_timer->fn;			next_timer->fn = NULL;			next_timer = next_timer->next;			(fn)();		}	}	if (current_DOR & 0xf0)		do_floppy_timer();	if ((--current->counter)>0) return;	current->counter=0;	if (!cpl) return;	schedule();}int sys_alarm(long seconds){	int old = current->alarm;	if (old)		old = (old - jiffies) / HZ;	current->alarm = (seconds>0)?(jiffies+HZ*seconds):0;	return (old);}int sys_getpid(void){	return current->pid;}int sys_getppid(void){	return current->father;}int sys_getuid(void){	return current->uid;}int sys_geteuid(void){	return current->euid;}int sys_getgid(void){	return current->gid;}int sys_getegid(void){	return current->egid;}int sys_nice(long increment){	if (current->priority-increment>0)		current->priority -= increment;	return 0;}void sched_init(void){	int i;	struct desc_struct * p;	if (sizeof(struct sigaction) != 16)		panic("Struct sigaction MUST be 16 bytes");	set_tss_desc(gdt+FIRST_TSS_ENTRY,&(init_task.task.tss));	set_ldt_desc(gdt+FIRST_LDT_ENTRY,&(init_task.task.ldt));	p = gdt+2+FIRST_TSS_ENTRY;	for(i=1;i<NR_TASKS;i++) {		task[i] = NULL;		p->a=p->b=0;		p++;		p->a=p->b=0;		p++;	}/* Clear NT, so that we won't have troubles with that later on */	__asm__("pushfl ; andl $0xffffbfff,(%esp) ; popfl");	ltr(0);	lldt(0);	outb_p(0x36,0x43);		/* binary, mode 3, LSB/MSB, ch 0 */	outb_p(LATCH & 0xff , 0x40);	/* LSB */	outb(LATCH >> 8 , 0x40);	/* MSB */	set_intr_gate(0x20,&timer_interrupt);	outb(inb_p(0x21)&~0x01,0x21);	set_system_gate(0x80,&system_call);}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
1区2区3区欧美| 亚洲一二三专区| 中文字幕在线不卡视频| 亚洲色图制服丝袜| 国产欧美久久久精品影院| 国产精品色在线| 亚洲精品成人少妇| 亚洲午夜久久久久中文字幕久| 亚洲影院免费观看| 亚洲6080在线| 国产毛片精品一区| 91小视频在线| 欧美一级高清片| 日本一区二区视频在线| 亚洲综合免费观看高清在线观看| 悠悠色在线精品| 亚洲一区二区视频| 久草中文综合在线| 99综合电影在线视频| 欧美三级午夜理伦三级中视频| 欧美另类高清zo欧美| 精品99一区二区三区| 国产精品久久久久国产精品日日| 久久综合色综合88| 亚洲免费在线观看| 乱中年女人伦av一区二区| 成人短视频下载| 91麻豆精品国产91久久久久 | 国产精品自拍网站| 91亚洲国产成人精品一区二三| 欧美片网站yy| 91精品国产综合久久蜜臀| 欧美一区二区不卡视频| 中国色在线观看另类| 亚洲欧美乱综合| 久久99国产精品成人| 91官网在线观看| 久久丝袜美腿综合| 亚洲成人7777| 久久精品国产999大香线蕉| 91视视频在线观看入口直接观看www | 欧美亚洲图片小说| 日韩一级在线观看| 亚洲激情图片一区| 国产精品自拍在线| 欧美一区二区网站| 一区二区三区中文字幕| 狠狠色综合播放一区二区| 欧美怡红院视频| 精品成人a区在线观看| 亚洲午夜影视影院在线观看| 国产成人日日夜夜| 欧美性猛交xxxxxx富婆| 国产精品嫩草影院com| 日韩中文字幕区一区有砖一区 | 欧美猛男超大videosgay| 久久影院午夜论| 天天爽夜夜爽夜夜爽精品视频| 国产一区二区三区不卡在线观看| 欧洲一区二区三区免费视频| 久久众筹精品私拍模特| 日韩福利电影在线| 欧美四级电影网| 26uuu另类欧美亚洲曰本| 无码av免费一区二区三区试看| 99久久久精品| 久久久久久亚洲综合影院红桃| 香蕉久久夜色精品国产使用方法| 99视频有精品| 欧美国产综合一区二区| 精品一区二区三区免费毛片爱| 这里是久久伊人| 亚洲欧美一区二区三区孕妇| 国产成人av网站| 久久久久久久久久久电影| 日本亚洲最大的色成网站www| 欧洲人成人精品| 亚洲综合精品自拍| av福利精品导航| 国产精品区一区二区三| 国产精品系列在线观看| 26uuu色噜噜精品一区二区| 美美哒免费高清在线观看视频一区二区 | 日本欧美一区二区三区乱码| 欧美私人免费视频| 亚洲一区二区三区免费视频| 色先锋aa成人| 亚洲精品日产精品乱码不卡| 色悠久久久久综合欧美99| 亚洲免费av高清| 色婷婷狠狠综合| 一区二区三区欧美激情| 波多野结衣亚洲| 国产精品国产三级国产a| 波多野结衣亚洲| 亚洲欧美日韩小说| 在线看日韩精品电影| 亚洲激情一二三区| 欧美视频一区二区三区在线观看 | 国产乱码精品一区二区三区av | 亚洲成人免费在线观看| 欧美色中文字幕| 日韩av不卡在线观看| 欧美一级一级性生活免费录像| 日韩国产欧美三级| 精品日韩一区二区三区| 国产伦精品一区二区三区视频青涩 | 欧美大度的电影原声| 美女在线视频一区| 中文字幕久久午夜不卡| 91成人免费电影| 久久er精品视频| 成人欧美一区二区三区1314| 欧美无乱码久久久免费午夜一区| 蜜桃久久久久久| 国产精品―色哟哟| 欧美日韩aaaaa| 国产精品66部| 亚洲成人黄色小说| 久久毛片高清国产| 在线观看成人免费视频| 精品一区免费av| 亚洲手机成人高清视频| 日韩欧美中文字幕公布| 91亚洲国产成人精品一区二区三 | 欧美一级免费大片| 成人精品一区二区三区中文字幕| 亚洲不卡一区二区三区| 国产日韩欧美不卡在线| 欧美日韩不卡在线| 成人黄色在线网站| 免费成人在线网站| 亚洲色图清纯唯美| 久久免费国产精品| 欧美日韩一区二区电影| 成人性生交大片免费看中文网站 | 日韩三级在线观看| 91香蕉视频污| 国产精品一区二区果冻传媒| 亚洲大片在线观看| 亚洲丝袜另类动漫二区| 久久奇米777| 91精品国产乱码久久蜜臀| av激情成人网| 国产成人免费视频网站高清观看视频 | 国产精品自在欧美一区| 日韩国产精品久久久久久亚洲| 亚洲色欲色欲www在线观看| 2023国产精品自拍| 欧美日韩色综合| 色猫猫国产区一区二在线视频| 国产在线视频不卡二| 视频一区二区欧美| 亚洲女女做受ⅹxx高潮| 国产精品网站导航| 国产亚洲精品精华液| 欧美日本精品一区二区三区| 99re视频精品| 成人精品免费看| 国产福利视频一区二区三区| 九九**精品视频免费播放| 日韩电影在线免费观看| 亚洲一区二区三区视频在线| 亚洲人一二三区| 中文字幕av一区二区三区免费看 | 高清视频一区二区| 国产最新精品免费| 另类人妖一区二区av| 丝袜a∨在线一区二区三区不卡| 依依成人综合视频| 亚洲精品日日夜夜| 亚洲精品一二三| 中文字幕亚洲视频| 国产精品免费丝袜| 国产精品免费久久| 中文字幕中文在线不卡住| 欧美国产激情一区二区三区蜜月 | 国产成a人亚洲| 国产一区二区三区美女| 国产一区二区三区高清播放| 精彩视频一区二区| 国产在线不卡一卡二卡三卡四卡| 久久97超碰国产精品超碰| 精品一区二区三区视频| 激情五月婷婷综合网| 国产最新精品免费| 国产成人av自拍| 成人av在线网| 91免费小视频| 欧美性欧美巨大黑白大战| 欧美三日本三级三级在线播放| 欧美视频一区二区三区四区| 欧美日韩国产免费| 欧美男生操女生| 日韩一区二区免费高清| 欧美xxxx老人做受| 日本一区二区三级电影在线观看| 国产女主播在线一区二区| 亚洲天堂精品视频| 亚洲一区二区三区四区的|