linux怎么实现程序的执行
发表于:2025-01-31 作者:千家信息网编辑
千家信息网最后更新 2025年01月31日,本篇内容主要讲解"linux怎么实现程序的执行",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"linux怎么实现程序的执行"吧!我们先看一下这时候的内存布局
千家信息网最后更新 2025年01月31日linux怎么实现程序的执行
当cpu通过cs:eip执行第一条指令的时候。首先通过cs的值,在ldt中找到代码段的基地址,然后加上eip,得到线性地址,然后通过线性地址到页目录和页表项里找是否已经映射到物理地址了。这时候发现,还没有对应的物理地址,然后就触发缺页中断。
我们看一下缺页中断的处理。
本篇内容主要讲解"linux怎么实现程序的执行",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"linux怎么实现程序的执行"吧!
我们先看一下这时候的内存布局。
当cpu通过cs:eip执行第一条指令的时候。首先通过cs的值,在ldt中找到代码段的基地址,然后加上eip,得到线性地址,然后通过线性地址到页目录和页表项里找是否已经映射到物理地址了。这时候发现,还没有对应的物理地址,然后就触发缺页中断。
我们看一下缺页中断的处理。
// 缺页处理,进程的内容还没有加载到内存,访问的时候导致缺页异常
void do_no_page(unsigned long error_code,unsigned long address)
{
int nr[4];
unsigned long tmp;
unsigned long page;
int block,i;
// 取得线性地址对应页的页首地址,与0xfffff000即减去页偏移
address &= 0xfffff000;
// 算出离代码段首地址的偏移
tmp = address - current->start_code;
// tmp大于等于end_data说明是访问堆或者栈的空间时发生的缺页,直接申请一页
if (!current->executable || tmp >= current->end_data) {
get_empty_page(address);
return;
}
// 是否有进程已经使用了
if (share_page(tmp))
return;
// 获取一页,4kb
if (!(page = get_free_page()))
oom();
/* remember that 1 block is used for header */
/*
算出要读的硬盘块号,但是最多读四块。
tmp/BLOCK_SIZE算出线性地址对应页的
页首地址离代码块距离了多少块,然后读取页首
地址对应的块号,所以需要加一。比如距离2块的距离,则
需要读取的块是第三块
*/
block = 1 + tmp/BLOCK_SIZE;
// 查找文件前4块对应的硬盘号
for (i=0 ; i<4 ; block++,i++)
// bmap算出逻辑块号对应的物理块号
nr[i] = bmap(current->executable,block);
// 从硬盘读四块数据进来,并且复制到物理页中
bread_page(page,current->executable->i_dev,nr);
/*
tmp是小于end_data的,因为从tmp开始加载了4kb的数据,
所以tmp+4kb(4096)后大于end_data,所以大于的部分需要清0,
i即超出的字节数
*/
i = tmp + 4096 - current->end_data;
// page是物理页首地址,加上4kb,从后往前清0
tmp = page + 4096;
while (i-- > 0) {
tmp--;
*(char *)tmp = 0;
}
// 建立线性地址和物理地址的映射
if (put_page(page,address))
return;
// 失败则是否刚才申请的物理页
free_page(page);
oom();
}
我们发现缺页中断有一句代码是
// 算出离代码段首地址的偏移
tmp = address - current->start_code
start_code的值就是cs对应的基地址。即进程号*64MB。address就是刚才我们通过cs:eip算出来的值。两个相减得到线性地址离代码段基址的距离,即硬盘中,在代码section中的偏移。然后算出这个偏移在硬盘中相对代码section首地址块偏移。因为代码块不是可执行文件的第一块。所以还需要做一个处理。
/* remember that 1 block is used for header */
/*
算出要读的硬盘块号,但是最多读四块。
tmp/BLOCK_SIZE算出线性地址对应页的
页首地址离代码块距离了多少块,然后读取页首
地址对应的块号,所以需要加一。比如距离2块的距离,则
需要读取的块是第三块
*/
block = 1 + tmp/BLOCK_SIZE;
就是加上可执行文件头占据的那一块,这样就得出了cs:eip在硬盘中绝对偏移,最后把这块数据读进来。并且建立线性地址到物理地址的映射。然后重新执行cs:eip对应的指令,这时候就能找到对应的指令执行了。同理,当我们通过ds访问数据段的时候也是这样,在指令里,访问数据的时候,用的地址是相对数据段的偏移,通过地址的转换,会落到数据段对应的线性地址里。然后通过缺页中断加载进来。堆和栈缺页中断时候直接分配一页物理内存就行。因为他的数据不在硬盘里。
到此,相信大家对"linux怎么实现程序的执行"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
地址
代码
物理
数据
硬盘
偏移
线性
时候
指令
程序
内存
内容
就是
文件
进程
处理
基地
基地址
加一
出线
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
移动咪咕软件开发怎么样
咸宁专业的软件开发价格
北京电脑服务器机箱加工
网络安全法课程练习
广州九重天互联网科技有限公司
安卓系统的多媒体软件开发
安卓的数据库文件在哪修改
企业网络安全完整拓扑图
软件开发文档版本管理
合肥工程管理软件开发外包公司
网络安全文明上网的美术字
如何才能让网络安全
互联网主根服务器
汇纳科技数字赋能世界互联网
南昌数据库安全
输入许可证服务器
t140服务器虚拟化
农安智能化网络安全创新服务
网络道德修养与网络安全手抄报
网络安全 mac
新游网络安全海报
儿童网络安全调研问卷
网络安全自查报告 制度
软件开发人员求职简历
平台数据库数据
faas 服务器
合肥工程管理软件开发外包公司
1t服务器租用
软件开发运行后台
数据网络安全员招聘