假设用户程序装入内存后SS=095BH,SP=40H,试问该用户程序的可用栈底的物理地址是多少?

假设用户程序装入内存后SS=095BH,SP=40H,试问该用户程序的可用栈底的物理地址是多少?,第1张

装入后,SP会初始化,指向Bottom,即栈底,所以明颤,此时的栈底物理地址为蔽亩:SS*16+SP=095B0H+40H=095F0H。至于为什么是095BH,这是题目假设宏槐森,装入时一般由系统分配。“可用”,其实就是让你求它的栈底。

程序的装入和链接

大家学过c语言的都知道,我们的程序要想运行,会经过编译->链接->装入这三个步骤,其中:

编译是指由编译程序将用户源代码编译成若干目标模块。

链接是指将编译产生的一组目标模块所需的库函数链接在一起,形成一个完整的装入模块。

装入是指由装入程序将装入模块装入内存运行。

我们来看一下链接和装入:

链接的方式有三种,一是静态链接,二是装入时动态链接,三是运行时动态链接。

静态链接也就是在程序运行之前,将程序所需的库函数链接成一个完整的可执行程序。

装入时动态链接:将用户程序源程序编译后所的到的目标模块,在装入内存时,采用边装入边链接的方式

运行时动态链接:对某些目标模块的链接,是在程序执行中需要该目标模块散燃陵时才进行的。有利于目标模块的共享。

链接的话,决定了最终程序进入到内存中,占多少内存,可以看到,如果是静态链接的话,它装入的程序体积是最大的,如果说我们的程序都才采用这种方式进行链接,那么我们的内存能装的程序就很少了。

装入也是有三种方式:

绝对装入:在编译的时候,如果知道程序将驻留在内存的某个位置,则编译程序将产生绝对的地址的目标代段旅码。绝对装入程序按照装入模块中的地址,将程序和数据装入内存。该方法只适用于单道程序环境。

可重定位装入:在多道程序环境下,多个目标模块的其实地址都是从0开始的,程序中的其他地址都是相对于始址的。这个时候可以根据内存的当前情况,将装入模块装入内存适当位置。相比于绝对冲戚装入,就不需要提前知道程序驻留在内存的某个位置。

动态运行时转入:如果想要程序在内存中发生移动,就需要采用动态的装入方式,装入程序把装入模块装入到内存后,并不立即把装入模块中的相对地址转换为绝对地址,而是把这两种地址转换到程序真正要执行的时才进行。也就是装入的地址时相对地址

所以把代码从存储器拷贝到RAM中,变成了bootloader的工作之一。一般的,嵌入式系统的存储器以Flash应用最广,Flash分为两种凯薯悉:norFlash和nandFlash,打个不恰当的比方,norFlash相当于ROM,程序可以直接在其上运行,nandFlash相手茄当于硬盘,只负责存储程序。所以一般的bootloader代码都存储在norFlash中,上电后芯片可直接读取其上的代码来运行,而S3C2410芯片比较特别,以它为平台构建的系统可以用nandFlash来储存bootloader。因为它自带了4K的RAM,上电后通过硬件机制将存储器中的前4K代码拷贝到芯片自身的RAM里。

总结一下,硬盘、光驱、软盘等外存设备,由于接口的不同,CPU是不能直接访问的,而CPU

能访问的只有和它共享地址、数据总线的内存因此,程序无法在硬盘、光驱、软盘等外存设备上直接运行,必须读入内存运行,这就是程序加载的原因。也是BOOTLOAD

存在的原因。

BIOS等都是norFlash,程序可以直接在上面运行。

内存与外存的区别

ROM

norflash

、nandflash

的区别主要是接口、存储器单元组织的不同:

程序ROM、norflash

总线型可以随机按字盯乎节读取,容量小;nandflash

是特殊接口,只能页读,容量大

程序ROM

是字节读写单位;norflash

、nandflash

是FLASH

有页、块的概念特别是擦除,必须块擦除。硬盘更是有扇区、簇的概念,便于文件管理,但是也必须有专门的控制器管理

这就是为什么程序都是由

硬盘、光盘等外存读入内存再执行的原因。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12511307.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存