- 爱易网页
 
                        - 
                            Linux
 
                        - 保护模式下写变量有关问题 
 
                         
                    
                    
                    日期:2014-05-16  浏览次数:20833 次 
                    
                        
                         保护模式下写变量问题
现在在学习写内核  
一写变量就出现内核错误呀   怎么搞的?  
我把内核放到了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;       <----------------运行到这里就出现堆栈错误  
     while(1)  
         ;  
}  
堆栈没有问题   已经检查了  
用bochs调试结果:  
D:\Program   Files\Bochs-2.3.pre3\tinix> D:\Progra~1\Bochs-2.3.pre3\bochsdbg.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  
<bochs:1>   pb   0x80000  
<bochs:2>   c  
(0)   Breakpoint   1,   0x00080000   in   ??   ()  
Next   at   t=1796393  
(0)   [0x00080000]   0030:00080000   (unk.   ctxt):   mov   ax,   cs                                 ;   668cc8  
<bochs:3>   s  
Next   at   t=1796394  
(0)   [0x00080003]   0030:00080003   (unk.   ctxt):   mov   ds,   ax                                 ;   8ed8  
<bochs:4>  
Next   at   t=1796395  
(0)   [0x00080005]   0030:00080005   (unk.   ctxt):   mov   es,   ax                                 ;   8ec0  
<bochs:5>  
Next   at   t=1796396  
(0)   [0x00080007]   0030:00080007   (unk.   ctxt):   mov   fs,   ax                                 ;   8ee0  
<bochs:6>  
Next   at   t=1796397  
(0)   [0x00080009]   0030:00080009   (unk.   ctxt):   jmp   .+0x00000046   (0x00080054)   ;   e946000000  
<bochs:7>  
Next   at   t=1796398  
(0)   [0x00080054]   0030:00080054   (unk.   ctxt):   push   ebp                                     ;   55  
<bochs:8>  
Next   at   t=1796399  
(0)   [0x00080055]   0030:00080055   (unk.   ctxt):   mov   ebp,   esp                             ;   89e5  
<bochs:9>  
Next   at   t=1796400  
(0)   [0x00080057]   0030:00080057   (unk.   ctxt):   sub   esp,   0x00000008               ;   83ec08  
<bochs:10>  
Next   at   t=1796401  
(0)   [0x0008005a]   0030:0008005a   (unk.   ctxt):   mov   dword   ptr   ds:0x80080,   0x0000004e   ;   c705800008004e000000  
<bochs:11>   print-stack  
Stack   address   size   4  
   ¦   STACK   0x000003f3   [0x00ff53f0]  
   ¦   STACK   0x000003f7   [0x00ff53f0]  
   ¦   STACK   0x000003fb   [0x00ff53f0]  
   ¦   STACK   0x000003ff   [0x0003f8f0]  
   ¦   STACK   0x00000403   [0x00000000]