易截截图软件、单文件、免安装、纯绿色、仅160KB

linux启动(转载)

各section的位置分布看内核的链接脚本
D:\KIDE\target\kernel-version\cgel3.0\linux\include\asm-generic\vmlinux.lds.h
D:\KIDE\target\kernel-version\cgel3.0\linux\arch\powerpc\kernel\vmlinux.lds.S
Kernel镜像起始地址KERNELBASE = 0xc000 0000,这意味着内核代码和内核全局变量等的地址空间在3g-4g的地方,
而Kernel实际被boot解压到ram的0地址处。这意味着在内核没有开启mmu,将自己映射到3g开始的地址空间前,所有访问的函数地址、全局变量都要减去0xc0000000这个偏移量。
boot跳转点,kernel入口函数_start所在文件
D:\KIDE\target\kernel-version\cgel3.0\linux\arch\powerpc\kernel\head_32.S
链接脚本的起始符号_stext就是从这个文件开始,各类异常处理入口也在这个文件里。
保存boot传过来的r3,r4到r31和r30,给r24赋0;
r3:扁平设备树首地址,物理地址。
r4中是什么?可能是被boot解压的首地址,603好像没用到。
r24干什么的?多核初始化使用,放的是核的编号
执行early_init:
early_init位于.init.text段,这是一个c语言的函数,堆栈指针r1未见到在之前的代码中指定,应该是延用的boot跳过来时使用的值。
reloc_offset这个函数比较巧妙,使用一个链接时确定的绝对地址,利用相对跳转到那里得到当前运行的实际地址,计算差值从而求出当前kernel被解压的地方距离0xc000 0000的偏移。
这要是保证即使kenel没有被boot解压到0地址,代码也能正常运行。
清bss段,注意如何确定现在的Bss段起始地址。在kernel没有把自己映射到0xc0000000时,所有的全局符号访问都要算偏移。
memset_io比普通的memset多了flush cache的操作,保证写到ram中。
SPRN_PVR是处理器的version register,identify_cpu函数根据读出的SPRN_PVR值在全局结构体数组cpu_specs中匹配cpu类型,cc是ppc603.
匹配成功,cur_cpu_spec指向cpu_specs中ppc603那一数组成员。
do_feature_fixups这个函数先解释他的后两个入参,__start___ftr_fixup是__ftr_fixup段的起始地址,__stop___ftr_fixup是__ftr_fixup段的结束地址。
__ftr_fixup这个段的内容其实是一个数组,每个数组成员是一个结构体,该结构体描述了某段代码的起始地址,结束地址,还有特殊的值及掩码作为标识。
使用BEGIN_FTR_SECTION,END_FTR_SECTION_IFSET这两个宏包住的汇编代码会在__ftr_fixup段里记录这段汇编代码的相关位置及标识信息。
这两个宏包住的代码都是一些和cpu特性相关的代码


相关文档:

如何从Windows轻松过渡到Linux?

引:
Linux操作系统是由Linus Torvalds先生在1991年创建的,之后不断获得互联网上众多程序员的自愿支持,经过十几年的发展,如今已经成为继Windows之后的第二大电脑操作系统软件。
你是否对Linux有充分的了解呢?作为一种平台,Linux首先获得了沉溺于某种癖好之士和黑客们的
青睐。Linux操作系统是由Linus
Torvalds先生 ......

linux下C语言多线程编程实例

学东西,往往实例才是最让人感兴趣的,老是学基础理论,不动手,感觉没有成就感,呵呵。
下面先来一个实例。我们通过创建两个线程来实现对一个数的递加。
或许这个实例没有实际运用的价值,但是稍微改动一下,我们就可以用到其他地方去拉。
下面是我们的代码:
/*thread_example.c :  c multiple thread programmi ......

Linux软件安装与卸载

Linux下软件的安装与卸载
一、二进制分发软件包的安装与卸载
Linux软件的二进制分发是指事先已经编译好二进制形式的软件包的发布形式,其优点是安装使用容易,缺点则是缺乏灵活性,如果该软件包是为特定的硬件/操作系统平台编译的,那它就不能在另外的平台或环境下正确执行。
1、*.rpm形式的二进制软件包
安装:rpm ......

linux试题

我为什么发表不了文章呢?
1. 在Linux系统中,以 文件 方式访问设备 。
2. Linux内核引导时,从文件 /etc/fstab 中读取要加载的文件系统。
3. Linux文件系统中每个文件用 i节点 来标识。
4. 全部磁盘块由四个部分组成,分别为引导块 、专用块 、 i节点表块 和数据存储块。
5. 链接分为: 硬链接 和 符号链接 。
6. 超 ......

Linux GCC make文件的写法2

文件在两个文件夹:
inc/hello.h
main/hello.c, main.c, Makefile
文件内容:
hello.h
void hello(char name[]);

hello.c
#include <stdio.h>
void hello(char name[])
{
printf("Hello %s!\n", name);
}

main.c
#include <stdio.h>
#include "../inc/hello.h"
// The second
int main( ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号