LoongSon-PMON startup process record

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 这个地址去

			

 

Guess you like

Origin blog.csdn.net/qq543716996/article/details/104757534