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

linux引导时内核解压源码的一些问题

    来源: 互联网  发布时间:2015-07-04

    本文导语:  代码如下: /*  *  linux/boot/head.S  *  *  Copyright (C) 1991, 1992, 1993  Linus Torvalds  */ /*  *  head.S contains the 32-bit startup code.  *  * NOTE!!! Startup happens at absolute address 0x00001000, which is also where  * the page dir...

代码如下:
/*
 *  linux/boot/head.S
 *
 *  Copyright (C) 1991, 1992, 1993  Linus Torvalds
 */

/*
 *  head.S contains the 32-bit startup code.
 *
 * NOTE!!! Startup happens at absolute address 0x00001000, which is also where
 * the page directory will exist. The startup code will be overwritten by
 * the page directory. [According to comments etc elsewhere on a compressed
 * kernel it will end up at 0x1000 + 1Mb I hope so as I assume this. - AC]
 *
 * Page 0 is deliberately kept safe, since System Management Mode code in 
 * laptops may need to access the BIOS data stored there.  This is also
 * useful for future device drivers that either access the BIOS via VM86 
 * mode.
 */

/*
 * High loaded stuff by Hans Lermen & Werner Almesberger, Feb. 1996
 */
.text

#include              /*引入.h文件*/
#include 

.globl startup_32                    /**/

startup_32:
cld                             /*清方向允许位*/
cli                               /*清中断允许位*/
movl $(__KERNEL_DS),%eax        /*(__KERENL_DS)在/linux/include/asm/segment.h下定义,#define __KERNEL_DS 0x18   11000b  */
movl %eax,%ds                  //ds数据段
movl %eax,%es    //附加段
movl %eax,%fs                 //附加段
movl %eax,%gs                  //附加段

lss SYMBOL_NAME(stack_start),%esp     //esp为堆栈指针
xorl %eax,%eax                //异或,其清零作用
1: incl %eax # check that A20 really IS enabled
movl %eax,0x000000 # loop forever if it isn't
cmpl %eax,0x100000
je 1b

/*
 * Initialize eflags.  Some BIOS's leave bits like NT set.  This would
 * confuse the debugger if this code is traced.
 * XXX - best to initialize before switching to protected mode.
 */
pushl $0
popfl
/*
 * Clear BSS
 */
xorl %eax,%eax
movl $ SYMBOL_NAME(_edata),%edi
movl $ SYMBOL_NAME(_end),%ecx
subl %edi,%ecx
cld
rep
stosb
/*
 * Do the decompression, and jump to the new kernel..
 */
subl $16,%esp # place for structure on the stack
movl %esp,%eax
pushl %esi # real mode pointer as second arg
pushl %eax # address of structure as first arg
call SYMBOL_NAME(decompress_kernel)
orl  %eax,%eax 
jnz  3f
popl %esi # discard address
popl %esi # real mode pointer
xorl %ebx,%ebx
ljmp $(__KERNEL_CS), $0x100000

/*
 * We come here, if we were loaded high.
 * We need to move the move-in-place routine down to 0x1000
 * and then start it with the buffer addresses in registers,
 * which we got from the stack.
 */
3:
movl $move_routine_start,%esi
movl $0x1000,%edi
movl $move_routine_end,%ecx
subl %esi,%ecx
addl $3,%ecx
shrl $2,%ecx
cld
rep
movsl

popl %esi # discard the address
popl %ebx # real mode pointer
popl %esi # low_buffer_start
popl %ecx # lcount
popl %edx # high_buffer_start
popl %eax # hcount
movl $0x100000,%edi
cli # make sure we don't get interrupted
ljmp $(__KERNEL_CS), $0x1000 # and jump to the move routine

/*
 * Routine (template) for moving the decompressed kernel in place,
 * if we were high loaded. This _must_ PIC-code !
 */
move_routine_start:
movl %ecx,%ebp
shrl $2,%ecx
rep
movsl
movl %ebp,%ecx
andl $3,%ecx
rep
movsb
movl %edx,%esi
movl %eax,%ecx # NOTE: rep movsb won't move if %ecx == 0
addl $3,%ecx
shrl $2,%ecx
rep
movsl
movl %ebx,%esi # Restore setup pointer
xorl %ebx,%ebx
ljmp $(__KERNEL_CS), $0x100000
move_routine
1、什么是BSS?为什么要清空它?
2、orl  %eax,%eax 
   jnz  3f为什么有这个判断条件,他起什么作用?

|
1、BSS是由编译器生成的没有初始化的数据段
2、判断函数调用的返回值

    
 
 

您可能感兴趣的文章:

  • Linux内核中影响tcp三次握手的一些协议配置
  • 我想学习linux桌面编程,那么有没有必要学习linux的内核以及内核的相关编程呢?
  • TCP协议四次断连过程介绍及Linux内核协议栈中相关设置项
  • 现有linux内核中共享内存机制如何移植到linux0.11内核中
  • Linux进程的内核栈和用户栈概念,相互关系及切换过程
  • 读懂 Linux 内核代码不难,难的是读懂 Linux 内核代码背后的哲学!
  • linux内核中的likely宏和unlikely宏介绍及用法
  • Linux中内核线程不访问内核态地址空间?
  • Linux下c/c++开发之程序崩溃(Segment fault)时内核转储文件(core dump)生成设置方法
  • linux为什么要升级内核?升级内核有何作用?
  • 搜索引擎蜘蛛源码,谁能帮我编译一下!!!源码相赠(没办法,我了解Linux!!!) iis7站长之家
  • 《Linux内核情景分析》值得推荐的内核学习参考两用资料
  • *******是不是对内核模块编程然后再重新编译内核就可以把此模块整合到linux系统中
  • Linux 编译内核之后 没办法选择内核版本
  • 想看linux内核源代码,另外手头上有一本《unix环境高级编程》,需要先把《unix环境高级编程》看完之后再看内核吗?
  • 请问重新编译LINUX内核是否能将没有用的外设的驱动程序删除并减少内核占有内存的资源?请好心人仕指教!
  • Linux内核工具包 TOMOYO Linux
  • 请问:构建嵌入式linux环境时,“Linux内核的移植”是达到什么目的啊?
  • 求教,Linux下键盘输入的所有数据都会经过Linux内核吗???
  • 高深问题:有了linux内核源代码如何做成一个linux操作系统
  • linux内核编译一定要在linux环境下么?
  • Linux_centos_redhat下tar命令解压tgz文件方法
  • linux UNRAR 解压文件怎么不能全部解压
  • tar.xz如何解压:linux和windows下tar.xz解压命令介绍
  • linux 下的自解压文件是什么格式,如何判断文件是否为自解压c++或者脚本判断均可
  • linux rar命令不能完整解压?
  • 下载的 Linux iso 文件 不能在 windows 下解压?
  • 在windows下怎样解压linux-2.4.18.tar.gz
  • linux下解压问题:tar zxvf linux81701.tar
  • Linux C使用jpeg库解压的问题
  • linux下的zip文件怎么解压啊?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux/centos源码安装nginx编译配置选项参数介绍
  • 大家好,我有从网上下的BT源码和MPLAYER源码(是LINUX源码安装的)我想分析一下这些源码。可是这些源码有工作区么?
  • linux/centos下安装nginx(rpm安装和源码安装)详细步骤
  • 请问,shell的一些命令的源码在linux源码树中的那部分?
  • 搜索引擎蜘蛛源码,谁能帮我编译一下!!!源码相赠(没办法,我了解Linux!!!)
  • 都说Linux是开源的,在哪可以找到Linux的源码?
  • 书写基于Linux内核的键盘记录器(Writing Linux Kernel Keylogger)中的源码如何编译通过???
  • linux下命令应用软件的源码放在那里?
  • 关于Linux中的QoS部分源码分析
  • 求Linux下mplay(或其它播放器)源码
  • 如何学习linux命令源码
  • 哪本linux源码分析的书里详细讲解了Linux的核心启动代码
  • 咨询一下linux 源码的发布方式
  • 有没有玩的转LINUX源码的高手?
  • Linux字符模式下,有没有支持源码关键字的软件?
  • 请教:如何阅读linux下的源码
  • 可有人对linux的dhcp的源码分析过么?望各位指教,
  • Linux Device Driver 源码请教
  • linux命令源码阅读--求指点
  • 急求Linux下的rtsp服务器的源码?
  • Linux0.11 内核源码 main函数的参数问题
  • linux c/c++ IP字符串转换成可比较大小的数字
  • 在win分区上安装linux和独立分区安装linux有什么区别?可以同时安装吗?(两个linux系统)
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 在虚拟机上安装的linux上,能像真的linux系统一样开发linux程序么?
  • secureCRT下Linux终端汉字乱码解决方法
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在有linux的盘)
  • Linux c字符串中不可打印字符转换成16进制
  • 安装vmware软件,不用再安装linux系统,就可以模拟linux系统了,然后可以在其上学习一下LINUX下的基本操作 了?
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux


  • 站内导航:


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

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

    浙ICP备11055608号-3