【操作系统】设备驱动

article/2025/11/8 2:19:46

本文为学习李治军老师《操作系统原理、实现与实践》第八章的总结,主要讲述显示器、键盘设备驱动。

参考资料:

  1. 哈工大李治军老师操作系统mooc视频;
  2. 实践项目解析。

第八章 设备驱动

设备驱动的基本原理

  • 外设工作原理

    • 从CPU开始:CPU发送命令(给外设中的寄存器),最终表现为执行指令“out ax, 端口号”;

    • 从外设开始:外设在工作完成后或出现状态变化时产生中断 ,CPU 通过中断处理程序完成后续工作;

  • 文件视图

    • 不论什么样的外设,操作系统都将其统一抽象成一个文件,程序员通过文件接口open, read, write, close来使用外设;

    • 不同的设备对应不同的设备文件:/dev/xxx;

    • 上层用户使用外设的基本结构:

      int fd = open(“/dev/xxx”);//打开外设文件
      for (int i = 0; i < 10; i++) {
      write(fd,i,sizeof(int));//向外设文件写入
      }
      close(fd);//关闭外设文件
      
  • 补充:设备文件(参考IO设备)

    • 操作系统把一切外设都映射为文件,被称作设备文件(如磁盘文件),常见的设备文件又分为三种:
      1.字符设备 如键盘,鼠标,串口等(以字节为单位顺序访问);

      2.块设备 如磁盘驱动器,磁带驱动器,光驱等(均匀的数据库访问);

      3.网络设备 如以太网,无线,蓝牙等(格式化报文交换);

显示器的驱动

  • 显示器和键盘构成了终端设备 dev/tty,显示器只写,键盘只读;

  • 以printf为例:

    • printf()调用系统调用write(1, buf, count)

    • write 的内核实现是 sys_write:找到所写文件的属性,根据设备文件中存放的设备属性信息分支到相应的操作命令;

      • 分支1:根据文件属性(是否是字符设备);

        //在linux/fs/read_write.c中
        int sys_write(unsigned int fd, char *buf,int cnt)
        { inode = file->f_inode;if(S_ISCHR(inode->i_mode))return rw_char(WRITE,inode->i_zone[0], buf,cnt); ...
        
      • 分支2:在rw_char中根据不同的读写函数:

        //在linux/fs/char_dev.c中
        int rw_char(int rw, int dev, char *buf, int cnt)
        { 
        //以主设备号MAJOR(dev)为索引从函数表crw_table中找到和终端设备对应的读写函数rw_ttyx并调用crw_ptr call_addr=crw_table[MAJOR(dev)];call_addr(rw, dev, buf, cnt); ...
        }
        
      • 分支3:根据读/写操作:

        //根据是设备读操作还是设备写操作调用相应的函数
        static int rw_ttyx(int rw, unsigned minor, char *buf, int count)
        { return ((rw==READ)? tty_read(minor,buf): tty_write(minor,buf));
        }
        
    • printf是输出所以调用tty_write(minor,buf)实现输出:先将内容写到缓冲区里,由操作系统统一将队列中的内容输出到显示器上,如果缓冲区已满,就睡眠等待;

      在linux/kernel/tty_io.c中
      int tty_write(unsigned channel,char *buf,int nr)
      { struct tty_struct *tty;tty=channel+tty_table;sleep_if_full(&tty->write_q); //输出就是放入队列...
      }
      
    • 如果输出完成或写队列满

      int tty_write(unsigned channel,char *buf,int nr)
      { ...tty->write(tty);//用tty中write函数指针来进行真实的显示器输出
      }
      
    • 最终调用con_write向终端写数据,核心代码为:

      mov c, al
      mov attr, ah
      mov ax, [pos] ;显存和内存独立编址用out,显存和内存混合编址用mov
      

      其中pos为开机后当前光标所在的显存地址;

  • printf()输出函数的完整文件视图路线

    • printf -> write -> sys_write -> rw_char -> rw_ttyx ->tty_write -> write_q -> con_write -> “mov ax, [pos]

键盘的驱动

  • 从键盘中断开始

    • 设置键盘中断号,按下键盘会产生 0x21 号中断,执行keyboard_interrupt中的inb $0x60,%al

      void con_init(void) //应为键盘也是console的一部分
      { set_trap_gate(0x21, &keyboard_interrupt); }//在kernel/chr_drv/keyboard.S中
      .globl _keyboard_interrupt
      _keyboard_interrupt:
      inb $0x60,%al //从端口0x60读扫描码
      call key_table(,%eax,4) //根据扫描码调用不同处理函数key_table()来处理各个按键
      ... 
      push $0 
      call _do_tty_interrupt
      
      • key_table是一个函数数组,在其中调用do_self()函数处理显示字符,其他特殊按键由func 等其他函数来处理;
    • do_self函数

      • 从键盘对应的ASCII码表(key_map中以当前案件的扫描码为索引找到当前案件的ASCII码);
      • 找到 tty 结构体中的 read_q 队列,键盘和显示器使用同一个 tty 结构体 tty_table[0],只是键盘使用的读队列,而显示器使用的写队列;
      • 将 ASCII 码放到缓冲队列 read_q 中;
    • 字符回显,先调用 do_tty_interrupt 返回文件视图(与显示器输出中将字符先放在缓冲队列 write_q 中再显示到屏幕上同理)

      void do_tty_interrupt(int tty) {copy_to_cooked(tty_table + tty);
      }
      void copy_to_cooked(struct tty_struct *tty) {GETCH(tty->read_q, c);PUTCH(c, tty->secondary);...wake_up(...);
      }
      
    • copy_to_cookedread_q中取出字符并放在tty->secondary队列中,唤醒等待在该队列中的进程;

    • 对于键盘,用户发起的文件操作是scanfscanf调用sys_read,根据printf类似的分支,最终调用tty_read

    • tty_read:一旦tty->secondary有内容了,scanf会将队列中的字符诸葛取出来并复制到用户内存,从设备开始的路线最后回到了文件操作scanf;

  • 键盘操作的完整文件视图:

    • keyboard_interrupt -> inb 0x60, al -> do_self -> read_q -> copy_to_cooked -> secondary -> wake_up -> tty_read -> rw_char ->sys_read ->read ->scanf

实践项目7

终端设备字符显示的控制


http://chatgpt.dhexx.cn/article/wJgdxwa3.shtml

相关文章

设备驱动简介

设备驱动 一、设备驱动程序简介二、设备的分类和特点1.字符设备2.块设备3.网络设备 一、设备驱动程序简介 系统调用是操作系统内核和应用程序之间的接口&#xff0c; 设备驱动程序是操作系统内核和机器硬件之间的接口。 设备驱动程序为应用程序屏蔽了硬件的细节&#xff0c;这…

Windows设备与驱动器管理

在安装一些软件的时候经常会在“我的电脑-设备与驱动器”下面多几个图标&#xff0c;那么这些图标是怎么添加上去&#xff1f;要怎么删除掉呢&#xff1f; 只需要知道关联的注册表项&#xff0c;就可以轻松的添加、删除、修改了&#xff1a; 1、设备与驱动器标记注册表项 HKE…

linux 没有可用软件包 pstree

yum provides反查询文件在什么包中 通过 yum provides pstree yum install psmisc

top,ps,pstree工具介绍及举例

top 工具是我们常用的一个查看工具&#xff0c;能实时的查看我们系统的一些关键信息的变化: toptop 是一个在前台执行的程序&#xff0c;所以执行后便进入到这样的一个交互界面&#xff0c;正是因为交互界面我们才可以实时的获取到系统与进程的信息。在交互界面中我们可以通过…

模仿pstree 打印进程树

一个查看进程树的小栗子 可以打印进程数&#xff0c;并且可以加参数 -n 显示pid&#xff0c;加参数-p 显示线程信息 ( 和pstree 的参数并不一样) 准备工作 step 1 处理进程信息 想办法找到所有当前进程 在Linux下 proc 文件系统 (procfs) 是类 Unix 操作系统中的一种特殊文件系…

pstree 详解

pstree命令是用于查看进程树之间的关系&#xff0c;即哪个进程是父进程&#xff0c;哪个是子进程&#xff0c;可以清楚的看出来是谁创建了谁 #pstree 几个重要的参数&#xff1a; -A: 各进程树之间的连接以ASCII码字符来连接 -U:各进程树之间的连接以utf8字符来连接&#xff0c…

Centos安装pstree

说明 以树状图的方式展现进程之间的派生关系 补充说明 pstree命令 以树状图的方式展现进程之间的派生关系&#xff0c;显示效果比较直观。 语法 pstree(选项) 选项 -a&#xff1a;显示每个程序的完整指令&#xff0c;包含路径&#xff0c;参数或是常驻服务的标示&#x…

Linux命令之树状图显示所有进程pstree

概述 pstree 命令会将所有进程以树状图形式显示&#xff0c;方便查看进程之间的父子关系。pstree 是 display a tree of process 的缩写。 树状图将会以 pid (如果有指定) 或是以 init 这个基本进程为根 (root)&#xff0c;如果有指定使用者 id&#xff0c;则树状图会只显示该…

Linux基础命令-pstree树状显示进程信息

Linux基础命令-uname显示系统内核信息 Linux基础命令-lsof查看进程打开的文件 Linux基础命令-uptime查看系统负载 文章目录 前言 一 命令介绍 二 语法及参数 2.1 使用man查看命令语法 2.2 常用参数 三 参考实例 3.1 以树状图的形式显示所有进程 3.2 以树状图显示进程号…

学习一个 Linux 命令:pstree

linux在工作中用的越来越多&#xff0c;接下来为大家介绍一下比较常用的命令pstree的使用方法 命令简介 pstree 命令以树状图的方式展现进程之间的派生关系。 [rootcentos7 ~]# pstree -bash: pstree: command not found [rootcentos7 ~]# yum install psmisc -y 语法格式 …

android系统apk文件,如何安装apk文件 安卓手机apk文件安装方法

我们知道安卓手机软件程序均为APK格式文件&#xff0c;很多小白朋友对于安卓手机如何安装apk文件不是很了解&#xff0c;下面本文于大家简单介绍下。由于很多朋友使用一些手机应用软件里面下载安装程序&#xff0c;但那仅仅是针对Wifi用户很方便&#xff0c;而没有Wifi用户因流…

Android下载安装Apk

1.自定义监听类&#xff0c;用来返回下载结果 interface DownLoadListener {/*** 下载成功之后的文件*/fun onDownloadSuccess(file: File)/*** 下载进度*/fun onDownloading(progress: Int)/*** 下载异常信息*/fun onDownloadFailed(e:Exception) }进行文件下载 /*** param …

在Win 11上安装APK

听说在Win11上支持直接安装apk了&#xff0c;所以先把系统升级到了Win11。 1、 安装WSA 因为安装的不是开发版&#xff0c;所以需要下载完整的WSA&#xff08;安卓子系统)&#xff0c;下载操作如下&#xff1a; 首先进入网站 https://store.rg-adguard.net&#xff0c;分别选…

google Play安装APK软件

一、参考资料 此 Google 帐号尚未与设备关联。要安装应用&#xff0c;请先访问设备上的 Play 商店应用 二、相关介绍 利用现有网站平台生成新的Google Play下载APK链接&#xff0c;APK下载器允许APK文件从Google Play直接下载到电脑或移动设备。 三、准备工作 在 Google P…

android怎么安装apk文件,apk文件怎么安装?如何安装apk文件

可能很多已经入手或者将要入手的机友,对Android系统软件如何安装和卸载比较模糊,我们有必要对之有一个系统的了解和认知,这样我们才能更容易上手,熟悉了解这个系统的使用。 一、从手机直接安装 1、将APK 文件拷贝入手机的存储卡,在手机上运行安装好的APK 程序安装器,找到…

cmd 安装 apk

➥ 检查 adb, 如果不是下面 的页面说明&#xff1b;要么配置下 环境变量&#xff1b;要么在 adb.exe 文件夹中执行 adb &#xff1b;如果你没有 去你 Android SDK 地址拿一个也行 ➥ 直接跑命令 adb install D:\MineGit\flutter_spawn\sdk\demo_2201.apk 如果你电脑 有…

androidP: apk安装流程

一、Android应用安装有如下四种方式 1 系统应用安装――开机时完成&#xff0c;没有安装界面 2.网络下载应用安装――通过market应用完成&#xff0c;没有安装界面 3.ADB工具安装――没有安装界面。 4. 第三方应用安装――通过SD卡里的APK文件安装&#xff0c;有安装界面&#…

APK安装流程及详细步骤

往期推荐 APK打包流程 APK文件结构 Android开发之数据储存 1.1 安装方式 1.安装APK文件共有4种方式&#xff1a; &#xff08;1&#xff09;系统程序安装 &#xff08;2&#xff09;通过Android市场安装 &#xff08;3&#xff09;手机自带安装 &#xff08;4&#xff09…

2021年宏观经济十大趋势展望

新冠肺炎疫情无疑是一只黑天鹅&#xff0c;对2020年世界经济带来了巨大的冲击。临近年末&#xff0c;可以从很多角度回顾2020年中国宏观经济。如果从内外循环的角度概括一下&#xff0c;我们认为今年中国经济有两个“超预期”&#xff1a;外贸超预期&#xff0c;外资超预期。 …

2010-2020年农业农村重要经济指标

数据集名称&#xff1a;农业农村重要经济指标 时间范围&#xff1a;2010-2020年 数据来源&#xff1a;农业农村部 相关说明&#xff1a; 农业农村重要经济指标&#xff0c;覆盖6大类别&#xff0c;170多张统计表 全球及主要国家大豆产量(万吨)&#xff08;2015-2019&#…