Simply organize it for future learning.
加入gdb编译pmon
编译:
make cfg all tgt=rom DEBUG=-g
反汇编:
mipsel-linux-objdump -S pmon.gdb > pmon-gdb-objdump.S
初始化栈大小:16KB
_gp 在ld.script 链接脚本中定义 ./Targets/Bonito3a3000_7a/conf/ld.script
生成gzrom程序地址是从. = 0xffffffff8f010000 开始
start.S中
bootnow:
TTYDBG("Copy PMON to execute location...\r\n")
从汇编到C:
./genrom ../Targets/Bonito3a3000_7a/compile/Bonito/pmon > initmips.c
zloader/initmips.c
zloader/genrom
zloader/pmon.bin.c 来自于pmon.bin.gz
pmon.bin.gz 来自于pmon.bin
start.S --> initmips
首先执行的函数是initmips,tgt_machdep.c文件中
./Targets/Bonito3a3000_7a/Bonito/tgt_machdep.c
initmips
tgt_cpufreq() -------Targets/Bonito3a3000_7a/Bonito/tgt_machdep.c
_probe_frequencies()
init_legacy_rtc();
dbginit(NULL) -------pmon/common/main.c
__init();
__ctors() //初始化cmd,初始化USB相关
envinit ();
tgt_devinit();
CPU_ConfigCache();
_pci_businit(1);
_pci_hwinit (init, &def_bus_iot, &def_bus_memt); ---Targets/Bonito3a3000_7a/pci/pci_machdep.c
check_str();
init_net(1);
paraminit (); //Init system global parameters
vminit(); //Initialise "virtual memory" maps
kmeminit(); //为kernel内存中的每页建立数据结构(位图)并把它们存储在kernel内存中.同时确定kernel内存的基址,偏移量,上限等变量.
mbinit();
splhigh();
tgt_devconfig(); //显卡相关
_pci_devinit(1);
_pci_devinit (int initialise)
_pci_setup_devices (pd, initialise);
fb_init(fbaddress, ioaddress);//ioaddress is unuseful
config_init(); //初始化4张链表
configure(); //整个pci初始化的核心
config_rootfound("mainbus", "mainbus")
if ((match = config_rootsearch((cfmatch_t)NULL, rootname, aux)) != NULL)
//config_rootsearch 就是传入这个 pci 架构的根的名字,找到根这个设备。我们传
入的参数是 NULL 和两个“mainbus”字符串
mapply(&m, cf);
return (config_attach(ROOT, match, aux, (cfprint_t)NULL));
gmac_mac_init();
ifinit(); //interface,进行网络接口初始化,包括watchdog计时器的执行
init_proc (); //在这里先初始化文件系统,然后再初始化进程描述符表的状态和符号表信息.并让进程描述符表的第一个元素指向当前进程.写入它的状态SNOTKERN,名字"pmon",pid为1,文件信息和符号表信息.
//init_net()总算执行完毕,回到 dbginit()。
histinit ();
syminit ();
defsyms();
defsym ("start", pc); //defsym()函数把这些变量注册在一个 hash 数组中。
initial_sr |= tgt_enable (tgt_getmachtype ());
ioctl(STDIN, TCGETA, &consterm);/* Set up initial console terminal state */
tgt_memprint(); //判断打印出 cpu 的类型
DevicesInit(); //挨个查询已经注册的设备,所有已知设备都在 alldevs 这个链表中
_DevPartOpen(dev_disk, dev_disk->device_name);
open(path, O_RDONLY | O_NONBLOCK, 0);
dev_part_read(fd, dev->part);//现在开始读取 disk 上的分区,dev->part 传入的目的是存放读取出的分区表
read_primary_part_table(fd, 0, ppTable); //读取 fd 代表的 disk 上分区表写到 table 这个地址去