课堂练习6.2:对字符设备的访问

这篇具有很好参考价值的文章主要介绍了课堂练习6.2:对字符设备的访问。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

先了解一下访问字符设备(这里指读键盘)的一般过程

课堂练习6.2:对字符设备的访问 

sys_read调用tty_read函数,如果tty_table[0].secondary为空就一直睡眠。keyboard_interrupt函数执行时,先将数据从键盘拷贝到tty_table[0].read_q中,然后调用do_tty_interrupt函数将tty_table[0].read_q中的未读数据拷贝到tty_table[0].secondary,一旦tty_table[0].secondary中有数据了,就调用wake_up唤醒进程,继续执行tty_read函数,将tty_table[0].secondary中的数据读到buf中。

将数据拷贝到队列和从队列中读取数据的过程:

由头指针head和尾指针tail管理,队列为空时head和tail为0,每拷进一个字符,头指针head,每读取一个字符,尾指针tail加1加1,所以队列中的未读字符串就是queue[tail:head+1]。另外要注意到队列尾部要回绕到首部。

第一关 键盘的读取过程分析

第一问 函数 sys_read 的参数中记录的用户缓冲区地址(段内偏移)是多少?

直接在sys_read处设置断点查看buf即可

注意文件描述符fd值为0,表示sys_read函数在读0号终端这个文件

课堂练习6.2:对字符设备的访问

第二问 函数 tty_read 开始运行时,0 号终端的 read_q 队列的头指针(数组下标)和尾指针分别是多少?

继续在tty_read处设置断点,查看tty_table[0].read_q即可

课堂练习6.2:对字符设备的访问

第三问 键盘中断处理程序开始运行时,0 号终端的 read_q 队列的头指针和尾指针分别是多少? 

键盘中断处理程序就是keyboard_interrupt函数,反汇编,继续在入口地址稍后一点设置断点跳转(注意不能直接在入口处设置),这是需要在键盘输入,本关要求敲入回车,所以切换到boch虚拟机按enter键即可。然后查看tty_table[0].read_q。此时头尾指针都还未变化

课堂练习6.2:对字符设备的访问

第四问 函数 do_tty_interrupt 开始运行时,0 号终端的 read_q 队列的头指针和尾指针分别是多少?该队列中的未读取字符串是什么?0 号终端的 secondary 队列的头指针和尾指针分别是多少?

继续在do_tty_interrupt处设置断点,查看tty_table[0].read_q和tty_table[0].secondary。此时已经将数据从键盘拷贝到tty_table[0].read_q中,所以read_q的头指针加1(表示读入1个字符)。未读字符串是read_q[0] = "\r"

课堂练习6.2:对字符设备的访问

第五问 函数 wake_up 开始运行时,0 号终端的 read_q 队列的头指针和尾指针分别是多少?0 号终端的 secondary 队列的头指针和尾指针分别是多少?该队列中的未读取字符串是什么? 

继续在wake_up处设置断点,查看tty_table[0].read_q和tty_table[0].secondary。此时do_tty_interrupt函数已经将tty_table[0].read_q中的未读数据拷贝到tty_table[0].secondary,所以read_q尾指针加1(表示已被读走一个字符),secondary头指针加1(表示读入一个字符)。维度字符串就是secondary[0] = "\n"

课堂练习6.2:对字符设备的访问

第六问 函数 tty_read 结束时,0 号终端的 secondary 队列的头指针和尾指针分别是多少?用户缓冲区的头 2 个字节是什么?

继续在tty_read函数结束处设置断点(288行),查看tty_table[0].secondary。此时tail加1(表示一个字符被读走并放入了sys_read的参数buf中)

课堂练习6.2:对字符设备的访问

然后查看用户缓冲区的前两个字节 

课堂练习6.2:对字符设备的访问

 结果

课堂练习6.2:对字符设备的访问

第二关 从键盘的一行数据中读取一个字符

原理和操作都和第一关类似,在此仅给出操作序列和解释

(gdb)b sys_read                 
(gdb)c                          //确定读的是0号终端
(gdb)b tty_read
(gdb)c                          
(gdb)p tty_table[0].read_q      //获取第一问答案
(gdb)b do_tty_interrupt
(gdb)c
在bochs虚拟机输入abc然后回车
(gdb)p tty_table[0].read_q
(gdb)p tty_table[0].secondary   //获取第二问答案
(gdb)b wake_up
(gdb)c
(gdb)p tty_table[0].read_q
(gdb)p tty_table[0].secondary   //获取第三问答案
(gdb)c
(gdb)c
(gdb)c                          //跳到第三次运行do_tty_interrupt
(gdb)p tty_table[0].read_q
(gdb)p tty_table[0].secondary   //获取第四问答案
(gdb)c                          //第三次运行wake_up
(gdb)p tty_table[0].read_q
(gdb)p tty_table[0].secondary   //获取第五问答案
(gdb)c
(gdb)c
(gdb)c
(gdb)c
(gdb)c
(gdb)c
(gdb)c                          //跳到第七次运行do_tty_interrupt
(gdb)p tty_table[0].read_q
(gdb)p tty_table[0].secondary   //获取第六问答案
(gdb)c                          //第七次运行wake_up
(gdb)p tty_table[0].read_q
(gdb)p tty_table[0].secondary   //获取第七问答案
(gdb)p tty_table[0].secondary.data
(gdb)b tty_io.c:288             
(gdb)c
(gdb)p tty_table[0].secondary
(gdb)p current->start_code + buf 
(gdb)x/2bx 0x40254fb                //获取第八问答案
(gdb)quit

注意:在bochs虚拟机输入一个字符时就会自动跳回gdb,并且输入字符不会显示,但按要求输入abc回车就行了

结果

课堂练习6.2:对字符设备的访问

第三关 观察从键盘输入的口令

第一问 程序 passwd 会在几号进程中执行?

在do_execve处设置断点,一直continue,直到需要我们从键盘输入,此时输入passwd,以执行这个文件

课堂练习6.2:对字符设备的访问

第二问 上述进程第一次开始执行函数 tty_read 时,0 号终端的 secondary 队列的头指针和尾指针分别是多少?该队列的 buf 数组中记录的字符串是什么? 

在tty_read处设置断点跳转,查看tty_table[0].secondary即可

课堂练习6.2:对字符设备的访问

第三问 上述进程第一次执行完函数 tty_read 时,0 号终端的 secondary 队列的头指针和尾指针分别是多少?该队列的 buf 数组中记录的字符串是什么? 

在tty_read结尾处设置断点跳转,此时在虚拟机内输入密码secret回车(注意密码不会显示出来)。查看tty_table[0].secondary即可

课堂练习6.2:对字符设备的访问

结果

课堂练习6.2:对字符设备的访问文章来源地址https://www.toymoban.com/news/detail-482989.html

到了这里,关于课堂练习6.2:对字符设备的访问的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 雨课堂 文件和磁盘练习(1)

    若某文件系统索引结点( inode)中有直接地址项和间接地址项,与单个文件长度有关的因素是:间接地址索引的级数、地址项的个数、文件块大,与单个文件长度无关的因素是:索引结点的总数 相关解释:如果系统中有1000个 索引结点,说明有1000个物理文件而已,跟单个文件长度

    2024年02月10日
    浏览(30)
  • 课堂练习4.2:页式内存管理

    第1关:1 号进程的 mynext 变量的物理地址 本关任务: 1. 1 号进程第 1 次调用函数 output_char 时,它的 mynext 变量的物理地址是多少? 2. 1 号进程第 2 次调用函数 output_char 时,它的 mynext 变量的物理地址是多少? 首先,在gdb模式下找出它的线性地址(由于第1次和第2次操作大致相同

    2024年02月05日
    浏览(30)
  • 国网技术学院MySQL课堂练习

    在虚拟机中安装WINDOWS7操作系统 正常安装,查询安装教程即可 安装必备组件和MYSQL5.7数据库 正常安装,查询安装教程即可 修改my.ini配置文件中关于character_set的相关设置 直接补下面的代码即可,作用为设置默认的内部操作字符集 通过操作系统服务界面停止和启动服务,通过

    2024年02月13日
    浏览(37)
  • 头歌课堂练习5:进程的同步与互斥

    *tidp 是 pthread_t 类型,也就是指向线程标识符的指针 通俗来讲,要开一个新线程, 那么就得新定义一个 pthread_t 类型的指针。 *arrt 是 pthread_arrt_t 类型 说的是用来设置线程属性,我还没怎么接触这个 一般用NULL *strat_rtn 是这里 (void*)(*hh)(void*) 类型 是线程运行函数的起始地址

    2024年02月04日
    浏览(177)
  • OS实验2-5 课堂练习2.3:系统调用

    本关任务: 解题过程: 1.跟踪到系统调用发生 系统调用的总控函数是 system_call ,只要在这里设断点,即可捕获系统调用的发生 2.查找系统调用的编号与名字 系统调用发生时系统调用号存放在寄存器 eax 中,编号与名字对应关系可在文件unistd.h中查到 在地址 0x7780 这里会调用

    2024年02月08日
    浏览(30)
  • 头歌操作系统 课堂练习3.2:进程的创建

    本实训需要设置内核版本 1 为调试分析的对象,用 gdb 调试内核,内核版本 1 的压缩文件存放在 /data/workspace/myshixun/exp1 中。 环境配置详情请移步前几关~头歌操作系统 课后作业3.1:进程的描述与状态 编程要求 根据相关知识,回答问题: (将答案填写在 /data/workspace/myshixun/第

    2024年02月04日
    浏览(55)
  • 头歌操作系统-课堂练习3.2:进程的创建

    第1关:进程创建前后TR寄存器值的分析 编程要求 根据相关知识,回答问题: (将答案填写在 /data/workspace/myshixun/第一关.txt 中) 0 号进程的 fork 系统调用(main.c:147)中的陷入指令的地址是多少? 0 号进程执行 fork 系统调用之前,TR 寄存器的值为多少? 0 号进程刚执行完 for

    2023年04月26日
    浏览(53)
  • 头歌操作系统2023春季课堂练习1:环境体验

    任务描述 欢迎进行 Linux 世界,当你下载、安装了某个 Linux 发行版,体验了 Linux 桌面并安装了一些你喜爱和需要的软件之后,应该去了解下 Linux 真正的魅力所在:命令行。 每一个 Linux 命令其实就是一个程序,借助这些命令,我们可以办到非常多的事情。 第一个任务就是了

    2024年02月08日
    浏览(75)
  • 编程杂谈|十余年后再做课堂练习题

    近日偶然在一论坛网站上看到一道问答题目 “使用三种不同的实现,完成 1+2+..+100 的编程”。 让人回忆起,好似这是初学编程时课堂留下的练习题目。算算如今离开课堂已是十余年了,一时兴趣不妨再来做一做这道题。 没记错的话,这道题在学习完基础循环语法后所布置的

    2024年01月23日
    浏览(40)
  • 头歌操作系统 课堂练习2.1 外部中断 答案

    第一关:时钟中断的发生 作答要求: 根据相关知识进行实际操作,一直输入 c 直到 0/1 将第一行完全填满。回答问题:当第一行 0/1 字符全部输出完毕的时候一共发生了几次时钟中断,即第一行完全填满时 jiffies 记录的已发生次数为多少? 一、设置版本1内核为分析对象 首先

    2024年02月12日
    浏览(119)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包