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

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

?? sched.c

?? linux0.11內(nèi)核源代碼,學(xué)習(xí)內(nèi)核入門必看
?? C
字號(hào):
/* *  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);}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美人伦禁忌dvd放荡欲情| 91精品国产91热久久久做人人| 亚洲国产美女搞黄色| 久久精品在这里| 欧美高清激情brazzers| 成人av手机在线观看| 欧美日韩精品欧美日韩精品一 | 色猫猫国产区一区二在线视频| 日韩精品一级中文字幕精品视频免费观看 | 欧美日韩日日夜夜| 成人av网址在线| 国产一区二区三区免费看| 性做久久久久久久久| 樱花草国产18久久久久| 国产欧美一区二区在线观看| 日韩欧美国产麻豆| 3atv一区二区三区| 欧美日韩一区二区三区不卡| av男人天堂一区| 国产成人亚洲综合a∨婷婷图片| 另类小说欧美激情| 亚洲成人1区2区| 亚洲精品ww久久久久久p站 | 亚洲一区中文日韩| 中文字幕亚洲在| 国产欧美日韩精品一区| 精品国产成人系列| 欧美电影免费观看完整版| 欧美日本一区二区三区| 91麻豆国产精品久久| www.久久久久久久久| 成人一区在线看| 成人激情文学综合网| 国产寡妇亲子伦一区二区| 精品一二三四区| 毛片一区二区三区| 蜜臀av性久久久久蜜臀av麻豆 | 国产精品一区二区在线播放 | 亚洲国产精品av| 国产欧美一区二区在线| 国产精品久久久久永久免费观看| 国产拍欧美日韩视频二区| 国产欧美一区在线| 亚洲欧洲性图库| 日韩伦理av电影| 亚洲国产一区二区三区青草影视| 亚洲电影视频在线| 日本少妇一区二区| 国内国产精品久久| 国产一区二区精品在线观看| 国产成人精品免费| av日韩在线网站| 精品视频一区二区不卡| 3d动漫精品啪啪1区2区免费| 日韩欧美高清在线| 久久久久九九视频| 国产凹凸在线观看一区二区| 成人午夜免费视频| 日本韩国欧美在线| 欧美二区乱c少妇| 精品国产百合女同互慰| 国产精品每日更新| 18欧美亚洲精品| 亚洲福利一二三区| 美女高潮久久久| 成人福利视频在线看| 在线观看视频一区二区欧美日韩| 欧美精选午夜久久久乱码6080| 日韩精品一区二区三区四区 | 欧美一级久久久| 久久精品欧美日韩| 亚洲欧美一区二区三区极速播放 | 2023国产精品| 亚洲女同ⅹxx女同tv| 日本va欧美va瓶| 成人黄色网址在线观看| 欧美精品欧美精品系列| 中文av一区特黄| 亚洲国产精品一区二区尤物区| 黄一区二区三区| 色综合久久综合中文综合网| 日韩视频一区二区| 中文字幕一区二区三区精华液| 日韩电影在线一区二区| 国产成人啪免费观看软件| 欧美视频一区二区三区| 国产日韩成人精品| 日本不卡的三区四区五区| 91在线观看美女| 欧美刺激脚交jootjob| 亚洲精品国产一区二区三区四区在线| 爽好久久久欧美精品| 99久久99久久精品免费观看 | 不卡的电影网站| 91精品国产丝袜白色高跟鞋| 国产精品国产自产拍在线| 日韩影院免费视频| 色一情一伦一子一伦一区| 久久综合九色综合97_久久久| 亚洲国产三级在线| 丁香五精品蜜臀久久久久99网站| 亚洲成人av一区二区三区| 国产成人在线看| 欧美tk—视频vk| 亚洲国产成人精品视频| caoporen国产精品视频| 久久久久久电影| 免费一级片91| 欧美视频一区在线观看| 国产精品久久久久永久免费观看| 韩国三级电影一区二区| 欧美日韩国产综合久久| 一区二区三区av电影| 成人91在线观看| 国产蜜臀97一区二区三区| 美美哒免费高清在线观看视频一区二区 | 91香蕉视频黄| 国产欧美一区二区在线| 九九精品一区二区| 日韩欧美第一区| 美女视频黄久久| 欧美一级专区免费大片| 亚洲成av人片在www色猫咪| 色婷婷av久久久久久久| 国产精品国产精品国产专区不片| 国产麻豆精品在线| 久久久精品欧美丰满| 国产一区二区在线影院| 精品国产欧美一区二区| 久久国产生活片100| 欧美成人艳星乳罩| 激情久久久久久久久久久久久久久久| 欧美精品精品一区| 天堂蜜桃91精品| 日韩一区二区三区免费看 | 视频一区在线播放| 欧美日韩精品一区二区三区四区 | 亚洲精品在线免费观看视频| 久久精品二区亚洲w码| 精品成人在线观看| 国产一区二区不卡| 欧美国产日韩一二三区| 成人性生交大片| 综合在线观看色| 色综合久久天天| 亚洲国产精品久久不卡毛片| 欧美肥胖老妇做爰| 欧美一区在线视频| 日本最新不卡在线| 日韩久久久久久| 国产精品正在播放| 国产精品国产精品国产专区不蜜 | 欧美亚洲综合一区| 日韩av电影一区| 精品国产乱码久久久久久蜜臀| 国产一区二区三区四| 国产精品盗摄一区二区三区| 色老汉av一区二区三区| 午夜精品一区二区三区免费视频| 欧美一区二区三区免费在线看| 国产一区二区三区美女| 国产欧美久久久精品影院| 91最新地址在线播放| 亚洲大型综合色站| 精品电影一区二区三区| 91在线视频播放地址| 首页欧美精品中文字幕| 久久久久久久久久久电影| 色猫猫国产区一区二在线视频| 日韩精品色哟哟| 国产精品视频在线看| 精品视频资源站| 国产a区久久久| 午夜视频一区二区| 久久久久久久久久电影| 欧洲国产伦久久久久久久| 激情成人综合网| 亚洲一区视频在线观看视频| 26uuu久久天堂性欧美| 色先锋资源久久综合| 久久99精品国产.久久久久久| 中文字幕在线视频一区| 欧美一三区三区四区免费在线看| 成人国产免费视频| 免费在线观看一区二区三区| 亚洲色图在线看| 精品三级在线看| 欧美三级蜜桃2在线观看| 国产精品911| 天天影视色香欲综合网老头| 欧美激情一区在线| 91精品国产综合久久久久| 99久久精品免费看国产| 国产乱国产乱300精品| 亚洲h动漫在线| 亚洲欧美一区二区三区极速播放 | 国产精品久久久久7777按摩| 欧美高清精品3d| 欧美在线观看一二区| eeuss鲁片一区二区三区在线观看|