Chinaunix首页 | 论坛 | 博客
  • 博客访问: 971102
  • 博文数量: 261
  • 博客积分: 10026
  • 博客等级: 上将
  • 技术积分: 3420
  • 用 户 组: 普通用户
  • 注册时间: 2009-02-24 12:10
个人简介

https://smart888.taobao.com/ 立观智能监控

文章分类

全部博文(261)

文章存档

2011年(1)

2010年(4)

2009年(256)

我的朋友

分类: LINUX

2009-03-30 13:47:27

一、pmon命令
        pmon是loongson 2E的bios兼bootloader
        下面是pmon常用的指令;

        1.set novga 1/0  
           输出到串口/显示器(永久起效)
           setvga 0/1
           输出到串口/显示器(临时起效)
    
        2.load /dev/ext2@wd0/boot/vmlinux-video
           加载本地硬盘boot目录下的内核
         
          g console=tty root=/dev/hda1
          启动内核启动参数,设置输出设备,和文件系统所在分区

          set al /dev/fs/ext2@wd0a/boot/vmlinux-2.6.18-godson2e
          设定默认启动内核

          set karg "console=tty root=/dev/hda2 init=/sbin/runit-init"
          设定默认内核启动参数

        PMON是一个兼有BIOS和boot loader部分功能的开放源码软件,多用于嵌入式系统。

       与BIOS相比功能不足,与常见的bootloader 相比,功能要丰富的多。基于龙芯的系统采用 pmon 作为类 BIOS 兼 bootloader,并做了很多完善工作。

其有如下主要特点:
       * 支持ext2 fat32 ram 文件系统
* 支持网络引导(tftp),磁盘引导,flash 引导
* 内建调试功能(强大,调试内核举重若轻)
* USB 2.0 Mass Storage 支持
* 支持MIPS、ARM、PowerPC 平台
* BSD Licensed
...
以下结合实际,给出开发中常用的命令介绍
1. pmon 日常命令
    a. load --- 加载文件
    load [-options] pathname
    -o offset 将文件加载到内存 load_address + offset 处
-f addr 将文件加载到 flash 的地址 addr 处
pathname 要加载的文件路径或URL
    其他选项 h load 查看
    例子:
    加载位于硬盘第一个分区的(pmon 只认第一个分区)内核:
        load /dev/fs/ext2@wd0/boot/vmlinux # 第一个分区是ext2文件系统
load /dev/fs/ext2@wd0b/boot/vmlinux #加载第二个分区上的内核文件,wd0c,wd0d,为第三,四个分区。

    从远程tftp服务器上加载内核: (该功能在反复编译调试内核中很方便)

load tftp://192.168.10.100/vmlinux # 先要配置好网络


其他格式:

load /dev/fs/iso9660@cd0/boot/vmlinux
load /dev/ram@address
load /dev/ram@address,size
load /dev/ram/logger

这些在龙梦电脑上很少用到,不知有没有被支持(未测试)


PS: 以上 wd0, cd0, ram 为pmon 对设备的命名,可以用 devls 命令查看他发现并支持
的所有设备, 龙梦电脑上常见的设备为:

wd0 --------- 磁盘
rtl0 --------- 网卡
usb0 --------- usb 存储设备

cd0 --------- 光盘
ram --------- 内存


b. g ------ 执行程序

g [-st] [-b addr] [-e addr] [-- args...]

当 load 完一个文件后, 通过 g 命令告诉 pmon 开始执行刚刚载人的文件


例子:

g # 从 epc 寄存器指定的地址处开始执行

g -e addr # 从内存地址 addr 处开始执行

g -e addr -b add2 # 从内存地址 addr 处开始执行, 在addr2处设置一个临时断点
# 在下一次执行挂起时删除该断点

g console=tty root=/dev/hda1 # 从 epc 寄存器指定的地址处开始执行, 并将参数
# console=tty root=/dev/hda1 传递给程序(内核)


c. devls ------- 显示设备

devls [-a]

例子:

devls -a # 显示所有设备



d. ifaddr ------ 配置网卡

ifaddr ifname ipaddr[:ifparameters]

其中 第二个字段可以为 ipaddr:netmask:broadcast:gateway

例子:

ifaddr rtl0 192.168.10.99 # 设置网卡 rtl0 的 IP 地址

ifaddr rtl0 192.168.10.99:255.255.255.0::192.168.10.2 # 设置网卡 IP 地址和网关


e. ping

ping 192.168.10.188 # 测试网络是否配置好







PMON安装
部分内容来源于互联网,如侵犯了作者的权益,请尽快与我们取得联系!

                                                                       PMON编译过程
一.源代码:
       (1)pmon_source.tar.bz2-----------pmon源代码,位于服务器/Loongson/PMON/下
       (2)toolchain-pmon.tgz ------------编译pmon交叉编译工具,位于服务器/Loongson/PMON/下
二.编译环境:
    经过验证成功的编译环境有:FC5+GCC4.1.0与Kubuntu+GCC3.3.6
三.编译步骤:
    (1)解压缩pmon_source.tar.bz2,得到pmon目录
        (2)解压缩 toolchain-pmon.tgz到目录 /,即安装交叉编译工具到/usr/local/comp/mips-elf/gcc-2.95.3/bin
        (3)进入目录pmon/tools/pmoncfg/,make以后,能得到pmoncfg可执行文件
    (4)进入目录pmon/Targets/Bonito/conf/,然后运行pmoncfg Bonito,在pmon/Targets/Bonito/compile下得到刚刚生成的Bonito目录。
     (5)进入刚刚生成的Bonito目录,运行Make得到pmon.bin文件
     (6)进入zloader目录然后运行Make tgt=ram,这时候会出现问题,出错提示是startram.S文件找不到asm.h, regnum.h, cpu.h.pte.h这四个头文件,我们在pmon目录下搜索一下,会发现他们在pmon/sys/arch/mips/include目录下面,所以 将该目录添加到zloader/Makefile文件中,编译后会发现machine/def.h和machine/psl.h头文件找不到,其实他们也 是在pmon/sys/arch/mips/include下面,所以修改asm.h和cpu.h,将def.h和psl.h前面的machine路径去 掉,然后再修改psl.h,将其中的cpu.h和intr.h前面的machine去掉,然后编译即刻.
     (7)最后得到的是gzram文件.

PMON环境
部分内容来源于互联网,如侵犯了作者的权益,请尽快与我们取得联系!

Targets目录的组成

      start.S 位于Targets/Bonito/Bonito目录下,是C环境建立之前的汇编代码,使整个BIOS运行的起点。

       tgt_machdep.c位于Targets/Bonito/Bonito目录下,一些板子相关的函数。

       pci_machdep.c进行Targets/Bonito/pci空间分配的一些函数

       Targets/Bonito/dev目录下一些板子特殊的设备的驱动。

       Targets/Bonito/conf目录下是一些编译环境建立需要的一些文件

PMON编译环境的建立

       进入pmon2000的tools目录下make,建立一些conf需要的工具。

       进入pmon2000的Targets/Bonito/conf目录中

       编辑conf目录下Bonito文件,选择需要编译的模块

       tools/pmoncfg/pmoncfg Bonito(conf类型文件)。形成目标主目录下的compiler目录

       进入Targets/Bonito/compiler/Bonito的目录,make形成pmon。

       Makefile是根据Targets/Bonito/conf/Makefile.Bonito文件形成的。

       链接脚本是为Targets/Bonito/conf/ld.script。

PMON启动流程(1)--基于Loongson2c(zhuan)
部分内容来源于互联网,如侵犯了作者的权益,请尽快与我们取得联系!

       下面介绍的pmon流程,基于龙芯2c,计算所的北桥。
pmon的编译      
1.1 pmon的配置
       1)配置文件
总的配置文件在 :/usr/src/pmon-all/conf/files      
开发板的配置文件: /usr/src/pmon-all/Target/bonito/conf/Bonito
其他配置文件还有 /usr/src/pmon-all/sys/dev/pci/files.pci
/usr/src/pmon-all/sys/dev/ata/files.ata
       2)配置设置
我们这里最重要的是 /usr/src/pmon-all/Target/bonito/conf/Bonito文件
文件格式,#表示注释
include "conf/GENERIC_ALL1"
#包含/usr/src/pmon-all/conf/GENERIC_ALL1文件,其内容如下:

#
# Module selection. Selects pmon features
#
select                  mod_flash_amd                  # AMD flash device programming
select                  mod_flash_intel                  # intel flash device programming
select                  mod_flash_sst                  # intel flash device programming
#目前pmon支持amd,inter和sst公司的flash的烧写,有两个作用,一是储存环境变量,二是在线更新bios
#
# Command selection. Selects pmon commands
#
#select                  cmd_about                  # Display info about PMON
select                  cmd_boot                  # Boot wrapper
select                  cmd_cache                  # Cache enabling
select                  cmd_call                  # Call a function command
select                  cmd_mycfg
select                  cmd_date                  # Time of day command
select                  cmd_env                          # Full blown environment command set
select                  cmd_flash                  # Flash programming cmds
select                  cmd_hist                  # Command history
select                  cmd_ifaddr                  # Interface address command
select                  cmd_l                          # Disassemble
select                  cmd_mem                          # Memory manipulation commands
select                  cmd_more                  # More paginator
select                  cmd_mt                          # Simple memory test command
select                  cmd_misc                  # Reboot & Flush etc.
select                  cmd_set                          # As cmd_env but not req. cmd_hist
select                  cmd_stty                  # TTY setings command
select                  cmd_tr                          # Host port-through command
select                  cmd_devls                  # Device list
#
select                  cmd_shell                  # Shell commands, vers, help, eval
select                  cmd_vers
select                  cmd_help
select                  cmd_eval
select        cmd_mycmd
select                  cmd_newmt      #test86内层检测程序
select                  cmd_setup       #条棒式配置程序
上面这些选项选择编译那些命令到pmon中
option        CONFIG_CACHE_64K_4WAY
#龙芯2c的cache设置4路,64k.
再返回到原配置文件中
# Platform options
#
option                  BONITOEL          #平台北桥的类型,计算所binito结构北桥
option                  MIPS
option                  INET

select                  mod_uart_ns16550          # Standard UART driver
option                  CONS_BAUD=B115200
#串口的波特率设置
select                  ext2
select                   iso9660
#pmon支持ext2,iso9660文件系统,可以从网络硬盘软驱光驱引导内核
select                  mod_x86emu_int10
#显卡rom模拟程序
select                  mod_vgacon
#显示器和键盘虚拟终端
option                   AUTOLOAD
#pmon起动后,自动引导内核
# Functional options.
#
option                  HAVE_TOD                  # Time-Of-Day clock
#实时钟
option                  HAVE_NVENV                  #    Platform has non-volatile env mem
#环境变量支持
option                   NVRAM_IN_FLASH       
#打开这个选项环境变量存储在flash中,关闭环境变量存在cmos中
option        HAVE_NB_SERIAL
#北桥有串口,在正式的电路板中北桥无串口
#下面是pmon的设备树的设置
#
#    Now the Machine specification
#
mainbus0          at root
localbus0          at mainbus0
fd0           at mainbus0
#软驱驱动
pcibr0                  at mainbus0
pci*                  at pcibr?
# fxp normally only used for debugging (enable/disable both)
fxp0              at pci? dev ? function ?          # Intel 82559 Device
inphy*            at mii? phy ?                     # Intel 82555 PHYs
#82559网卡驱动
##########82546
#82546 use a lot of memory so setup NKMEMCLUSTERS as bellow
#           #define NKMEMCLUSTERS     (16 * 1024 * 1024 / CLBYTES)          /* 0.5Mb */
em*              at pci? dev ? function ?          # Intel 82559 Device
#82546网卡驱动
#### IDE controllers
pciide*           at pci ? dev ? function ? flags 0x0000

#### IDE hard drives
wd*                  at pciide? channel ? drive ? flags 0x0000
#硬盘驱动
ide_cd*           at pciide? channel ? drive ? flags 0x0001
#光驱驱动
1.2 pmon的编译

Cd /usr/src/pmon-all/zloader
Make cfg #根据配置文件重新产生makefile
Make tgt=rom #生成rom bin文件gzrom.bin
Make tgt=ram #生成网络加载文件gzram,通过网络tftp重新加载pmon在调pmon程序的时候很有用
也可以用老的编译方法
cd /usr/src/pmon-all/Targets/Bonito/conf
pmoncfg Bonito
cd /usr/src/pmon-all/Targets/Bonito/compile/Bonito
make
2.利用gdb来分析pmon
2.1.得到编译信息
要使生成的pmon带编译信息,改 Targets/Bonito/compile/Bonito/Makefile
直接将gcc 改成了gcc -ggdb -g3
将Makefile中的
STRIPFLAGS=       -g -S --strip-debug
LFLAGS+=          -S
注释掉。其中ld的参数 -S和--strip-debug的作用是去掉调试的信息。
STRIPFLAGS=       #-g -S --strip-debug
LFLAGS+=          #-S
make DEBUG=-g
2.使用gdb
mips-elf-gdb pmon
(gdb) target sim
load
(gdb) disassemble    0xffffffff80010000

0xffffffff80010030 :    lui       $at,0xa000
0xffffffff80010034 告诉你的硬件工程师。
因此,你可以使用这段地址空间来访问你的初始化程序的ROM。还有大多数人把它用来访问I/O寄存器。如果你的硬件工程师要把这些东西
映射到非低段512M物理空间,那你应该试图说服他们修改。
kseg2: 0xC000 0000 - 0xFFFF FFFF (1GB): 这段地址空间只能在核心态下使用并且要经过MMU的转换。在MMU设置好之前,
不要对其进行访问。通常,除非你在写一个真正的操作系统,否则都不必使用这段地址空间。

maped指的是要经过TLB进行虚拟内存的翻译。cached指先从cache取,未命中才从内存中取。
从北桥的映射图上看其大部分区域映射在低512M物理内存上。省下三个段512M-2G maps 1-1 on pci access用处不大,2G-4G pci窗口,4G以上sdram。

3.2 代码分析
总的来说:
1)启动位置位于cpu的启动地址是0xbfc00000,这个地址对应的物理地址是0x1fc00000,北桥将这一地址影射到flash的0地址上.
因此准确的说pmon是从flash的0地址开设运行。编译的时候start.o正好是第一个被链接的obj文件,因此start.S的第一条指令是cpu运行的第一个指令,位于_start。
2)c代码的第一个入口是initmips,位于tgt_machdep.c中。最后程序到main函数中运行命令循环。
3)pmon开始应该是freebsd移植过来的,系统调用,设备驱动是unix风格的。
4)pmon中cpu运行于32位模式下,是关中断运行。pmon完全靠查询来完成整个系统,技巧是idle函数中调用scandevs来扫描设备驱动程序。驱动程序 中的中断也是通过被系统查询的时候不断调用来实现的。
5)在cpu的状态寄存器中有一个bev,设置异常向量从rom中取,还是重ram中取.
              bcopy(MipsException, (char *)TLB_MISS_EXC_VEC, MipsExceptionEnd - MipsException);
              bcopy(MipsException, (char *)GEN_EXC_VEC, MipsExceptionEnd - MipsException);

下面具体介绍启动流程:

start.S中
_start:
start:
          .globl          stack
stack = start - 0x4000                  /* Place PMON stack below PMON start in RAM */

/* NOTE!! Not more that 16 instructions here!!! Right now it's FULL! */
          mtc0          zero, COP_0_STATUS_REG
          mtc0          zero, COP_0_CAUSE_REG
          li          t0, SR_BOOT_EXC_VEC          /* Exception to Boostrap Location */
          mtc0          t0, COP_0_STATUS_REG
          la          sp, stack
          la          gp, _gp

          bal          uncached                  /* Switch to uncached address space */
          nop

          bal          locate                          /* Get current execute address */
          nop
从pmon中反汇编得到
(gdb) disassemble 0xffffffff80010000
Dump of assembler code for function start:
0xffffffff80010000 :       mtc0      $zero,$12
0xffffffff80010004 lw          t0, Init_A0(a0)
          and          t4,t3,OP_MASK
          /*
           * EXIT(STATUS)
           */
          bne          t4, OP_EXIT, 8f
          nop
          move          v0,t0
          b          .done
          nop
          剩下的初始化寄存器的过程省略
       
.done:       
          /* Initialise other low-level I/O devices */

          bal          initserial
          nop
       

          PRINTSTR("\r\nPMON2000 MIPS Initializing. Standby...\r\n")
       
          PRINTSTR("ERRORPC=")
          mfc0          a0, COP_0_ERROR_PC
          bal          hexserial
          nop

          PRINTSTR(" CONFIG=")
          mfc0          a0, COP_0_CONFIG
          bal          hexserial
          nop
          PRINTSTR("\r\n")
       
          PRINTSTR(" PRID=")
          mfc0          a0, COP_0_PRID
          bal          hexserial
          nop
          PRINTSTR("\r\n")
          简单的打印一些寄存器的值
          ....
          一些sdram的配置
          1:          sw          sdCfg,BONITO_SDCFG(bonito)
       
2:          b          3f      
nop
3:
...
配置pci内存影射
          li          t1,0                  # accumulate pcimembasecfg settings
               
          /* set bar0 mask and translation to point to SDRAM */
          sub          t0,msize,1
          not          t0
          srl          t0,BONITO_PCIMEMBASECFG_ASHIFT-BONITO_PCIMEMBASECFG_MEMBASE0_MASK_SHIFT
          and          t0,BONITO_PCIMEMBASECFG_MEMBASE0_MASK
          or          t1,t0
       
          li          t0,0x00000000
          srl          t0,BONITO_PCIMEMBASECFG_ASHIFT-BONITO_PCIMEMBASECFG_MEMBASE0_TRANS_SHIFT
          and          t0,BONITO_PCIMEMBASECFG_MEMBASE0_TRANS
          or          t1,t0
          or          t1,BONITO_PCIMEMBASECFG_MEMBASE0_CACHED

          /* set bar1 to minimum size to conserve PCI space */
          li          t0, ~0
          srl          t0,BONITO_PCIMEMBASECFG_ASHIFT-BONITO_PCIMEMBASECFG_MEMBASE1_MASK_SHIFT
          and          t0,BONITO_PCIMEMBASECFG_MEMBASE1_MASK
          or          t1,t0
       
          li          t0,0x00000000
          srl          t0,BONITO_PCIMEMBASECFG_ASHIFT-BONITO_PCIMEMBASECFG_MEMBASE1_TRANS_SHIFT
          and          t0,BONITO_PCIMEMBASECFG_MEMBASE1_TRANS
          or          t1,t0
          or          t1,BONITO_PCIMEMBASECFG_MEMBASE1_CACHED

          sw          t1,BONITO_PCIMEMBASECFG(bonito)
          /* enable configuration cycles now */
          lw          t0,BONITO_BONPONCFG(bonito)
          and          t0,~BONITO_BONPONCFG_CONFIG_DIS
          sw          t0,BONITO_BONPONCFG(bonito)

          PRINTSTR("Init SDRAM Done!\r\n");
阅读(2267) | 评论(0) | 转发(0) |
0

上一篇:mount/unmount命令

下一篇:fstab文件的作用

给主人留下些什么吧!~~