当前位置:  技术问答>linux和unix

保护模式下写变量问题

    来源: 互联网  发布时间:2016-02-23

    本文导语:  现在在学习写内核  一写变量就出现内核错误呀   怎么搞的?  我把内核放到了0x80000处  链接内核用的是ld  -N   -s   --oformat   binary   -e   _start   -Ttext   0x80000  我知道这也许是保护模式下定位变量的...

现在在学习写内核 

一写变量就出现内核错误呀   怎么搞的? 
我把内核放到了0x80000处 
链接内核用的是ld 
-N   -s   --oformat   binary   -e   _start   -Ttext   0x80000 

我知道这也许是保护模式下定位变量的问题 
但我用的是C语言怎么会这样? 


kernel.asm 
[section   .text] 
[bits   32] 
global   _start 
extern   init 

_start: 
    mov   ax,cs 
    mov   ds,ax 
    mov   es,ax 
    mov   fs,ax     
    jmp   init 

init.c 
void   init() 

    qwe=1;        D:Progra~1Bochs-2.3.pre3bochsdbg.exe   -q   -f   bochsrc.bxrc 
00000000000i[APIC?]   local   apic   in     initializing 
======================================================================== 
                                            Bochs   x86   Emulator   2.3.pre3 
                              Build   from   CVS   snapshot   on   August   6,   2006 
======================================================================== 
00000000000i[           ]   reading   configuration   from   bochsrc.bxrc 
00000000000i[           ]   installing   win32   module   as   the   Bochs   GUI 
00000000000i[           ]   using   log   file   bochsout.txt 
Next   at   t=0 
(0)   [0xfffffff0]   f000:fff0   (unk.   ctxt):   jmp   far   f000:e05b                   ;   ea5be000f0 
   pb   0x80000 
   c 
(0)   Breakpoint   1,   0x00080000   in   ??   () 
Next   at   t=1796393 
(0)   [0x00080000]   0030:00080000   (unk.   ctxt):   mov   ax,   cs                                 ;   668cc8 
   s 
Next   at   t=1796394 
(0)   [0x00080003]   0030:00080003   (unk.   ctxt):   mov   ds,   ax                                 ;   8ed8 
 
Next   at   t=1796395 
(0)   [0x00080005]   0030:00080005   (unk.   ctxt):   mov   es,   ax                                 ;   8ec0 
 
Next   at   t=1796396 
(0)   [0x00080007]   0030:00080007   (unk.   ctxt):   mov   fs,   ax                                 ;   8ee0 
 
Next   at   t=1796397 
(0)   [0x00080009]   0030:00080009   (unk.   ctxt):   jmp   .+0x00000046   (0x00080054)   ;   e946000000 
 
Next   at   t=1796398 
(0)   [0x00080054]   0030:00080054   (unk.   ctxt):   push   ebp                                     ;   55 
 
Next   at   t=1796399 
(0)   [0x00080055]   0030:00080055   (unk.   ctxt):   mov   ebp,   esp                             ;   89e5 
 
Next   at   t=1796400 
(0)   [0x00080057]   0030:00080057   (unk.   ctxt):   sub   esp,   0x00000008               ;   83ec08 
 
Next   at   t=1796401 
(0)   [0x0008005a]   0030:0008005a   (unk.   ctxt):   mov   dword   ptr   ds:0x80080,   0x0000004e   ;   c705800008004e000000 
   print-stack 
Stack   address   size   4 
  ¦   STACK   0x000003f3   [0x00ff53f0] 
  ¦   STACK   0x000003f7   [0x00ff53f0] 
  ¦   STACK   0x000003fb   [0x00ff53f0] 
  ¦   STACK   0x000003ff   [0x0003f8f0] 
  ¦   STACK   0x00000403   [0x00000000] 
  ¦   STACK   0x00000407   [0x00037800] 
  ¦   STACK   0x0000040b   [0xc0000000] 
  ¦   STACK   0x0000040f   [0x0042279f] 
  ¦   STACK   0x00000413   [0x0000027f] 
  ¦   STACK   0x00000417   [0x1e000000] 
  ¦   STACK   0x0000041b   [0x00001e00] 
  ¦   STACK   0x0000041f   [0x00000000] 
  ¦   STACK   0x00000423   [0x00000000] 
  ¦   STACK   0x00000427   [0x00000000] 
  ¦   STACK   0x0000042b   [0x00000000] 
  ¦   STACK   0x0000042f   [0x00000000] 
   s 
Next   at   t=1796401 
(0)   [0x0008005a]   0030:8005a   (unk.   ctxt):   mov   dword   ptr   ds:0x80080,   0x0000004e   ;   c705800008004e000000 
   print-stack 
Stack   address   size   2 
  ¦   STACK   0x0000   [0xff53] 
  ¦   STACK   0x0002   [0xf000] 
  ¦   STACK   0x0004   [0xff53] 
  ¦   STACK   0x0006   [0xf000] 
  ¦   STACK   0x0008   [0xff53] 
  ¦   STACK   0x000a   [0xf000] 
  ¦   STACK   0x000c   [0xff53] 
  ¦   STACK   0x000e   [0xf000] 
  ¦   STACK   0x0010   [0xff53] 
  ¦   STACK   0x0012   [0xf000] 
  ¦   STACK   0x0014   [0xff53] 
  ¦   STACK   0x0016   [0xf000] 
  ¦   STACK   0x0018   [0xff53] 
  ¦   STACK   0x001a   [0xf000] 
  ¦   STACK   0x001c   [0xff53] 
  ¦   STACK   0x001e   [0xf000] 
 


这个是对kernel.bin反汇编后的文件: 


00000000     668CC8                         mov   ax,cs 
00000003     8ED8                             mov   ds,ax 
00000005     8EC0                             mov   es,ax 
00000007     8EE0                             mov   fs,ax 
00000009     E946000000                 jmp   0x54 

0000000E     90                                 nop 
0000000F     90                                 nop 

00000010     56                                 push   esi 
00000011     57                                 push   edi 
00000012     8B74240C                     mov   esi,[esp+0xc] 
00000016     8B3D80000800             mov   edi,[0x80080] 
0000001C     AC                                 lodsb 
0000001D     84C0                             test   al,al 
0000001F     742A                             jz   0x4b 
00000021     3C0A                             cmp   al,0xa 
00000023     7518                             jnz   0x3d 
00000025     50                                 push   eax 
00000026     53                                 push   ebx 
00000027     89F8                             mov   eax,edi 
00000029     B3A0                             mov   bl,0xa0 
0000002B     F6F3                             div   bl 
0000002D     25FF000000                 and   eax,0xff 
00000032     40                                 inc   eax 
00000033     B3A0                             mov   bl,0xa0 
00000035     F6E3                             mul   bl 
00000037     89C7                             mov   edi,eax 
00000039     5B                                 pop   ebx 
0000003A     58                                 pop   eax 
0000003B     EBDF                             jmp   short   0x1c 
0000003D     B40F                             mov   ah,0xf 
0000003F     65668907                     mov   [gs:edi],ax 
00000043     81C702000000             add   edi,0x2 
00000049     EBD1                             jmp   short   0x1c 
0000004B     893D80000800             mov   [0x80080],edi 
00000051     5F                                 pop   edi 
00000052     5E                                 pop   esi 
00000053     C3                                 ret 


00000054     55                                 push   ebp 
00000055     89E5                             mov   ebp,esp 
00000057     83EC08                         sub   esp,byte   +0x8 
0000005A     C705800008004E00     mov   dword   [0x80080],0x4e-0000 
00000064     83EC0C                         sub   esp,byte   +0xc 
00000067     6878000800                 push   dword   0x80078 
0000006C     E89FFFFFFF                 call   0x10 
00000071     83C410                         add   esp,byte   +0x10 
00000074     EBFE                             jmp   short   0x74 
00000076     90                                 nop 
00000077     90                                 nop 
00000078     4B                                 dec   ebx 
00000079     4B                                 dec   ebx 
0000007A     4B                                 dec   ebx 
0000007B     4B                                 dec   ebx 
0000007C     4B                                 dec   ebx 
0000007D     4B                                 dec   ebx 
0000007E     0A00                             or   al,[eax] 


qwe是我测试用的一个全局变量   定义在别的文件中   在init.c中已经extern了 

bochs调试那里   mov后堆栈变为2byte 

|
兄弟,你的实模式部分的代码呢???X86一启动是进入的实模式,转换到保护模式的代码呢?MMU那部分代码呢?
还有就是你对BSS段的赋初值相关的代码呢?栈指针指向的空间那段代码呢?

    
 
 

您可能感兴趣的文章:

  • 关于Linux下多线程情况下全局变量保护的问题,求个解决方案
  • IA32架构下,能从保护模式返回实模式吗?
  • 一般的linux嵌入式设备,系统工作在实模式还是保护模式下呢
  • AT&T汇编 Linux保护模式编程问题
  • 关于linux内核空间保护的问题 iis7站长之家
  • 保护模式下的I/O
  • 已经由DOS实模式进入保护模式(可以在DOS访问32位指针),但具体不知怎样用?
  • 保护模式怎么进呢
  • 什么是保护模式和实模式
  • 保护模式杂问
  • 请问学习x86保护模式编程有什么意义?
  • linux操作系统的保护模式和分页机制,高手请进。
  • 请问关于保护模式下逻辑地址的一个问题
  • 显示器保护模式问题!!!!!!!!!
  • 保护模式小问
  • 保护模式的问题
  • 怎样在Bochs环境里模拟DOS保护模式?
  • [Oracle] Data Guard 之 三种保护模式介绍
  • 关于保护模式下打开地址线A20的问题
  • 再dos中有生成保护模式代码的c编译器吗?
  • 保护模式下怎么和硬件打交道 ?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • solaris 屏幕保护问题(Screen saver)!
  • 关于SCO的屏幕保护的问题
  • Linux下对写保护的u盘操作问题
  • 菜鸟简单屏幕保护问题,请大家帮个忙!!!
  • @@@@@@@ 提两个80386保护编程方面的问题,为提高本版的贴子量尽点力 @@@@@@@@@@@
  • 保护java源代码的问题。
  • 为什么我在安装linux9的时候,机器检测硬件的时候,出现“超频保护中”的提示,请问大家有没有碰到此类的问题
  • 关于linux内核空间保护的问题
  • 哪位会使用代码保护工具WingGuard来保护java代码?
  • 金山隐私保护器 PrivacyProtection
  • 硬盘保护卡是什么道理? 它的工作原理是什么?
  • 屏幕保护程序 Kannasaver
  • 保护视力,用休息提醒软件 Workrave
  • 及其郁闷的事,请问个位硬盘保护卡怎么才能搞掉啊!
  • 386的保护机制为何与这个有点冲突,高手请指教
  • Linux屏幕保护 Really Slick Screensavers GLX Port
  • 怎样用java作一个屏幕保护程序?请帮忙
  • SSH保护程序 sshguard
  • P2P保护工具 PeerGuardian2
  • 屏幕保护程序 Idle Screen Project
  • 请投票保护长城
  • 如何保护你的Java源码?
  • 对一个int32的赋值需要加锁保护么?
  • 怎么解决linux下禁用屏幕保护程序和去掉节省电源的功能????
  • java进程保护
  • 硬件防火墙提供那些保护策略啊
  • 动态反吸血骡保护 DLP
  • 在linux在如何保护正在使用的文件不被删除


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3