Linux中的地址空间
Linux中的地址空间
有这么一系列的问题,是否在困扰着你:用户程序编译连接形成的地址空间在什么范围内?内核编译后地址空间在什么范围内?要对外设进行访问,I/O的地址空间又是什么样的?
先回答第一个问题。Linux最常见的可执行文件格式为elf(Executable and Linkable Format)。在elf格式的可执行代码中,ld总是从0x8000000开始安排程序的“代码段”,对每个程序都是这样。至于程序执行时在物理内存中的实际地址,则由内核为其建立内存映射时临时分配,具体地址取决于当时所分配的物理内存页面。
我们可以用Linux的实用程序objdump对你的程序进行反汇编,从而知晓其地址范围。
例如:假定我们有一个简单的C程序Hello.c
# include
greeting ( )
{
printf(“Hello,world!\n”);
}
main()
{
greeting();
}
之所以把这样简单的程序写成两个函数,是为了说明指令的转移过程。我们用gcc和ld对其进行编译和连接,得到可执行代码hello。然后,用Linux的实用程序objdump对其进行反汇编:
$objdump –d hello
得到的主要片段为:
08048568 :
8048568: pushl %ebp
8048569: movl %esp, %ebp
804856b: pushl $0x809404
8048570: call 8048474 <_init+0x84>
8048575: addl $0x4, %esp
8048578: leave
8048579: ret
804857a: movl %esi, %esi
0804857c :
804857c: pushl %ebp
804857d: movl %esp, %ebp
804857f: call 8048568&n
相关文档:
前 言
从桌面到服务器,Linux的应用正变得越来越广泛,业界对Linux专业人才的需求量也在急剧增长。高校学生、IT业界人士都希望通过学习Linux知识从而提升自己的竞争力,以获得更高的薪酬。但是目前关于Linux的书籍大部分都只是偏重于桌面应用,或者是只停留在一些表面的简单操作。能由浅入深、全面细致地介绍Linux的 ......
1、下载MySQL免安装版/二进制版软件(不用编译)
文件格式:MYSQL-VERSION-OS.tar.gz
2、创建MySQL组,建立MySQL用户并加入到mysql组中
(不同版本的Unix中,groupadd和useradd的语法可能会稍有不同。)
#groupadd mysql
#useradd -g mysql mysql
3、进入目录/usr/local,解压缩免安装版,并在 ......
Console 修改/etc/inputrc文件
set bell-style off
VIM 如果是在 console 模式下使用 vi/vim,一旦按错键会发出 bi 的一声,这样做可以提醒我们,但是很多时候会影响其他人工作、学习或者休息,如何关闭呢?
可以在 vi/vim 中使用
:set noeb
命令(其中 noeb 是 noerrorbells 的缩写) ......
Linux 中如何查询和卸载已安装的软件
Linux软件的安装和卸载一直是困扰许多新用户的难题。在Windows中,我们可以使用软件自带的安装卸载程序或在控制面板中的“添加/删除程序” 来实现。与其相类似,在Linux下有一个功能强大的软件安装卸载工具,名为RPM。它可以用来建立、安装、查询、更新、卸载软件。该工 ......