首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

深入分析Linux内核源代码阅读笔记 第三章

外部中断(或硬件中断) 内部中断(或叫异常) 本章主要讨论在 Intel i386 保护模式下中断机制在 Linux 中的实现。...128 用来实现系统调用。 外设可屏蔽中断: Intel x86 通过两片中断控制器 8259A 来响应 15 个外中断源。...IDT 表项的设置是通过_set_gate()函数实现的: set_intr_gate set_trap_gate set_system_gate 对陷阱门和系统门的初始化: trap_init...处理请求分页 内核对异常处理程序的调用有一个标准的结构,它由以下 3 部分组成: 在内核栈中保存大多数寄存器的内容(由汇编语言实现); 调用 C 编写的异常处理函数; 通过 ret_from_exception...分两步进行有效性检查: “段”级检查 “门”级检查 检查是否发生了特权级的变化 Linux 对中断的处理: Linux 把一个中断要执行的操作分为下面的 3 类: 紧急的(Critical)

1.3K40

操作系统生磁盘的使用---18

(nsect,++port); //哪个扇区 outb_p(sect,++port); //哪个柱面 outb_p(cyl,++port); outb_port(cyl>>8,++port); //哪个磁头...outb_p(0xA0|(drive<<4)|head, ++port); outb_p(cmd, ++port); } 实际代码书写就是找到磁盘控制器对应的端口位置,然后将要操作的柱面,磁头,扇区位置...void make_request(){ struct requset *req; req=request+NR_REQUEST; //根据盘块号计算出扇区号---从b_blocknr<<1可以知道Linux...0.11中盘块号和扇区的映射关系 //0---->0 //1----->2 //2----->4 //可以看到在linux 0.11中一个盘块对应两个连续的扇区 req->sector=bh->b_blocknr...会再去请求队列中获取对应的磁盘读取请求继续处理,处理完后,再发出中断通知操作系统,然后继续从请求队列中获取相关磁盘读写请求… ---- FCFS磁盘调度算法 如果是按照先进先出的方式对磁盘读取请求进行处理,那么从上图看来可以知道,该方法实现最大的问题在于磁头的来回移动

90610
您找到你想要的搜索结果了吗?
是的
没有找到

Linux 内核0.11 系统调用详解(上)

https://blog.csdn.net/u014688145/article/details/50608829 备注:本文通过三个问题,引出Linux 内核0.11的系统调用。...我把它总结为两点: 底层封装繁杂的硬件操作始终需要有人完成,遵循软件设计的原则,我们不能向用户层暴露太多的底层实现细节,否则会加大应用层编写的复杂性。...好了,系统调用既然非存在不可,那接下来,我们就探究下,它具体是怎么实现的呢?请看下个问题。o(∩_∩)o 操作系统如何做到用户态数据与核心态数据隔离? 请看此图: ?...Linux内核通过建立段级保护机制来完成上述区分核心与用户态区域的功能。好,请看下图: ?...outb(LATCH >> 8 , 0x40); /* MSB */ set_intr_gate(0x20,&timer_interrupt); outb(inb_p

1.6K31

操作系统内核中的初始化工作

看完了进入内核前的工作后,我网络编程课的抄写作业自然是可以圆满完成啦,不过看了一部分后觉得确实很有意思,所以也是决定继续看下去,并且计划看完linux源码后跟着MIT6.s081写一个小的操作系统内核,...诶这个时候我们是不是又会想起来在进入Linux内核前的准备一文中提到过的INT指令,例如INT 0x80这个指令就是相当于直接告诉CPU中断号0x80。...而至于这个_set_gate()函数,这是使用的内联汇编实现的,简单来说它实现了在中断描述符表表IDT中插入中断描述符的效果。...我们初始化光标的位置后,能够用x,y,pos对光标位置进行描述,之后就可以根据一些基本的计算,来实现比如说回车、换行、删除、滚屏、清屏这样的基本操作,这些基本操作都在console.c这个文件中实现了,...这里就不再细说,顺带粗略看一下实现了哪些方法。

71830

linux0.11的时间管理和定时器原理

linux初始化的时候,初始化了定时相关的代码。.... // 43是控制字端口,0x36=0x00110110,即二进制,方式3,先读写低8位再读写高8位,选择计算器0 outb_p(0x36,0x43); /* binary, mode 3, LSB...*/ outb_p(LATCH & 0xff , 0x40); /* LSB */ // 再写8位 outb(LATCH >> 8 , 0x40); /* MSB */ // 设置定时中断处理函数...,所以是通过置换位置实现插入, 如果是链表,则直接找到合适的位置,插入即可,所谓合适的位置, 就是找到第一个比当前节点大的节点,插入到他前面。...*/ p = p->next; } /* 内核这里实现有个bug,当当前节点是最小时,需要更新原链表中第一个节点的值,, 否则会导致原链表中第一个节点的过期时间延长,修复代码如下

88920

嵌入式Linux系统是如何管理IO端口以及IO内存的呢?老司机给你讲讲

1、统一编址 RISC指令系统的CPU(如,PowerPC、m68k、ARM等)通常只实现一个物理地址空间(RAM)。...2、独立编址 而另外一些体系结构的CPU(典型地如X86)则为外设专门实现了一个单独地地址空间,称为“I/O地址空间”或者“I/O端口空间”。...outb( )、outw( )、outl( ) 分别向一个I/O端口写入1、2或4个连续字节。...“ 六、Linux下访问IO内存请输入标题 IO内存的访问方法是:首先调用request_mem_region()申请资源,接着将寄存器地址通过ioremap()映射到内核空间的虚拟地址,之后就可以Linux...最后来看一下ioread8的源码,其实现也就是对虚拟地址进行了判断,以区分IO端口和IO内存,然后分别使用inb/outb和readb/writeb来读写。 ?

1.9K21

S7-200smart阀门控制库的开发

需求分析 工艺控制 可以联锁的投入/切除 可以手动开关阀门 可以实现自动状况下的联动控制 安全保护 可以设定阀门开关报警的延时时间 可以实现阀门报警复位 功能 联锁控制功能 单独开关功能 报警及复位工...功能实现 数字量阀门控制 系统点表 地址符号变里类型 数据类型1 ENIN800L2LO.0联锁投切INBOOL3L0.1手动开阀INB00L4L0.2手动关阀IN80OL5L0.3故障复位INB00L6L0.4...联锁开阀INB0OL7L0.5开反馈INB0OL8L0.6关反馈INB0OL9Lw1开延时设定ININT10Lw3关延时设定ININT11LD5参数INDINT12L9.0开输出IN_OUTB0OL13L9.1...关输出IN_OUTB00L14L9.2报警IN_OUTB0OL 地址符号变里类型教据类型注释 1 ENINB0OL 2L0.0联锁投切INBOOL0年动,1自动3L0.1故障复位INBOOL

1.8K30

Linux 实现群聊功能

今天的主题是在 Linux实现一个群聊功能,支持群聊,指定人私聊,群主禁言,踢出群聊的功能,实际上要实现这个功能,如果你阅读过我前两天我写一篇 Linux原始系统api实现两个终端实时聊天 ,那么,...在以上的基础上其实就是追加一下 两个功能即可,及群主禁言,和将谁踢出群聊的功能,因为群聊的基本功能我们实现了,而且私信的逻辑我们也实现了,ps,文本的代码在此。...A 向服务端发送一条消息服务端收到 A 的消息之后,将这条消息转发给到了所有的人,当然除了 A,这里的代码逻辑一撇如下,全部详细的代码就需要参考 Linux原始系统api实现两个终端实时聊天 这里了...buffer, strlen(buffer), 0); } }}私信的效果是:A 发送一条给到 B 的私信,只有 B 可以收到,C 是收不到的只有 B 收到的截图C 是收不到的继续实现禁言某人和踢出用户的功能要实现禁言的功能...2.实现踢出的逻辑这里的实现方式和实现屏蔽略微不同,而且还稍显简单,直接干掉 server 和 client 的连接即可,实现的方式如下:else if (strncmp(s, "/kick ", 6)

55850
领券