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特性相关的代码
相关文档:
随着 Linux 操作系统的广泛应用,特别是 Linux 在嵌入式领域的发展,越来越多的人开始投身到 Linux 内核级的开发中。面对日益庞大的 Linux 内核源代码,开发者在完成自己的内核代码后,都将面临着同样的问题,即如何将源代码融入到 Linux 内核中,增加相应的 Linux 配置选项,并最终被编译进 Linux 内核。这就需要了解 Linu ......
Linux下软件的安装与卸载
一、二进制分发软件包的安装与卸载
Linux软件的二进制分发是指事先已经编译好二进制形式的软件包的发布形式,其优点是安装使用容易,缺点则是缺乏灵活性,如果该软件包是为特定的硬件/操作系统平台编译的,那它就不能在另外的平台或环境下正确执行。
1、*.rpm形式的二进制软件包
安装:rpm ......
10.5.2 精通定时器设置
函数alarm设置的定时器只能精确到秒,而以下函数理论上可以精确到微妙:
#include <sys/select.h>
#include <sys/itimer.h>
int getitimer(int which, struct itimerval *value);
int setitimer(int which, const struct itimerval
*value, struct itimerval *ovalue ......
Linux下锁用户与解锁问题 [原创 2010-02-03 21:44:35]
字号:大 中 小
一:登录失败次回超过限制
1)锁用户的设定
/etc/pam.d/下包含各种认证程序或服务的配置文件。编辑这些可限制认证失败次数,当失败次数超过指定值时用户会被锁住。
在此,以run level为3的时候,多次登录登录失败即锁用户为例:
......
第一种方法:
root用户登录系统
usr/local/mysql/bin/mysqladmin -u root -p password 新密码
enter password 旧密码
第二种方法:
root用户登录mysql数据库
mysql> update mysql.user set password=password("新密码")where User="root";
mysql> flush privileges;
mysql> quit ;
mysql忘记root密码如何 ......