设为首页
优惠IDC
收藏本站
六狼博客
六狼论坛
开启辅助访问
切换到窄版
用户名
Email
自动登录
找回密码
密码
登录
立即注册
只需一步,快速开始
只需一步,快速开始
快捷导航
门户
首页
BBS
云计算
大数据
手机
移动开发android,ios,windows phone,windows mobile
编程
编程技术java,php,python,delphi,ruby,c,c++
前端
WEB前端htmlcss,javascript,jquery,html5
数据库
数据库开发Access,mysql,oracle,sql server,MongoDB
系统
操作系统windows,linux,unix,os,RedHat,tomcat
架构
项目管理
软件设计,架构设计,面向对象,设计模式,项目管理
企业
服务
运维实战
神马
搜索
搜索
热搜:
php
java
python
ruby
hadoop
sphinx
solr
ios
android
windows
centos
本版
帖子
用户
六狼论坛
»
首页
›
编程技术
›
C
›
关于linux程序在内存中的分布管理
返回列表
查看:
44
|
回复:
0
关于linux程序在内存中的分布管理
[复制链接]
envy2002
envy2002
当前离线
积分
231
窥视卡
雷达卡
升级
10.33%
当前用户组为
举人
当前积分为
231
, 升到下一级还需要 269 点。
65
主题
65
主题
65
主题
举人
举人, 积分 231, 距离下一级还需 269 积分
举人, 积分 231, 距离下一级还需 269 积分
积分
231
发消息
楼主
|
发表于 2013-1-26 13:43:12
|
显示全部楼层
|
阅读模式
这段时间,一直在看汇编,想学习一下linux内核,但是看着看着,感觉汇编操作底层,虽然能力很大,但是不好管理。假如有这个代码 mov ax, [msg+1234h]-->把ds*16+msg+1234h内存里面的东西移动到ax寄存器中,msg表示这段程序的起始地址,但是当我们把这个程序编译连接好后,那么这段代码可能是 mov ax, [2234h]。当我们把这段代码整体平移到0000h起始的地方,这段代码能一定执行吗,不一定吧,有可能报错的。
比如,把二进制代码从紫色部位,移动到绿色部位,移动后这个代码可能不worK的。因为你的本意是移动相对那个位置的内存内容到AX寄存器中,(比如紫色从左往右数的第2个到AX中)但是编译连接,整体移动后,你却还是移动那个位置的内容(正确的是移动绿色第2个),那怎么解决这个问题呢?
这就是连接器的作用了,比如现在有3个程序片段,编译之后都是编号地址都是随机分布的,或相交,或分离。(这里可能说的不正确,只是打个比方)。但是连接的作用就不同了,连接器会分析,分析的范围是整体的。比如你要链接1,2,3三个片段,那么他们的链接效果如下:
连接器会把三个文件作一个整体性的排序(或者安排吧),实地址替换里面的符号。
如果只链接两个呢,那么可能结果如下。
或者是这样
当然了,这只是我的猜测,不一定正确。
再说说多道程序,现在有三个程序,从头到尾都是汇编编写,每个程序有若干片段,如果三个程序都链接好了之后,那么假设他们都从地址0h开始加载,那不就又冲突了吗,实模式可没有那么好的内存管理啊。这好像就是保护模式了。
如图:
有三个程序,每个程序执行的时候,会给每个程序一个选择子,来选择一段内存,加入都从0h地址开始执行,但是A程序是0h,B 程序是10000H开始,C是20000H开始,即使A,B,C的汇编代码一样,但是进入保护模式,CPU会根据每个程序用一种特殊的方法来寻址。(当然这些分段内存是足够大的),这样这些程序加载就不会冲突了,也保证能够正确执行。这些对实模式的汇编指令都是透明的,开启一个开关,寻址的空间发生了变化,这些指令全然不知,呵呵
当然,这些都是我的猜测。
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
显身卡
返回列表
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
本版积分规则
发表回复
回帖后跳转到最后一页
浏览过的版块
Java
os
Copyright © 2008-2020
六狼论坛
(https://it.6wolf.com) 版权所有 All Rights Reserved.
Powered by
Discuz!
X3.4
京ICP备14020293号-2
本网站内容均收集于互联网,如有问题请联系
QQ:389897944
予以删除
快速回复
返回顶部
返回列表