免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5601 | 回复: 12
打印 上一主题 下一主题

如何用TSS进行任务切换?我切换不成功:((内有汇编代码/as86) [复制链接]

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-08-28 09:45 |只看该作者 |倒序浏览
1。能进入PM,
2。能产生中断输出
3。问题出在jmpi tts上...跳不过去啊。头大大大,去掉jmpi 0,0x18,是可以正常运行的)
4。内存:
_________________________________
|Base |Locat                                             |
----------------------------------------------------
|0       |sec2的代码,做为一个“小内核"          |
_________________________________
|1k     |GDT                                               |
----------------------------------------------------
|2k     |IDT,size=2k                                   |
----------------------------------------------------
|4k     |TSS_0                                           |
-----------------------------------------------------
|4k+128|LDT_0                                        |
----------------------------------------------------
|4k+512|Code                                         |
~~~~~~~~~~~~~~~~~~~~~~~~~~
      经验证,以上内存的映象是正确的,可以用sec2中的print_char代码段(少改一下就行),输出其内容来证明。
      问题了在jmpi 0,0x18(TSS_1的selector,见boot.asm),也就是切换进程上的操作上。
我瞪大眼睛,看intel的manaul,看linus的开机大作,就是找不到什么地方有err.:*(

1.boot.asm/as86

  1. entry start
  2. .org 0x00
  3. Seg_Video_Buf        =0xb800
  4. Seg_Boot_Locat        =0x07c0
  5. Seg_GDT_Base        =1024
  6. Seg_Stack        =Seg_Boot_Locat+0x400
  7. start:
  8. ;Load sec2 to memory 0x00
  9. ;Read the sector 2 to the 0x0100:0000
  10.         mov ax,#(0x01<<12-512)>>4
  11.         mov es,ax
  12.         mov dx,#0x0000        ;hy=0,disc=0
  13.         mov cx,#0x0002        ;from 2sec
  14.         mov bx,#0x0000        ;base=0
  15.         mov ax,#0x0203        ;Read 3secs(2,3,4)
  16.         int 0x13

  17. ;mov sector 2 to 0x0000:0000
  18.         mov ax,#(0x01<<12-512)>>4
  19.         mov ds,ax
  20.         mov ax,#0x0000
  21.         mov es,ax
  22.         mov si,#0x0000
  23.         mov di,#0x0000
  24.         cld
  25.         mov cx,#512
  26.         rep
  27.         movsb

  28. ;move segement descript table to the momery base 1k
  29.         mov ax,#Seg_Boot_Locat
  30.         mov ds,ax
  31.         mov ax,#Seg_GDT_Base>>4
  32.         mov es,ax
  33.         mov si,#GDT
  34.         xor di,di
  35.         cld
  36.         mov cx,#(ENDS_GDT-GDT)
  37.         rep
  38.         movsb

  39. ;move to Prct_Mode:
  40. ;load gdt
  41.         mov ax,#Seg_Boot_Locat
  42.         mov ds,ax
  43.         cli
  44.         lgdt gdt_attr
  45. ;enable A20
  46.         mov ax,#0x0ff0
  47.         mov sp,#0xff00
  48.         call empty_8042
  49.         mov al,#0xd1
  50.         out #0x64,al
  51.         call empty_8042
  52.         mov al,#0xdf
  53.         out #0x60,al
  54.         call empty_8042
  55. ; start protect mode:
  56.         mov ax,#0x0001
  57.         lmsw ax
  58.         jmpi 0,8

  59. empty_8042:
  60.         .word 0x00eb,0x00eb
  61.         in al,#0x64
  62.         test al,#2
  63.         jnz empty_8042
  64.         ret

  65. .align 16
  66. gdt_attr:
  67.         .word 0x800
  68.         .word Seg_GDT_Base,0x00       
  69. .org 256
  70. .org 320
  71. GDT:
  72.          
  73.         .word 0,0,0,0        ;select=%000000

  74.         .word 0x01<<13-1;limit ,2^10*2^2*2^13=2^25=32M;select=%0,1000,0x08
  75.         .word 0x0000        ;base
  76.         .word 0x9a00        ;Code :exec/read
  77.         .word 0x00c0        ;G=4096,386

  78.         .word 0x01<<13-1;selector=%1,0000,0x10
  79.         .word 0x0000
  80.         .word 0x9200        ;data :read/write ,present dpl=0
  81.         .word 0x00c0
  82.        
  83.         .word 128-1        ;TSS1        ,selector 3(%01,1000,0x18)
  84.         .word 0x01<<12        ;base=4k
  85.         .word 0x8900        ;Tss ,not busy,present dpl=00
  86.         .word 0x0000        ;G=1byte,avilable=0
  87.        
  88.         .word 128-1        ;LDT1        ,selector 4(selector=4 %10,0000,0x20)
  89.         .word 0x01<<12+128        ;base=4k+128
  90.         .word 0x9200        ;data :read/write
  91.         .word 0x0040        ;G=1byte

  92.         .word 128-1        ;TSS2        ??use for the system,selector 5,selector=0x28
  93.         .word 0x01<<12+1024        ;base=5k
  94.         .word 0x8900
  95.         .word 0x0000

  96.         .word 0,0,0,0        ;LDT2
  97. ENDS_GDT:
  98. .org 510       
  99.         .word 0xaa55
复制代码

____________________________________________________________________________


2.sec2.asm/as86

  1. .text
  2. entry start
  3. IDT_Base=1024*2
  4. start:
  5. ;.org 0x00
  6.         mov ax,#0x10
  7.         mov ds,ax
  8.         mov ss,ax
  9.         mov ax,#0xff00
  10.         mov [0x000000],ax
  11.         cmp [0x100000],ax
  12. L6:        je L6

  13.         mov edi,#0x0b8000
  14.         mov esi,#msg
  15.         ;mov esi,#(0x01<<12+512)
  16.         mov ah,0x0c
  17.         mov ecx,#(msg_end-msg)
  18. print_str:
  19.         mov al,[esi]
  20.         mov [edi] ,ax
  21.         inc esi
  22.         inc edi
  23.         inc edi
  24.         loop print_str

  25.         lea edx,[intr_default]
  26.         mov eax,#0x00080000
  27.         mov ax,dx
  28.         mov dx,#0x8e00
  29.         mov  edi,#IDT_Base

  30.         mov ecx,#256
  31. rp_sidt:
  32.         mov [edi],eax
  33.         mov 4[edi],edx
  34.         add edi,#8
  35.         loop rp_sidt

  36.         mov edi,#(IDT_Base+8*8)
  37.         lea edx,[intr_svr]
  38.         mov eax,#0x00080000
  39.         mov ax,dx
  40.         mov dx,#0x8e00
  41.         mov [edi],eax
  42.         mov 4[edi],edx

  43.         ;mov edi,#(IDT_Base+8*1)
  44.         ;mov [edi],eax
  45.         ;mov 4[edi],edx

  46.         lidt [idt_attr]
  47. Set_up_Stack:
  48.         mov esp,#0x1000
  49.         mov ax,#0x10
  50.         mov ss,ax
  51.         mov bh,#0x0d
  52.         mov bl,#0x40
  53.         mov edi,#(0x0b8960+160)
  54.         mov dh,#0x00
  55.         sti
  56. ;Kill floppy monitor:
  57.         mov dx,#0x3f2
  58.         mov al,#0
  59.         outb
  60.         ;mov cl,#0
  61.         ;div cl

  62.         mov ax,#%0101000
  63.         ltr ax
  64. L_end:        jmp L_end

  65. .align 16
  66. intr_svr:
  67.         cli
  68.         inc dh
  69.         cmp dh,#0x48
  70.         jne rt_bl
  71.         mov dh,#0x00
  72.         inc bl
  73.         mov [edi],bx
  74.         add edi,#2
  75.         cmp edi,#(0xb8960+160+26)
  76.         jne L1
  77.         mov edi,#(0xb8960+160)
  78. L1:        cmp bl,#0x7f
  79.         jnz rt_bl
  80.         mov bl,#0x40
  81. rt_bl:
  82.         jmpi 0,0x18                 ;[color=red]不加上这句,也就是不跳到TSS,代码是没有问题的[/color]               
  83.         mov al,#0x20
  84.         out #0x20,al
  85.         sti
  86.         iretd

  87. .align 16
  88. intr_default:
  89.         cli
  90.         mov ax,#0x0b48
  91.         mov [0x0b8000+160],ax
  92.         mov al,#0x20
  93.         out #0x20,al
  94.         sti
  95.         iretd
  96. .align 16
  97. idt_attr:
  98.         .word 256*8-1
  99.         .long IDT_Base
  100. .org 480
  101. msg:
  102.         .ascii "Procted Mode"
  103. msg_end:

复制代码

____________________________________________________________________________
3.sec3_4.asm/as86


  1. entry start
  2. start:

  3. .org 0x00        ;the TSS_1        locat at 4K
  4.         .long 0x00000000        ;00-No previous Tss
  5.         .long 0x00000000        ;04-No ESP0
  6.         .long 0x00000000        ;08-No SS0
  7.         .long 0x00000000        ;0c-No ESP1
  8.         .long 0x00000000        ;10-No SS1
  9.         .long 0x00000000        ;14-No ESP2
  10.         .long 0x00000000        ;18-No SS2
  11.         .long 0x00000000        ;1c-No CR3
  12.         .long 0x00000000        ;20-EIP=0
  13.         .long 0x00000202        ;24-Eflag IF=1
  14.         .long 0x00000000        ;28-eax=0
  15.         .long 0x00000000        ;2c-ecx=0
  16.         .long 0x00000000        ;30-edx=0
  17.         .long 0x00000000        ;34-ebx=0
  18.         .long 0x00000000        ;38-ESP Not use
  19.         .long 0x00000000        ;3c-EBP=0
  20.         .long 0x00000000        ;40-esi=0
  21.         .long 0x00000000        ;44-edi=0
  22.         .long 0x00000000        ;48-es,not use
  23.         .long 0x00000004        ;4c-cs,item 0 selected,LDT used:(%0100B)
  24.         .long 0x00000000        ;50-ss,not defined(%010100)
  25.         .long 0x00000000        ;54-ds,not defined
  26.         .long 0x00000000        ;58-fs,not defined
  27.         .long 0x00000000        ;5c-gs,not defined
  28.         .long 0x00000020        ;60-ldt selecct from GDT item 4,TI=0:(10,0000B)
  29.         .long 0x00800000        ;64-no IO Map,No debug
  30. .org 128        ;start the ldt_1,Locat at 4K+128
  31.                 ;Code segment
  32.         .word 512-1                ;Limit                        selector=%0100
  33.         .word 0x01<<12+512        ;Base=4K+512
  34.         .word 0x9a00                ;Code read/executable
  35.         .word 0x0040                ;G=0        ,1byte
  36.                 ;Stack segment
  37.         .word 1024                ;limit                        selector=%1100
  38.         .word 0x01<<12+512        ;Base=4K+512
  39.         .word 0x9200                ;Data ,read/write
  40.         .word 0x0040                ;G=0        ,1byte
  41.        

  42. .org 512        ;start the code        ,Loacat at 4K+512
  43. Code_Start:
  44.         ;mov ax,#0x10                ;GDT,item 2
  45.         ;mov ds,ax
  46.         ;mov ax,#0x7a48
  47.         ;mov [0x0b8000+512],ax
  48. L_app:        jmp L_app
复制代码

_________________________________________________________________

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
2 [报告]
发表于 2007-08-28 11:20 |只看该作者
找到一个错误,已更正,但还是无法JMP TSS

sector 4不能直接将代码写在LDT_1后面

论坛徽章:
0
3 [报告]
发表于 2007-08-29 23:02 |只看该作者
能不能发个 Intel 格式的版本

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
4 [报告]
发表于 2007-08-29 23:14 |只看该作者
原帖由 mik 于 2007-8-29 23:02 发表
能不能发个 Intel 格式的版本


这个就是intel格式的。用的不是masm或tasm,因为我要用
.org 0x00
使代码定位到00
除了
as86              masm
------------------------
iretd              iret
jmpi               jmp

0xf123          0f123H
%0101          0101B
以外,其它的没有什么不同
at&t的指令是这样的格式
mov %eax,$0

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
5 [报告]
发表于 2007-08-29 23:19 |只看该作者
原帖由 folklore 于 2007-8-29 23:14 发表


这个就是intel格式的。用的不是masm或tasm,因为我要用
.org 0x00
使代码定位到00
除了
as86              masm
------------------------
iretd              iret
jmpi               jmp

0xf ...


再更正一个潜在的错误
            jmpi 0,0x18
改为:
            str ax
            cmp ax,#0x18
            jz no_switch
            jmpi 0,0x18
no_switch:
             ...;Code continue here

因为intel说,不能switch 到busy的TSS


其实只要看一下段的设置,tss的设置,就可以了。其它地方没什么错

论坛徽章:
0
6 [报告]
发表于 2007-08-29 23:28 |只看该作者
原帖由 folklore 于 2007-8-29 23:19 发表


再更正一个潜在的错误
            jmpi 0,0x18
改为:
            str ax
            cmp ax,#0x18
            jz no_switch
            jmpi 0,0x18
no_switch:
             ...;Code conti ...


关键是你这条: jmpi 0,0x18

对应 intel 格式为?

论坛徽章:
0
7 [报告]
发表于 2007-08-29 23:36 |只看该作者
0x18 是 TSS selector ?

那么,  selecotr_index 是 0x11,这当然是越界了(GDT)

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
8 [报告]
发表于 2007-08-29 23:53 |只看该作者
原帖由 mik 于 2007-8-29 23:36 发表
0x18 是 TSS selector ?

那么,  selecotr_index 是 0x11,这当然是越界了(GDT)


jmpi 0,0x18
相当于
jmp 018H:0H

不会吧
我可以在程序中设0x18为Code段,用
jmp 0,0x18跳到4k+512处的代码,并正常执行。这已经得到验证。


PS:我下载了VM并执行它,打开错误警告。它说
ss selector 有误
为什么。

感谢Mik,一路辛苦了。

论坛徽章:
0
9 [报告]
发表于 2007-08-29 23:56 |只看该作者
原帖由 folklore 于 2007-8-29 23:53 发表


jmpi 0,0x18
相当于
jmp 018H:0H

不会吧
我可以在程序中设0x18为Code段,用
jmp 0,0x18跳到4k+512处的代码,并正常执行。这已经得到验证。


PS:我下载了VM并执行它,打开错误警告。它说
ss  ...


晕,我搞错了,selector_index 是 3,改日再帮你好好看看。

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
10 [报告]
发表于 2007-08-29 23:58 |只看该作者
原帖由 mik 于 2007-8-29 23:56 发表


晕,我搞错了,selector_index 是 3,改日再帮你好好看看。


十分有劳了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP