顯示具有 Linux 系統建置篇 標籤的文章。 顯示所有文章
顯示具有 Linux 系統建置篇 標籤的文章。 顯示所有文章

星期五, 5月 25, 2007

Linux 系統設定檔

inittab

/etc/inittab

  1. init 的腳本

  2. 呼叫初始化硬體的腳本 /etc/rc.d/rc.sysinit

  3. 呼叫初始化系統參數的腳本 /etc/init.d/rcS

  4. 啟動 bash

/etc/rc.d/rc.sysinit

初始化硬體

/etc/rc.d/rc.modules

網路驅動程式在此啟動

/etc/init.d/rcS

初始化系統參數

/etc/init.d/umountfs

copy kernel...OK

copy rootfs...OK
Uncompressing Linux................................................ done, booting the kernel.
Linux version 2.4.18-rmk7-swl8 (root@MDS-Linux-01) (gcc version 2.95.3 20010315 (release)) #3 三 10月 27 14:02:49 CST 24
CPU: SAMSUNG S3C2410(Arm920T)sid(wb) revision 0
Machine: create ARM920T-S3C2410
On node 0 totalpages: 16384
zone(0): 16384 pages.
zone(1): 0 pages.
zone(2): 0 pages.
Kernel command line: root=/dev/ram0 console=ttyS0
Calibrating delay loop... 101.37 BogoMIPS
Memory: 64MB = 64MB total
Memory: 52600KB available (1299K code, 286K data, 44K init)
Dentry-cache hash table entries: 8192 (order: 4, 65536 bytes)
Inode-cache hash table entries: 4096 (order: 3, 32768 bytes)
Mount-cache hash table entries: 1024 (order: 1, 8192 bytes)
Buffer-cache hash table entries: 4096 (order: 2, 16384 bytes)
Page-cache hash table entries: 16384 (order: 4, 65536 bytes)
POSIX conformance testing by UNIFIX
Linux NET4.0 for Linux 2.4
Based upon Swansea University Computer Society NET3.039
Initializing RT netlink socket
Starting kswapd
JFFS version 1.0, (C) 1999, 2000 Axis Communications AB
JFFS2 version 2.1. (C) 2001 Red Hat, Inc., designed by Axis Communications AB.
l3 S3C2410 Adapter Initialized
ttyS0 at MEM 0xe0000000 (irq = 52) is a S3C2410
ttyS1 at MEM 0xe0004000 (irq = 55) is a S3C2410
pty: 256 Unix98 ptys configured
Installing S3C2410 RTC
S3C Real Time Clock driver v1.00
block: 128 slots per queue, batch=32
RAMDISK driver initialized: 16 RAM disks of 8192K size 1024 blocksize
loop: loaded (max 8 devices)
S3C2410 UDA1341 / IIS initialized
usb.c: registered new driver hub
usb-ohci.c: USB OHCI at membase 0xd9000000, IRQ 26
usb.c: new USB bus registered, assigned bus number 1
hub.c: USB hub found
hub.c: 2 ports detected
NET4: Linux TCP/IP 1.0 for NET4.0
IP Protocols: ICMP, UDP, TCP
IP: routing cache hash table of 512 buckets, 4Kbytes
TCP: Hash tables configured (established 4096 bind 4096)
NET4: Unix domain sockets 1.0/SMP for Linux NET4.0.
NetWinder Floating Point Emulator V0.95 (c) 1998-1999 Rebel.com
RAMDISK: ext2 filesystem found at block 0
RAMDISK: Loading 8192 blocks [1 disk] into ram disk... done.
Freeing initrd memory: 10240K
VFS: Mounted root (ext2 filesystem).
Freeing init memory: 44K
INIT: version 2.78 booting
eth0: cs8900 rev K(3.3 Volts) found at 0xf0000300
cs89x0 media RJ-45, IRQ 37
INIT: Entering runlevel: 2
EXT2-fs: Unrecognized mount option
EXT2-fs: Unrecognized mount option
mount: / not mounted already, or bad option
Starting Network
bash-2.04#


星期六, 5月 12, 2007

Linux 移植 (S3C2410)

V1.0

copyright@2006

email: mesmerli@hotmail.com

目錄結構:

  • rootfs
  • linux
    • include
      • asm-arm
        • arch-creator-s3c2410
          • vmalloc.h
          • uncompress.h.org
          • uncompress.h
          • timex.h
          • time.h
          • system.h
          • s3c2410ASM.h
          • s3c2410_ts.h
          • s3c2410_org.h
          • s3c2410.h
          • power.h
          • memory.h
          • keyboard.h
          • irqs.h
          • irq.h
          • io.h
          • hardware.h
          • dma.h
    • fs
      • binfmt_elf.c
    • drivers
      • net
        • Makefile
        • Config.in
    • arch
      • arm
        • mach-creator-s3c2410
          • Sleep.S
          • power_func.c
          • power.c
          • pcipool.h
          • pcipool.c
          • mm.c (映射I/O位址)
          • Makefile
          • leds.c
          • kapmd.c
          • irq.c (設定中斷向量)
          • dma.c
          • arch.c (設定實體記憶體位址)
          • apm.c
        • kernel
          • irq.c (matched)
        • def-configs
          • create-2410-ramdisk (Make XConfig 用的設定檔)
        • boot
          • compressed
            • head-s3c2410.S (啟動程式碼)
        • Makefikle
        • config.in
    • Makefile
    • .config
  • ext2

跨平台編譯

/usr/src/creator/s3c2410/linux/Makefile

對 ARM 指令集的編譯要使用 arm-linux-gcc

記憶體位址設定

/usr/src/creator/s3c2410/linux/arch/arm/Makefile

VA 0xC0000000 (3GB) 以上為 Kernel Space,對應到 PA 0x30000000 的 SDRAM

VA Virtual Address

PA Physical Address


arch/arm/vmlinux-armv.ld

linker ld 的腳本


TEXTADDR Kernel 在 VA 的執行位址
ZTEXTADDR 解壓縮程式在 RAM 的位置 (PA)
ZRELADDR 解壓縮後的 Kernel 在 RAM 的位置 (PA)


PHYS_OFFSET SDRAM 的位址

設定 RAM 的大小 與 週邊暫存器在 VA 的對應位址

arch
  • arm
    • mach-creator-s3c2410
      • arch.c

static void __init
fixup_s3c2410(struct machine_desc *desc, struct param_struct *params,
char **cmdline, struct meminfo *mi)
{
/*********
* nGCS6 0 (SDRAM Bank 1) has one memory bank at start address 0x30000000
* Memory Size 64Mbye and
* becasue nCCS7 (SDRAM Bank 2) has a flexible start address ,
* we don't need bank[].node if we would use 128Mbyte Memory
*
*/
mi->bank[0].start = PA_SDRAM_BASE;
mi->bank[0].size = S3C2410_MEM_SIZE;
mi->bank[0].node = 0;
mi->nr_banks = 1;

#ifdef CONFIG_BLK_DEV_RAM
ROOT_DEV = MKDEV(RAMDISK_MAJOR,0);

#ifdef CONFIG_BLK_DEV_RAM_SIZE
setup_ramdisk( 1, 0, 0, CONFIG_BLK_DEV_RAM_SIZE);
#else
setup_ramdisk( 1, 0, 0, BLK_DEV_RAM_SIZE);
#endif

#ifdef CONFIG_BLK_DEV_INITRD
setup_initrd( __phys_to_virt(RAMDISK_DN_ADDR), ZIP_RAMDISK_SIZE);
#endif

#endif
}

static void __init s3c2410_map_io(void)
{
HWs3c2410_map_io();
}


MACHINE_START(S3C2410, "create ARM920T-S3C2410")
MAINTAINER("microtime")
BOOT_MEM(PA_SDRAM_BASE,PA_UART_BASE,VA_UART_BASE)
FIXUP(fixup_s3c2410)
MAPIO(s3c2410_map_io)
INITIRQ(s3c2410_init_irq)
MACHINE_END

/usr/src/creator/s3c2410/linux/include/asm-arm/arch-s3c2410/s3c2410.h
實際定義週邊暫存器基底位址的地方


arch
  • arm
    • mach-creator-s3c241
      • mm.c

static struct map_desc standard_io_desc[] __initdata = {
/* virtual physical length domain r w c b */
{ VA_MEM_CTR_BASE,PA_MEM_CTR_BASE ,SZ_1M ,DOMAIN_IO, 0,1,0,0},
{ VA_USB_BASE ,PA_USB_BASE ,SZ_1M ,DOMAIN_IO, 0,1,0,0},
{ VA_INT_BASE ,PA_INT_BASE ,SZ_1M ,DOMAIN_IO, 0,1,0,0},
{ VA_DMA_BASE ,PA_DMA_BASE ,SZ_1M ,DOMAIN_IO, 0,1,0,0},
{ VA_CKPO_BASE ,PA_CKPO_BASE ,SZ_1M ,DOMAIN_IO, 0,1,0,0},
{ VA_LCD_BASE ,PA_LCD_BASE ,SZ_1M ,DOMAIN_IO, 0,1,0,0},
{ VA_NAND_BASE ,PA_NAND_BASE ,SZ_1M ,DOMAIN_IO, 0,1,0,0},
{ VA_UART_BASE ,PA_UART_BASE ,SZ_1M ,DOMAIN_IO, 0,1,0,0},
{ VA_TIMER_BASE ,PA_TIMER_BASE ,SZ_1M ,DOMAIN_IO, 0,1,0,0},
{ VA_UD_BASE ,PA_UD_BASE ,SZ_1M ,DOMAIN_IO, 0,1,0,0},
{ VA_WD_BASE ,PA_WD_BASE ,SZ_1M ,DOMAIN_IO, 0,1,0,0},
{ VA_IIC_BASE ,PA_IIC_BASE ,SZ_1M ,DOMAIN_IO, 0,1,0,0},
{ VA_IIS_BASE ,PA_IIS_BASE ,SZ_1M ,DOMAIN_IO, 0,1,0,0},
{ VA_IO_PORT_BASE,PA_IO_PORT_BASE ,SZ_1M ,DOMAIN_IO, 0,1,0,0},
{ VA_RTC_BASE ,PA_RTC_BASE ,SZ_1M ,DOMAIN_IO, 0,1,0,0},
{ VA_ADC_BASE ,PA_ADC_BASE ,SZ_1M ,DOMAIN_IO, 0,1,0,0},
{ VA_SPI_BASE ,PA_SPI_BASE ,SZ_1M ,DOMAIN_IO, 0,1,0,0},
{ VA_SD_BASE ,PA_SD_BASE ,SZ_1M ,DOMAIN_IO, 0,1,0,0},
{ VA_CS8900A_BASE,PA_CS8900A_BASE ,SZ_32M ,DOMAIN_IO, 0,1,0,0},

LAST_DESC
};


extern void __init HWs3c2410_map_io(void)
{
iotable_init(standard_io_desc);
}

啟動程式碼設定

中斷系統設定

arch
  • arm
    • mach-creator-s3c241
      • irq.c

s3c2410_init_irq(void) {
int irq;

request_resource(&iomem_resource, &irq_resource);
request_resource(&iomem_resource, &eint_resource);

/* disable all IRQs */
rINTMSK = 0xffffffff;
rINTSUBMSK = 0x7ff;
rEINTMSK = 0x00fffff0;

/* all IRQs are IRQ, not FIQ
0 : IRQ mode
1 : FIQ mode
*/
rINTMOD = 0x00000000;

/* clear Source/Interrupt Pending Register */
rSRCPND = 0xffffffff;
rINTPND = 0xffffffff;
rSUBSRCPND = 0x7ff;
rEINTPND = 0x00fffff0;

/* Define irq handler */
for (irq=0; irq < NORMAL_IRQ_OFFSET; irq++) {
irq_desc[irq].valid = 1;
irq_desc[irq].probe_ok = 1;
irq_desc[irq].mask_ack = s3c2410_mask_ack_irq;
irq_desc[irq].mask = s3c2410_mask_irq;
irq_desc[irq].unmask = s3c2410_unmask_irq;
}

irq_desc[IRQ_RESERVED6].valid = 0;
irq_desc[IRQ_RESERVED24].valid = 0;

irq_desc[IRQ_EINT4_7].valid = 0;
irq_desc[IRQ_EINT8_23].valid = 0;

irq_desc[IRQ_EINT0].valid = 0;
irq_desc[IRQ_EINT1].valid = 0;
irq_desc[IRQ_EINT2].valid = 0;
irq_desc[IRQ_EINT3].valid = 0;

for (irq=NORMAL_IRQ_OFFSET; irq < EXT_IRQ_OFFSET; irq++) {
irq_desc[irq].valid = 0;
irq_desc[irq].probe_ok = 1;
irq_desc[irq].mask_ack = EINT4_23mask_ack_irq;
irq_desc[irq].mask = EINT4_23mask_irq;
irq_desc[irq].unmask = EINT4_23unmask_irq;
}

for (irq=EXT_IRQ_OFFSET; irq < SUB_IRQ_OFFSET; irq++) {
irq_desc[irq].valid = 1;
irq_desc[irq].probe_ok = 1;
irq_desc[irq].mask_ack = SUB_mask_ack_irq;
irq_desc[irq].mask = SUB_mask_irq;
irq_desc[irq].unmask = SUB_unmask_irq;
}
}

Make xconfig 選單設定

drivers
  • net
    • Config.in

if [ "$CONFIG_ARCH_CAMELOT" = "y" ]; then
tristate ' Altera Ether00 support' CONFIG_ETHER00
fi

if [ "$CONFIG_NET_PCI" = "y" ]; then
dep_tristate ' AMD PCnet32 PCI support' CONFIG_PCNET32 $CONFIG_PCI
dep_tristate ' Adaptec Starfire support (EXPERIMENTAL)' CONFIG_ADAPTEC_STARFIRE $CONFIG_PCI $CONFIG_EXPERIMENTAL
if [ "$CONFIG_ISA" = "y" -o "$CONFIG_EISA" = "y" ]; then
dep_tristate ' Ansel Communications EISA 3200 support (EXPERIMENTAL)' CONFIG_AC3200 $CONFIG_EXPERIMENTAL
fi

dep_tristate ' Apricot Xen-II on board Ethernet' CONFIG_APRICOT $CONFIG_ISA
dep_tristate ' CS89x0 support' CONFIG_CS89x0 $CONFIG_ISA
dep_tristate ' CERF CS89x0 support' CONFIG_CERF_CS8900A $CONFIG_ISA
dep_tristate ' DECchip Tulip (dc21x4x) PCI support' CONFIG_TULIP $CONFIG_PCI


drivers
  • net
    • Makefile

obj-$(CONFIG_CS89x0) += cs89x0.o
obj-$(CONFIG_CERF_CS8900A) += cs8900a.o
obj-$(CONFIG_MACSONIC) += macsonic.o
obj-$(CONFIG_MACMACE) += macmace.o
obj-$(CONFIG_MAC89x0) += mac89x0.o
obj-$(CONFIG_TUN) += tun.o
obj-$(CONFIG_ETHER00) +=ether00.o
obj-$(CONFIG_DL2K) += dl2k.o

使用 Domingo 除錯核心

Linux 檔案系統實驗

V1.1

copyright@2006

email: mesmerli@hotmail.com

Linux 檔案系統

Linux 支援許多不同種類的檔案系統,檔案系統透過區塊類型驅動程式操作磁碟或快閃記憶體。本文介紹如何設定 JFFS2 檔案系統與 MTD 區塊驅動程式。

RAM disk

燒 RAMDISK image 至 NAND Flash

什麼是 MTD driver

MTD 是 Memory Technology Devices 的縮寫,是一種為 Flash File System 設計的區塊驅動程式。每組 MTD 驅動程式包含一個字元類型與區塊類型的驅動程式。

MTD RAMDISK 實驗步驟

Host 端

Linux 核心組態設定
  1. 使用 make xconfig 設定 MTD 驅動程式 與 JFFS2
  2. 選取 Memory Technology Deiver (MTD) -> Self-contained MTD devier drivers -> Test driver using RAM
  3. Test driver using RAM 設定為 y。(編譯驅動程式進入核心)
  4. MTDRAM device size in KiB 設定為 4096
  5. MTDRAM erase block size in KiB 設定為 128
  6. SRAM Hexadecimal Absolute position or 0 設定為 0
  7. 選取 File Systems -> Journalling Flash File System v2 (JFFS2) support
  8. Journalling Flash File System v2 (JFFS2) support 設定為 y
  9. 選取 Network device support -> Ethernet (10 or 100Mbit) -> CS89x0 support 設定為 y

重新編譯 Linux 核心

  1. make dep
  2. make clean
  3. make zImage

root file system 組態設定。

建構新的 root file system (RAMDISK)

    1. dd if=/dev/zero of=ext2new bs=1k count=8192
    2. mke2fs -F -m0 -i 2000 ext2new
    3. mkdir /mnt/loop
    4. mkdir /mnt/looporg
    5. mount -w -o loop ext2new /mnt/loop
    6. mount -w -o loop ext2org /mnt/looporg
    7. cp -dpR /mnt/looporg/. /mnt/loop/.
    8. cd /mnt/loop/dev (在 /dev 檔案夾下,建立 MTD 裝置節點)
    9. mknod -m 777 mtd0 c 90 0
    10. mknod -m 777 mtdblock0 b 31 0
    11. cd /
    12. umount -l /mnt/loop
    13. gzip -9 ext2new

重新燒錄 Linux 核心與 root file system。

準備 JFFS2 檔案系統影像檔

  1. mkfs.jffs2 -r rootfs/ -o /usr/src/creator/nfs/rootfs-jffs2.img

Taget 端

  1. 使用 NFS 的方式,mount host 端的目錄,以存取剛剛建立的 JFFS2 檔案系統影像檔。
    1. mount 192.168.0.200:/usr/src/creator/nfs /mnt
  2. 寫入 JFFS2 檔案系統影像檔至 MTD 所管理的記憶體
    1. cat /mnt/rootfs-jffs2.img > /dev/mtd0
  3. mount JFFS2 檔案系統
    1. mount -t jffs2 /dev/mtdblock0 /mnt
  4. 讀寫 /mnt 目錄,此時 /mnt 目錄的內容即為透過 MTD 操作的 JFFS2 檔案系統。

修改 MTD driver

/usr/src/creator/s3c2410/linux/drivers/mtd/maps/cfi_flagadm.c

修改 JFFS2 的 MTDBLOCK 設備編號 (for non-root FS)

/usr/src/creator/s3c2410/linux/include/linux/mtd/mtd.h