使用call 指令在不同的特权级代码间切换时,对应的堆栈也要进行切换。这是保护机制的一项内容。由于堆栈发生了变换,原来堆栈中用于恢复环境的压栈内容(ss/esp/cs/eip/参数等)就必须同时拷贝到目标堆栈中,否则从目标堆栈中返回时就会失去入口造成程序崩溃。(我个人认为只要将ss/esp压栈就可以了,其余内容可以在堆栈复原后从原来堆栈中找到。)这个内容很好理解。那么,不同的堆栈,肯定有一个数据结构保存着他们的信息列表。...
by xiaobao_linux - Linux文档专区 - 2009-11-30 22:54:54 阅读(1319) 回复(0)
1。能进入PM, 2。能产生中断输出 3。问题出在jmpi tts上...跳不过去啊。头大大大,去掉jmpi 0,0x18,是可以正常运行的) 4。内存: _________________________________ |Base |Locat | ---------------------------------------------------- |0 |sec2的代码,做为一个“小内核" | _________________________________ |1k |GDT ...
用 nasm编译通过,虚拟机运行出错,我看我的代码和别人的视乎没差别,我查了许久了,都不知哪里错 代码大意是 直接通过 tss选择子进行任务切换,,,jmp tss_sel:0 代码如下: %macro descriptor 3 dw %2 & 0ffffh dw %1 & 0ffffh db (%1>>16) & 0ffh dw ((%2>> & 0f00h) | (%3 & 0f0ffh) db (%1>>24) & 0ffh %endmacro org 0100h jmp start ;********************************************** [section .gdt] gdtstart: desc...
本帖最后由 386asm 于 2013-07-22 01:08 编辑 用 nasm编译通过,虚拟机运行出错,我看我的代码和别人的视乎没差别,我查了许久了,都不知哪里错 代码大意是 直接通过 tss选择子进行任务切换,,,jmp tss_sel:0 代码如下: %macro descriptor 3 dw %2 & 0ffffh dw %1 & 0ffffh db (%1>>16) & 0ffh dw ((%2>>8) & 0f00h) | (%3 & 0f0ffh) db (%1>>24) & 0ffh %endmacro org 0100h jmp start ;***********************...
linux的实现为单核系统只用一个tss,这个tss存储当前进程的内核堆栈地址等。 但在多核系统中,每个CPU仍然使用各自的tss 那为什么每个cpu都有各自的tss呢,都用同一个不行吗?
在intel手册-卷3里面看到,tss只能在GDT中定义,不能在LDT和IDT中定义,并且对于 tss.esp0, tss.ss0, tss.ss1, tss.esp1, tss.ss2, tss.esp2 在初始化设置了之后就不能(由CPU)动态更改。那就意味着所有的任务都共用一个tss。那我就有个疑问: 假设: A1(ring0),A2(ring0) B1(ring1),B2(ring1) C1(ring2),C2(ring2) D1(ring3),D2(ring3) tss的栈指针: tss.esp0/ss0: stack0 tss.esp1/ss1: stack1 tss.es...
linux软中断 在由内核执行的几个任务之间有些不是紧急的,在必要情况下他们可以延迟一段时间。一个中断处理程序的几个中断服务例程之间是串行执行的,并且通常在一个中断的处理程序结束前,不应该再次出现这个中断。相反,可延迟中断可以在开中断的情况下执行。 linux中所谓的可延迟函数,包括软中断和tasklet以及通过中作队列执行的函数(这个以后说),软中断的分配是静态的(即值编译时定义),而tasklet的分配和初始...
中断服务程序往往都是在CPU关中断的条件下执行的,以避免中断嵌套而使控制复杂化。但是CPU关中断的时间不能太长,否则容易丢失中断信号。为此, linux将中断服务程序一分为二,各称作“Top Half”和“Bottom Half”。前者通常对时间要求较为严格,必须在中断请求发生后立即或至少在一定的时间限制内完成。因此为了保证这种处理能原子地完成,Top Half通常是在CPU关中断的条件下执行的。具体地说,Top Half的范围包括:从在IDT中登记...
[color="#295200"]linux磁盘阵列 1. RAID 简介 RAID是英文Redundant Array of Inexpensive Disks的缩写,中文名字为磁盘冗余阵列,顾名思义它是由磁盘组成阵列而成的。 简单地说,RAID就是一种把多块独立的硬盘(物理硬盘)按不同方式组合起来的一个硬盘组(逻辑硬盘),提供比单个硬盘更高的存储性能和数据冗余的技术,既保证了存取数据的快捷方便和管理客户端的简捷,也解决了存储海量数据的问题,同时提供了容错性(Fault ...
softirq,tasklet和下半部是linux做延迟函数的三种实现形式,各有所长。 softirq 在系统中的调用点仅是在 ISR 返回时和 使用了 local_bh_enable() 函数后被调用了。 linux kernel source 2.6.19.1 /kernel/softirq.c // // do_IRQ 函数执行完硬件 ISR 后退出时调用此函数。 // void irq_exit(void) { account_system_vtime(current); trace_hardirq_exit(); sub_preempt_count(IRQ_EXIT_OFFSET); // // 判断当前是否有硬件中断嵌...