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

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

?? tty_ioctl.c

?? LINUX 0.11版內核代碼。 并有代碼分析說明。
?? C
字號:
/* passed* linux/kernel/chr_drv/tty_ioctl.c** (C) 1991 Linus Torvalds*/#include <set_seg.h>
#include <errno.h>		// 錯誤號頭文件。包含系統中各種出錯號。(Linus 從minix 中引進的)。#include <termios.h>		// 終端輸入輸出函數頭文件。主要定義控制異步通信口的終端接口。#include <linux/sched.h>	// 調度程序頭文件,定義了任務結構task_struct、初始任務0 的數據,// 還有一些有關描述符參數設置和獲取的嵌入式匯編函數宏語句。#include <linux/kernel.h>	// 內核頭文件。含有一些內核常用函數的原形定義。#include <linux/tty.h>		// tty 頭文件,定義了有關tty_io,串行通信方面的參數、常數。#include <asm/io.h>		// io 頭文件。定義硬件端口輸入/輸出宏匯編語句。#include <asm/segment.h>	// 段操作頭文件。定義了有關段寄存器操作的嵌入式匯編函數。#include <asm/system.h>		// 系統頭文件。定義了設置或修改描述符/中斷門等的嵌入式匯編宏。// 這是波特率因子數組(或稱為除數數組)。波特率與波特率因子的對應關系參見列表后的說明。static unsigned short quotient[] = {	0, 2304, 1536, 1047, 857,	768, 576, 384, 192, 96,	64, 48, 24, 12, 6, 3};//// 修改傳輸速率。// 參數:tty - 終端對應的tty 數據結構。// 在除數鎖存標志DLAB(線路控制寄存器位7)置位情況下,通過端口0x3f8 和0x3f9 向UART 分別寫入// 波特率因子低字節和高字節。static voidchange_speed (struct tty_struct *tty){	unsigned short port, quot;// 對于串口終端,其tty 結構的讀緩沖隊列data 字段存放的是串行端口號(0x3f8 或0x2f8)。	if (!(port = tty->read_q.data))		return;// 從tty 的termios 結構控制模式標志集中取得設置的波特率索引號,據此從波特率因子數組中取得// 對應的波特率因子值。CBAUD 是控制模式標志集中波特率位屏蔽碼。	quot = quotient[tty->termios.c_cflag & CBAUD];	cli ();			// 關中斷。	outb_p (0x80, port + 3);	/* set DLAB */// 首先設置除數鎖定標志DLAB。	outb_p (quot & 0xff, port);	/* LS of divisor */// 輸出因子低字節。	outb_p (quot >> 8, port + 1);	/* MS of divisor */// 輸出因子高字節。	outb (0x03, port + 3);	/* reset DLAB */// 復位DLAB。	sti ();			// 開中斷。}//// 刷新tty 緩沖隊列。// 參數:gueue - 指定的緩沖隊列指針。// 令緩沖隊列的頭指針等于尾指針,從而達到清空緩沖區(零字符)的目的。static voidflush (struct tty_queue *queue){	cli ();	queue->head = queue->tail;	sti ();}//// 等待字符發送出去。static voidwait_until_sent (struct tty_struct *tty){/* do nothing - not implemented *//* 什么都沒做 - 還未實現 */}//// 發送BREAK 控制符。static voidsend_break (struct tty_struct *tty){/* do nothing - not implemented *//* 什么都沒做 - 還未實現 */}//// 取終端termios 結構信息。// 參數:tty - 指定終端的tty 結構指針;termios - 用戶數據區termios 結構緩沖區指針。// 返回0 。static intget_termios (struct tty_struct *tty, struct termios *termios){	int i;// 首先驗證一下用戶的緩沖區指針所指內存區是否足夠,如不夠則分配內存。	verify_area (termios, sizeof (*termios));// 復制指定tty 結構中的termios 結構信息到用戶 termios 結構緩沖區。	for (i = 0; i < (sizeof (*termios)); i++)		put_fs_byte (((char *) &tty->termios)[i], i + (char *) termios);	return 0;}//// 設置終端termios 結構信息。// 參數:tty - 指定終端的tty 結構指針;termios - 用戶數據區termios 結構指針。// 返回0 。static intset_termios (struct tty_struct *tty, struct termios *termios){	int i;// 首先復制用戶數據區中termios 結構信息到指定tty 結構中。	for (i = 0; i < (sizeof (*termios)); i++)		((char *) &tty->termios)[i] = get_fs_byte (i + (char *) termios);// 用戶有可能已修改了tty 的串行口傳輸波特率,所以根據termios 結構中的控制模式標志c_cflag// 修改串行芯片UART 的傳輸波特率。	change_speed (tty);	return 0;}//// 讀取termio 結構中的信息。// 參數:tty - 指定終端的tty 結構指針;termio - 用戶數據區termio 結構緩沖區指針。// 返回0。static intget_termio (struct tty_struct *tty, struct termio *termio){	int i;	struct termio tmp_termio;// 首先驗證一下用戶的緩沖區指針所指內存區是否足夠,如不夠則分配內存。	verify_area (termio, sizeof (*termio));// 將termios 結構的信息復制到termio 結構中。目的是為了其中模式標志集的類型進行轉換,也即// 從termios 的長整數類型轉換為termio 的短整數類型。	tmp_termio.c_iflag = tty->termios.c_iflag;	tmp_termio.c_oflag = tty->termios.c_oflag;	tmp_termio.c_cflag = tty->termios.c_cflag;	tmp_termio.c_lflag = tty->termios.c_lflag;// 兩種結構的c_line 和c_cc[]字段是完全相同的。	tmp_termio.c_line = tty->termios.c_line;	for (i = 0; i < NCC; i++)		tmp_termio.c_cc[i] = tty->termios.c_cc[i];// 最后復制指定tty 結構中的termio 結構信息到用戶 termio 結構緩沖區。	for (i = 0; i < (sizeof (*termio)); i++)		put_fs_byte (((char *) &tmp_termio)[i], i + (char *) termio);	return 0;}/** This only works as the 386 is low-byt-first*//** 下面的termio 設置函數僅在386 低字節在前的方式下可用。*///// 設置終端termio 結構信息。// 參數:tty - 指定終端的tty 結構指針;termio - 用戶數據區termio 結構指針。// 將用戶緩沖區termio 的信息復制到終端的termios 結構中。返回0 。static intset_termio (struct tty_struct *tty, struct termio *termio){	int i;	struct termio tmp_termio;// 首先復制用戶數據區中termio 結構信息到臨時termio 結構中。	for (i = 0; i < (sizeof (*termio)); i++)		((char *) &tmp_termio)[i] = get_fs_byte (i + (char *) termio);// 再將termio 結構的信息復制到tty 的termios 結構中。目的是為了其中模式標志集的類型進行轉換,// 也即從termio 的短整數類型轉換成termios 的長整數類型。	*(unsigned short *) &tty->termios.c_iflag = tmp_termio.c_iflag;	*(unsigned short *) &tty->termios.c_oflag = tmp_termio.c_oflag;	*(unsigned short *) &tty->termios.c_cflag = tmp_termio.c_cflag;	*(unsigned short *) &tty->termios.c_lflag = tmp_termio.c_lflag;// 兩種結構的c_line 和c_cc[]字段是完全相同的。	tty->termios.c_line = tmp_termio.c_line;	for (i = 0; i < NCC; i++)		tty->termios.c_cc[i] = tmp_termio.c_cc[i];// 用戶可能已修改了tty 的串行口傳輸波特率,所以根據termios 結構中的控制模式標志集c_cflag// 修改串行芯片UART 的傳輸波特率。	change_speed (tty);	return 0;}//// tty 終端設備的ioctl 函數。// 參數:dev - 設備號;cmd - ioctl 命令;arg - 操作參數指針。inttty_ioctl (int dev, int cmd, int arg){	struct tty_struct *tty;// 首先取tty 的子設備號。如果主設備號是5(tty 終端),則進程的tty 字段即是子設備號;如果進程// 的tty 子設備號是負數,表明該進程沒有控制終端,也即不能發出該ioctl 調用,出錯死機。	if (MAJOR (dev) == 5)	{		dev = current->tty;		if (dev < 0)			panic ("tty_ioctl: dev<0");// 否則直接從設備號中取出子設備號。	}	else		dev = MINOR (dev);// 子設備號可以是0(控制臺終端)、1(串口1 終端)、2(串口2 終端)。// 讓tty 指向對應子設備號的tty 結構。	tty = dev + tty_table;// 根據tty 的ioctl 命令進行分別處理。	switch (cmd)	{	case TCGETS://取相應終端termios 結構中的信息。		return get_termios (tty, (struct termios *) arg);	case TCSETSF:// 在設置termios 的信息之前,需要先等待輸出隊列中所有數據處理完,并且刷新(清空)輸入隊列。// 再設置。		flush (&tty->read_q);	/* fallthrough */	case TCSETSW:// 在設置終端termios 的信息之前,需要先等待輸出隊列中所有數據處理完(耗盡)。對于修改參數// 會影響輸出的情況,就需要使用這種形式。		wait_until_sent (tty);	/* fallthrough */	case TCSETS:// 設置相應終端termios 結構中的信息。		return set_termios (tty, (struct termios *) arg);	case TCGETA:// 取相應終端termio 結構中的信息。		return get_termio (tty, (struct termio *) arg);	case TCSETAF:// 在設置termio 的信息之前,需要先等待輸出隊列中所有數據處理完,并且刷新(清空)輸入隊列。// 再設置。		flush (&tty->read_q);	/* fallthrough */	case TCSETAW:// 在設置終端termio 的信息之前,需要先等待輸出隊列中所有數據處理完(耗盡)。對于修改參數// 會影響輸出的情況,就需要使用這種形式。		wait_until_sent (tty);	/* fallthrough *//* 繼續執行 */	case TCSETA:// 設置相應終端termio 結構中的信息。		return set_termio (tty, (struct termio *) arg);	case TCSBRK:// 等待輸出隊列處理完畢(空),如果參數值是0,則發送一個break。		if (!arg)		{			wait_until_sent (tty);			send_break (tty);		}		return 0;	case TCXONC:// 開始/停止控制。如果參數值是0,則掛起輸出;如果是1,則重新開啟掛起的輸出;如果是2,則掛起// 輸入;如果是3,則重新開啟掛起的輸入。		return -EINVAL;		/* not implemented *//* 未實現 */	case TCFLSH://刷新已寫輸出但還沒發送或已收但還沒有讀數據。如果參數是0,則刷新(清空)輸入隊列;如果是1,// 則刷新輸出隊列;如果是2,則刷新輸入和輸出隊列。		if (arg == 0)			flush (&tty->read_q);		else if (arg == 1)			flush (&tty->write_q);		else if (arg == 2)		{			flush (&tty->read_q);			flush (&tty->write_q);		}		else			return -EINVAL;		return 0;	case TIOCEXCL:// 設置終端串行線路專用模式。		return -EINVAL;		/* not implemented *//* 未實現 */	case TIOCNXCL:// 復位終端串行線路專用模式。		return -EINVAL;		/* not implemented *//* 未實現 */	case TIOCSCTTY:// 設置tty 為控制終端。(TIOCNOTTY - 禁止tty 為控制終端)。		return -EINVAL;		/* set controlling term NI *//* 設置控制終端NI */	case TIOCGPGRP:		// NI - Not Implemented。// 讀取指定終端設備進程的組id。首先驗證用戶緩沖區長度,然后復制tty 的pgrp 字段到用戶緩沖區。		verify_area ((void *) arg, 4);		put_fs_long (tty->pgrp, (unsigned long *) arg);		return 0;	case TIOCSPGRP:// 設置指定終端設備進程的組id。		tty->pgrp = get_fs_long ((unsigned long *) arg);		return 0;	case TIOCOUTQ:// 返回輸出隊列中還未送出的字符數。首先驗證用戶緩沖區長度,然后復制隊列中字符數給用戶。		verify_area ((void *) arg, 4);		put_fs_long (CHARS (tty->write_q), (unsigned long *) arg);		return 0;	case TIOCINQ:// 返回輸入隊列中還未讀取的字符數。首先驗證用戶緩沖區長度,然后復制隊列中字符數給用戶。		verify_area ((void *) arg, 4);		put_fs_long (CHARS (tty->secondary), (unsigned long *) arg);		return 0;	case TIOCSTI:// 模擬終端輸入。該命令以一個指向字符的指針作為參數,并假裝該字符是在終端上鍵入的。用戶必須// 在該控制終端上具有超級用戶權限或具有讀許可權限。		return -EINVAL;		/* not implemented *//* 未實現 */	case TIOCGWINSZ:// 讀取終端設備窗口大小信息(參見termios.h 中的winsize 結構)。		return -EINVAL;		/* not implemented *//* 未實現 */	case TIOCSWINSZ:// 設置終端設備窗口大小信息(參見winsize 結構)。		return -EINVAL;		/* not implemented *//* 未實現 */	case TIOCMGET:// 返回modem 狀態控制引線的當前狀態比特位標志集(參見termios.h 中185-196 行)。		return -EINVAL;		/* not implemented *//* 未實現 */	case TIOCMBIS:// 設置單個modem 狀態控制引線的狀態(true 或false)。		return -EINVAL;		/* not implemented *//* 未實現 */	case TIOCMBIC:// 復位單個modem 狀態控制引線的狀態。		return -EINVAL;		/* not implemented *//* 未實現 */	case TIOCMSET:// 設置modem 狀態引線的狀態。如果某一比特位置位,則modem 對應的狀態引線將置為有效。		return -EINVAL;		/* not implemented *//* 未實現 */	case TIOCGSOFTCAR:// 讀取軟件載波檢測標志(1 - 開啟;0 - 關閉)。		return -EINVAL;		/* not implemented *//* 未實現 */	case TIOCSSOFTCAR:// 設置軟件載波檢測標志(1 - 開啟;0 - 關閉)。		return -EINVAL;		/* not implemented *//* 未實現 */	default:		return -EINVAL;	}}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩一级二级三级| 9l国产精品久久久久麻豆| 欧美一区二区三区性视频| 午夜视频一区在线观看| 91精品欧美综合在线观看最新| 午夜精品福利一区二区三区av| 91精品国产欧美日韩| 久久av资源网| 国产欧美日韩综合精品一区二区 | 午夜激情久久久| 欧美一区二区视频在线观看2020| 蜜桃av噜噜一区| 国产亚洲一二三区| 91老师国产黑色丝袜在线| 亚洲第一激情av| 亚洲精品一区二区三区香蕉 | 久久成人综合网| 久久精品一区蜜桃臀影院| av中文字幕在线不卡| 亚洲一区二区av在线| 91精品福利在线一区二区三区 | 亚洲大型综合色站| 日韩欧美国产wwwww| 成人黄色软件下载| 亚洲综合一区二区精品导航| 欧美一区二区不卡视频| 粉嫩在线一区二区三区视频| 亚洲在线观看免费| 久久精品亚洲精品国产欧美 | 欧美日韩dvd在线观看| 国内精品写真在线观看| 亚洲黄色在线视频| 欧美一级二级在线观看| 91香蕉视频黄| 国产在线精品一区在线观看麻豆| 亚洲欧洲无码一区二区三区| 91精品在线观看入口| 懂色av一区二区夜夜嗨| 亚洲国产精品自拍| 亚洲欧洲精品成人久久奇米网| 欧美放荡的少妇| 不卡视频免费播放| 久久99国内精品| 亚洲一区二区综合| 中文字幕欧美区| 欧美不卡一区二区三区四区| 色婷婷综合久久久久中文一区二区 | 久久精品一区蜜桃臀影院| 欧美精品18+| 一本色道久久综合亚洲精品按摩| 国产一区视频在线看| 天天av天天翘天天综合网色鬼国产| 日本一区二区三区高清不卡| 欧美一区二区视频网站| 欧美日韩一区二区三区高清 | 精品中文字幕一区二区小辣椒| 亚洲精品免费看| 中文字幕在线观看一区| 国产亚洲婷婷免费| 日韩一区二区精品在线观看| 欧美午夜不卡在线观看免费| 国产成人a级片| 国产精品一区久久久久| 狠狠网亚洲精品| 久国产精品韩国三级视频| 五月天久久比比资源色| 亚洲高清免费视频| 亚洲一区视频在线| 亚洲精品国产一区二区三区四区在线| 欧美经典一区二区三区| 欧美国产日韩亚洲一区| 国产人久久人人人人爽| 久久综合色婷婷| 欧美成人aa大片| 精品毛片乱码1区2区3区| 制服丝袜亚洲精品中文字幕| 欧美日韩一区二区三区不卡| 欧美图区在线视频| 欧美老肥妇做.爰bbww| 6080亚洲精品一区二区| 91精品国产一区二区| 91麻豆精品国产91久久久| 欧美一区二区三区思思人| 51久久夜色精品国产麻豆| 日韩免费在线观看| 久久久99久久| 中文字幕在线观看一区二区| 亚洲美女在线国产| 夜夜夜精品看看| 日本亚洲视频在线| 久久97超碰色| 国产99久久久国产精品免费看| 国产suv一区二区三区88区| 成人午夜电影网站| 99在线精品一区二区三区| 91免费看视频| 欧美精品第1页| 精品国产污污免费网站入口 | 亚洲天堂网中文字| 国产精品高清亚洲| 亚洲欧美偷拍另类a∨色屁股| 亚洲欧美电影院| 亚洲在线视频免费观看| 青青草原综合久久大伊人精品| 蜜臀av性久久久久蜜臀av麻豆 | 亚洲国产精品激情在线观看| 伊人婷婷欧美激情| 蜜桃av噜噜一区| 成人精品鲁一区一区二区| 色综合色狠狠天天综合色| 欧美日韩高清一区二区三区| 日韩美一区二区三区| 国产精品视频一二三| 一区二区三区精品| 久久精品国产亚洲高清剧情介绍| 国产不卡高清在线观看视频| 欧美亚洲一区三区| 2021中文字幕一区亚洲| 亚洲精品久久久蜜桃| 久久精品二区亚洲w码| av亚洲精华国产精华精| 欧美一区二区免费视频| 成人欧美一区二区三区1314| 日本aⅴ精品一区二区三区| 99精品视频在线观看| 欧美变态tickle挠乳网站| 伊人婷婷欧美激情| 国产传媒日韩欧美成人| 欧美一区二区三区免费观看视频| 欧美国产97人人爽人人喊| 日日欢夜夜爽一区| 91丝袜美腿高跟国产极品老师| 欧美变态口味重另类| 性久久久久久久| 97久久超碰国产精品| 久久久久成人黄色影片| 青青青爽久久午夜综合久久午夜| 91极品视觉盛宴| 国产精品的网站| 老色鬼精品视频在线观看播放| 91福利视频网站| 国产精品国产馆在线真实露脸| 久久精品72免费观看| 欧美三片在线视频观看| 最新日韩av在线| 国产成人免费在线视频| 精品国产91洋老外米糕| 日韩电影在线观看网站| 欧美特级限制片免费在线观看| 国产精品每日更新| 国产精品系列在线播放| 精品国产免费人成在线观看| 日本一区中文字幕| 欧美日韩mp4| 午夜精品久久久久久久久久| 欧洲视频一区二区| 亚洲女同一区二区| www.66久久| 国产精品久久久久久久蜜臀| 国产成人在线电影| 欧美国产日韩亚洲一区| 成人高清视频在线观看| 国产精品毛片久久久久久| 国产成人免费视频一区| 欧美国产欧美综合| 成人av在线一区二区三区| 国产精品久久99| 91丝袜国产在线播放| 亚洲品质自拍视频网站| 色吧成人激情小说| 亚洲综合男人的天堂| 欧美日韩一区视频| 五月天丁香久久| 欧美一级高清片在线观看| 精品一区二区免费| 久久久久久久性| 成人精品视频一区二区三区尤物| 国产精品国产三级国产aⅴ入口| 99久久免费精品| 亚洲一区二区三区在线看| 欧美军同video69gay| 老司机精品视频线观看86| 久久精品一区二区三区不卡| 99久久久国产精品免费蜜臀| 一区二区三区不卡视频| 欧美精品色综合| 极品少妇xxxx精品少妇偷拍| 国产日韩精品一区二区浪潮av| 不卡视频在线看| 亚洲午夜精品在线| 日韩视频国产视频| 国产999精品久久久久久| 亚洲欧美日韩综合aⅴ视频| 欧美日韩国产综合一区二区| 男人的j进女人的j一区| 日本一区二区三区免费乱视频| 色狠狠一区二区三区香蕉| 日韩精品一卡二卡三卡四卡无卡| 欧美精品一区二区三区四区| 99久久99久久久精品齐齐|