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

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

?? hd.c

?? 講述linux的初始化過程
?? C
?? 第 1 頁 / 共 2 頁
字號:
	--CURRENT->current_nr_sectors;	CURRENT->buffer += 512;	if (!i || (CURRENT->bh && !SUBSECTOR(i)))		end_request(1);	if (i > 0) {		SET_INTR(&write_intr);		outsw(HD_DATA,CURRENT->buffer,256);		sti();	} else {#if (HD_DELAY > 0)		last_req = read_timer();#endif		hd_request();	}	return;}static void recal_intr(void){	check_status();#if (HD_DELAY > 0)	last_req = read_timer();#endif	hd_request();}/* * This is another of the error-routines I don't know what to do with. The * best idea seems to just set reset, and start all over again. */static void hd_times_out(unsigned long dummy){	unsigned int dev;	DEVICE_INTR = NULL;	if (QUEUE_EMPTY)		return;	disable_irq(HD_IRQ);	sti();	reset = 1;	dev = DEVICE_NR(CURRENT->rq_dev);	printk("hd%c: timeout\n", dev+'a');	if (++CURRENT->errors >= MAX_ERRORS) {#ifdef DEBUG		printk("hd%c: too many errors\n", dev+'a');#endif		end_request(0);	}	cli();	hd_request();	enable_irq(HD_IRQ);}int do_special_op (unsigned int dev){	if (recalibrate[dev]) {		recalibrate[dev] = 0;		hd_out(dev,hd_info[dev].sect,0,0,0,WIN_RESTORE,&recal_intr);		return reset;	}	if (hd_info[dev].head > 16) {		printk ("hd%c: cannot handle device with more than 16 heads - giving up\n", dev+'a');		end_request(0);	}	special_op[dev] = 0;	return 1;}/* * The driver enables interrupts as much as possible.  In order to do this, * (a) the device-interrupt is disabled before entering hd_request(), * and (b) the timeout-interrupt is disabled before the sti(). * * Interrupts are still masked (by default) whenever we are exchanging * data/cmds with a drive, because some drives seem to have very poor * tolerance for latency during I/O. The IDE driver has support to unmask * interrupts for non-broken hardware, so use that driver if required. */static void hd_request(void){	unsigned int dev, block, nsect, sec, track, head, cyl;	if (!QUEUE_EMPTY && CURRENT->rq_status == RQ_INACTIVE) return;	if (DEVICE_INTR)		return;repeat:	del_timer(&device_timer);	sti();	INIT_REQUEST;	if (reset) {		cli();		reset_hd();		return;	}	dev = MINOR(CURRENT->rq_dev);	block = CURRENT->sector;	nsect = CURRENT->nr_sectors;	if (dev >= (NR_HD<<6) || block >= hd[dev].nr_sects || ((block+nsect) > hd[dev].nr_sects)) {#ifdef DEBUG		if (dev >= (NR_HD<<6))			printk("hd: bad minor number: device=%s\n",			       kdevname(CURRENT->rq_dev));		else			printk("hd%c: bad access: block=%d, count=%d\n",				(MINOR(CURRENT->rq_dev)>>6)+'a', block, nsect);#endif		end_request(0);		goto repeat;	}	block += hd[dev].start_sect;	dev >>= 6;	if (special_op[dev]) {		if (do_special_op(dev))			goto repeat;		return;	}	sec   = block % hd_info[dev].sect + 1;	track = block / hd_info[dev].sect;	head  = track % hd_info[dev].head;	cyl   = track / hd_info[dev].head;#ifdef DEBUG	printk("hd%c: %sing: CHS=%d/%d/%d, sectors=%d, buffer=0x%08lx\n",		dev+'a', (CURRENT->cmd == READ)?"read":"writ",		cyl, head, sec, nsect, (unsigned long) CURRENT->buffer);#endif	if (CURRENT->cmd == READ) {		hd_out(dev,nsect,sec,head,cyl,WIN_READ,&read_intr);		if (reset)			goto repeat;		return;	}	if (CURRENT->cmd == WRITE) {		hd_out(dev,nsect,sec,head,cyl,WIN_WRITE,&write_intr);		if (reset)			goto repeat;		if (wait_DRQ()) {			bad_rw_intr();			goto repeat;		}		outsw(HD_DATA,CURRENT->buffer,256);		return;	}	panic("unknown hd-command");}static void do_hd_request (request_queue_t * q){	disable_irq(HD_IRQ);	hd_request();	enable_irq(HD_IRQ);}static int hd_ioctl(struct inode * inode, struct file * file,	unsigned int cmd, unsigned long arg){	struct hd_geometry *loc = (struct hd_geometry *) arg;	int dev;	if ((!inode) || !(inode->i_rdev))		return -EINVAL;	dev = DEVICE_NR(inode->i_rdev);	if (dev >= NR_HD)		return -EINVAL;	switch (cmd) {		case HDIO_GETGEO:		{			struct hd_geometry g; 			if (!loc)  return -EINVAL;			g.heads = hd_info[dev].head;			g.sectors = hd_info[dev].sect;			g.cylinders = hd_info[dev].cyl;			g.start = hd[MINOR(inode->i_rdev)].start_sect;			return copy_to_user(loc, &g, sizeof g) ? -EFAULT : 0; 		}         	case BLKGETSIZE:   /* Return device size */			if (!arg)  return -EINVAL;			return put_user(hd[MINOR(inode->i_rdev)].nr_sects, 					(long *) arg);		case BLKRRPART: /* Re-read partition tables */			if (!capable(CAP_SYS_ADMIN))				return -EACCES;			return revalidate_hddisk(inode->i_rdev, 1);		case BLKROSET:		case BLKROGET:		case BLKRASET:		case BLKRAGET:		case BLKFLSBUF:		case BLKPG:			return blk_ioctl(inode->i_rdev, cmd, arg);		default:			return -EINVAL;	}}static int hd_open(struct inode * inode, struct file * filp){	int target;	target =  DEVICE_NR(inode->i_rdev);	if (target >= NR_HD)		return -ENODEV;	while (busy[target])		sleep_on(&busy_wait);	access_count[target]++;	return 0;}/* * Releasing a block device means we sync() it, so that it can safely * be forgotten about... */static int hd_release(struct inode * inode, struct file * file){        int target =  DEVICE_NR(inode->i_rdev);	access_count[target]--;	return 0;}extern struct block_device_operations hd_fops;static struct gendisk hd_gendisk = {	MAJOR_NR,	/* Major number */		"hd",		/* Major name */	6,		/* Bits to shift to get real from partition */	1 << 6,		/* Number of partitions per real */	hd,		/* hd struct */	hd_sizes,	/* block sizes */	0,		/* number */	NULL,		/* internal use, not presently used */	NULL,		/* next */	&hd_fops,       /* file operations */};	static void hd_interrupt(int irq, void *dev_id, struct pt_regs *regs){	void (*handler)(void) = DEVICE_INTR;	DEVICE_INTR = NULL;	del_timer(&device_timer);	if (!handler)		handler = unexpected_hd_interrupt;	handler();	sti();}static struct block_device_operations hd_fops = {	open:		hd_open,	release:	hd_release,	ioctl:		hd_ioctl,};/* * This is the hard disk IRQ description. The SA_INTERRUPT in sa_flags * means we run the IRQ-handler with interrupts disabled:  this is bad for * interrupt latency, but anything else has led to problems on some * machines. * * We enable interrupts in some of the routines after making sure it's * safe. */static void __init hd_geninit(void){	int drive;	for(drive=0; drive < (MAX_HD << 6); drive++) {		hd_blocksizes[drive] = 1024;		hd_hardsectsizes[drive] = 512;	}	blksize_size[MAJOR_NR] = hd_blocksizes;	hardsect_size[MAJOR_NR] = hd_hardsectsizes;#ifdef __i386__	if (!NR_HD) {		extern struct drive_info drive_info;		unsigned char *BIOS = (unsigned char *) &drive_info;		unsigned long flags;		int cmos_disks;		for (drive=0 ; drive<2 ; drive++) {			hd_info[drive].cyl = *(unsigned short *) BIOS;			hd_info[drive].head = *(2+BIOS);			hd_info[drive].wpcom = *(unsigned short *) (5+BIOS);			hd_info[drive].ctl = *(8+BIOS);			hd_info[drive].lzone = *(unsigned short *) (12+BIOS);			hd_info[drive].sect = *(14+BIOS);#ifdef does_not_work_for_everybody_with_scsi_but_helps_ibm_vp			if (hd_info[drive].cyl && NR_HD == drive)				NR_HD++;#endif			BIOS += 16;		}	/*		We query CMOS about hard disks : it could be that 		we have a SCSI/ESDI/etc controller that is BIOS		compatible with ST-506, and thus showing up in our		BIOS table, but not register compatible, and therefore		not present in CMOS.		Furthermore, we will assume that our ST-506 drives		<if any> are the primary drives in the system, and 		the ones reflected as drive 1 or 2.		The first drive is stored in the high nibble of CMOS		byte 0x12, the second in the low nibble.  This will be		either a 4 bit drive type or 0xf indicating use byte 0x19 		for an 8 bit type, drive 1, 0x1a for drive 2 in CMOS.		Needless to say, a non-zero value means we have 		an AT controller hard disk for that drive.		Currently the rtc_lock is a bit academic since this		driver is non-modular, but someday... ?         Paul G.	*/		spin_lock_irqsave(&rtc_lock, flags);		cmos_disks = CMOS_READ(0x12);		spin_unlock_irqrestore(&rtc_lock, flags);		if (cmos_disks & 0xf0) {			if (cmos_disks & 0x0f)				NR_HD = 2;			else				NR_HD = 1;		}	}#endif /* __i386__ */#ifdef __arm__	if (!NR_HD) {		/* We don't know anything about the drive.  This means		 * that you *MUST* specify the drive parameters to the		 * kernel yourself.		 */		printk("hd: no drives specified - use hd=cyl,head,sectors"			" on kernel command line\n");	}#endif	for (drive=0 ; drive < NR_HD ; drive++) {		hd[drive<<6].nr_sects = hd_info[drive].head *			hd_info[drive].sect * hd_info[drive].cyl;		printk ("hd%c: %ldMB, CHS=%d/%d/%d\n", drive+'a',			hd[drive<<6].nr_sects / 2048, hd_info[drive].cyl,			hd_info[drive].head, hd_info[drive].sect);	}	if (!NR_HD)		return;	if (request_irq(HD_IRQ, hd_interrupt, SA_INTERRUPT, "hd", NULL)) {		printk("hd: unable to get IRQ%d for the hard disk driver\n",			HD_IRQ);		NR_HD = 0;		return;	}	request_region(HD_DATA, 8, "hd");	request_region(HD_CMD, 1, "hd(cmd)");	hd_gendisk.nr_real = NR_HD;	for(drive=0; drive < NR_HD; drive++)		register_disk(&hd_gendisk, MKDEV(MAJOR_NR,drive<<6), 1<<6,			&hd_fops, hd_info[drive].head * hd_info[drive].sect *			hd_info[drive].cyl);}int __init hd_init(void){	if (devfs_register_blkdev(MAJOR_NR,"hd",&hd_fops)) {		printk("hd: unable to get major %d for hard disk\n",MAJOR_NR);		return -1;	}	blk_init_queue(BLK_DEFAULT_QUEUE(MAJOR_NR), DEVICE_REQUEST);	read_ahead[MAJOR_NR] = 8;		/* 8 sector (4kB) read-ahead */	hd_gendisk.next = gendisk_head;	gendisk_head = &hd_gendisk;	init_timer(&device_timer);	device_timer.function = hd_times_out;	hd_geninit();	return 0;}#define DEVICE_BUSY busy[target]#define USAGE access_count[target]#define CAPACITY (hd_info[target].head*hd_info[target].sect*hd_info[target].cyl)/* We assume that the BIOS parameters do not change, so the disk capacity   will not change */#undef MAYBE_REINIT#define GENDISK_STRUCT hd_gendisk/* * This routine is called to flush all partitions and partition tables * for a changed disk, and then re-read the new partition table. * If we are revalidating a disk because of a media change, then we * enter with usage == 0.  If we are using an ioctl, we automatically have * usage == 1 (we need an open channel to use an ioctl :-), so this * is our limit. */static int revalidate_hddisk(kdev_t dev, int maxusage){	int target;	struct gendisk * gdev;	int max_p;	int start;	int i;	long flags;	target = DEVICE_NR(dev);	gdev = &GENDISK_STRUCT;	save_flags(flags);	cli();	if (DEVICE_BUSY || USAGE > maxusage) {		restore_flags(flags);		return -EBUSY;	}	DEVICE_BUSY = 1;	restore_flags(flags);	max_p = gdev->max_p;	start = target << gdev->minor_shift;	for (i=max_p - 1; i >=0 ; i--) {		int minor = start + i;		kdev_t devi = MKDEV(MAJOR_NR, minor);		struct super_block *sb = get_super(devi); 		sync_dev(devi);		if (sb)			invalidate_inodes(sb);		invalidate_buffers(devi);		gdev->part[minor].start_sect = 0;		gdev->part[minor].nr_sects = 0;	}#ifdef MAYBE_REINIT	MAYBE_REINIT;#endif	grok_partitions(gdev, target, 1<<6, CAPACITY);	DEVICE_BUSY = 0;	wake_up(&busy_wait);	return 0;}static int parse_hd_setup (char *line) {	int ints[6];	(void) get_options(line, ARRAY_SIZE(ints), ints);	hd_setup(NULL, ints);	return 1;}__setup("hd=", parse_hd_setup);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久九九久久九九| 在线成人免费观看| ㊣最新国产の精品bt伙计久久| 国产精品一区一区| 国产欧美精品在线观看| 大胆亚洲人体视频| 中文字幕在线播放不卡一区| 91麻豆精东视频| 亚洲一区二区三区四区的| 欧美日韩国产片| 麻豆精品在线播放| 久久久不卡影院| 色婷婷精品大在线视频| 亚洲国产精品一区二区尤物区| 制服.丝袜.亚洲.另类.中文| 国产麻豆一精品一av一免费| 亚洲欧美一区二区三区国产精品| 欧美日韩免费一区二区三区视频| 蜜桃视频一区二区三区| 久久久久亚洲蜜桃| 99综合电影在线视频| 亚洲超碰精品一区二区| 久久亚洲综合av| 91免费在线看| 久久国产精品一区二区| 亚洲人成网站色在线观看| 欧美一区二区三区四区视频| 国产精品888| 亚洲黄色小视频| 精品成人免费观看| 色婷婷av一区二区三区之一色屋| 蜜臀av一区二区三区| 亚洲欧美激情一区二区| 精品国产一二三区| 97se亚洲国产综合在线| 麻豆高清免费国产一区| 亚洲人午夜精品天堂一二香蕉| 日韩精品最新网址| 欧美在线999| 国产精品香蕉一区二区三区| 午夜欧美在线一二页| 中文字幕欧美日韩一区| 欧美一级夜夜爽| 欧美综合久久久| 北岛玲一区二区三区四区| 日本不卡在线视频| 亚洲激情自拍视频| 精品成人一区二区三区四区| 欧美丰满少妇xxxbbb| 色婷婷亚洲综合| 粉嫩av亚洲一区二区图片| 毛片基地黄久久久久久天堂| 亚洲国产视频一区二区| 中文字幕日韩一区二区| 日韩精品在线一区二区| 欧美日韩久久一区二区| 成人18精品视频| 国产成+人+日韩+欧美+亚洲| 精品在线观看免费| 日日嗨av一区二区三区四区| 亚洲午夜免费视频| 亚洲人成伊人成综合网小说| 国产精品毛片大码女人| 久久精品在这里| 国产亚洲精品aa| www国产成人免费观看视频 深夜成人网 | 久久国产视频网| 日韩二区三区在线观看| 亚洲一区自拍偷拍| 亚洲免费资源在线播放| 亚洲图片激情小说| 中文字幕五月欧美| 国产精品区一区二区三区| 国产三级欧美三级| 26uuu亚洲| 精品三级在线看| 精品国产一区二区三区久久影院| 欧美精品久久久久久久多人混战| 欧美日韩夫妻久久| 欧美日韩黄色一区二区| 欧美日韩激情一区二区三区| 欧美乱妇15p| 日韩欧美久久一区| 欧美一区二区成人| 精品美女一区二区| 久久香蕉国产线看观看99| 国产网红主播福利一区二区| 国产人成一区二区三区影院| 国产欧美视频一区二区| 国产精品免费视频观看| 樱桃视频在线观看一区| 亚洲一区在线观看网站| 亚洲成人tv网| 久久99久久99精品免视看婷婷| 精品中文字幕一区二区| 国产成人h网站| 色综合久久天天| 制服丝袜日韩国产| 亚洲精品一区在线观看| 国产精品久久福利| 亚洲午夜精品在线| 麻豆精品久久精品色综合| 91丨porny丨中文| 欧美日韩在线一区二区| 日韩一区二区在线观看视频播放| 久久一区二区三区国产精品| 亚洲视频一区二区在线| 天天操天天色综合| 国产精品一二一区| 色综合天天综合| 日韩精品一区二区三区中文不卡| 国产亚洲精品精华液| 亚洲一本大道在线| 精品写真视频在线观看| 色中色一区二区| 日韩亚洲欧美在线| 自拍偷在线精品自拍偷无码专区| 午夜成人免费视频| 国产激情91久久精品导航| 91免费观看在线| 欧美mv日韩mv国产网站app| 中文字幕在线观看一区二区| 日日夜夜免费精品| 成人国产精品免费| 日韩一区二区三区av| 国产精品久久久久久久久搜平片 | 欧美精品在线观看一区二区| 欧美精品一区二区三区四区| 亚洲一区二区欧美日韩| 国产露脸91国语对白| 欧美日韩精品一区二区三区四区 | 欧美美女喷水视频| 亚洲国产成人午夜在线一区| 免费观看在线综合| 色噜噜夜夜夜综合网| 国产亚洲欧美一级| 丝袜诱惑亚洲看片| 色av成人天堂桃色av| 国产视频不卡一区| 麻豆国产欧美一区二区三区| 欧美主播一区二区三区美女| 国产精品美女www爽爽爽| 国产在线精品一区二区夜色| 欧美日韩你懂得| 亚洲乱码国产乱码精品精小说 | 香蕉成人啪国产精品视频综合网| av中文一区二区三区| 久久久久久久免费视频了| 奇米四色…亚洲| 欧美男女性生活在线直播观看| 亚洲日本在线天堂| 成人黄色网址在线观看| 国产亚洲短视频| 精品亚洲免费视频| 欧美成人女星排名| 日本不卡视频一二三区| 欧美伊人久久久久久午夜久久久久| 中文字幕一区三区| 高清久久久久久| 国产日韩三级在线| 国产综合久久久久影院| 日韩欧美国产三级电影视频| 日本视频一区二区三区| 在线成人av网站| 欧美aaaaa成人免费观看视频| 欧美日韩亚洲综合在线 欧美亚洲特黄一级 | 国产欧美日韩在线看| 国产精品亚洲专一区二区三区| 久久美女艺术照精彩视频福利播放| 久久精品国产亚洲aⅴ| 日韩欧美国产小视频| 精品一区二区三区香蕉蜜桃| 欧美成人艳星乳罩| 九九在线精品视频| 欧美mv日韩mv亚洲| 韩国女主播一区| 国产午夜精品一区二区三区嫩草| 粉嫩绯色av一区二区在线观看 | 色婷婷精品大在线视频| 一区二区在线观看不卡| 欧美性淫爽ww久久久久无| 亚洲综合色成人| 91麻豆精品国产自产在线| 蜜臀av一区二区在线观看 | 国产欧美综合在线观看第十页| 国产成人在线电影| 亚洲蜜桃精久久久久久久| 欧美日韩一区视频| 麻豆久久久久久久| 欧美国产日韩亚洲一区| 97精品久久久久中文字幕| 亚洲自拍另类综合| 欧美一卡二卡在线| 国产成人精品免费| 亚洲精品国产高清久久伦理二区 | 日韩欧美在线一区二区三区| 韩日av一区二区| 亚洲男人天堂一区| 91精品一区二区三区在线观看| 国产在线视频一区二区|