2014年5月12日 星期一

Build new linux kernel

build linux kernel

yum install kernel-devel
yum install make
yum install gcc
yum install ncurses-devel

make menuconfig

 make bzImage

make modules

 make modules_install

make install


vim /etc/grub.conf 

新的kernel 在gurb裡變成了第一個,因此將default 設成0

default=0

reboot


uname -a 就會看build kernel之前的不同

2014年5月10日 星期六

qemu+kvm create VM

qemu-img create -f qcow2 image0 20G

qemu-system-x86_64 --enable-kvm image0 -m 2048 -smp 2 -netdev tap,id=mynet0 -device virtio-net-pci,netdev=mynet0 -cdrom /home/qemutest/CentOS-6.4-x86_64-minimal.iso -boot d


vncviewer :5900


qemu-system-x86_64 --enable-kvm image0 -m 2048 -smp 2 -netdev tap,id=mynet0 -device virtio-net-pci,netdev=mynet0

make kernel 出現問題: /root/linux-2.6.32.61/usr/include/asm/ptrace.h:5: included file 'linux/linkage.h' is not exported make[2]: *** [/root/linux-2.6.32.61/usr/include/asm/.check] Error 123 make[1]: *** [headers_check] Error 2 make: *** [vmlinux] Error 2

解決方法: vim ./arch/x86/include/asm/ptrace.h 改

//#include <linux/linkage.h>    /* For asmregparm */


//extern asmregparm long syscall_trace_enter(struct pt_regs *);
//extern asmregparm void syscall_trace_leave(struct pt_regs *);
extern long syscall_trace_enter(struct pt_regs *);
extern void syscall_trace_leave(struct pt_regs *);

2014年5月9日 星期五

修改QEMU virtio記錄

修改版本為1.7.1

目前在

hw/virtio


新增 virtio-mydevice.h, virtio-mydevice.c


include/hw/virtio/virtio-mydevice.h
新增


typedef struct VirtIOmydevice {
    VirtIODevice parent_obj;
    //VirtQueue *ivq, *dvq, *svq;
    VirtQueue *vq[2];  //new
    uint32_t num_pages;
    uint32_t actual;
    uint64_t stats[VIRTIO_MYDEVICE_S_NR];
    VirtQueueElement stats_vq_elem;
    size_t stats_vq_offset;
    QEMUTimer *stats_timer;
    int64_t stats_last_update;
    int64_t stats_poll_interval;
    int status; //new

} VirtIOmydevice;

hw/virtio/virtio-mydevice.c 的 virtio_mydevice_device_init() 裡面去add virtio queue:
s->vq[0] = virtio_add_queue(vdev, 1024, virtio_mydevice_handle_output); 
s->vq[1] = virtio_add_queue(vdev, 1024, virtio_mydevice_handle_output); 
然後在virtio_mydevice_handle_output裡面去virtqueue_pop, virtqueue_push

CUDA程式執行流程(CUDA Programming Flow)

在上一篇簡單介紹了CUDA是什麼之後,我們來講講CUDA基本的programming flow,

圖一:CUDA Programming Flow
如圖一流程:

1. 先在CPU端準備好data
2. 把data從GPU端傳送到GPU端
3. 呼叫GPU function運算
4. GPU執行程式
5. 把data從GPU傳送到CPU


簡單的來說就是我GPU需要你CPU先給我資料,GPU運算完後再把資料丟給你CPU,圖二我們搭配其CUDA 常用的API來對這流程作說明:

圖二:CUDA Programming Flow - API

一、配置Device Memory
  • Device為GPU端
  • 使用cudaMalloc API


二、將Host端資料Copy至Device端的Memory
  • Host端CPU端
  • 使用cudaMemcpy API
  • 參數設定:cudaMemcpyHostToDevice


三、執行Kernel
  • 可執行多個Kernel
  • Kernel所指為GPU所處理的函式

四、將Device端運算完之資料Copy回Host端
  • 使用cudaMemcpy API
  • 參數設定:cudaMemcpyDeviceToHost

五、釋放所分配之記憶體
  • 使用cudaFree API

以上是CUDA程式運算流程以及常用的API,下一篇我們再來仔細討論如何使用這些API,並撰寫簡單的code


什麼是CUDA?

CUDA簡寫為(Compute Unified Device Architecture,統一計算架構),以下為wiki上的解釋:

由NVIDIA所推出的一種整合技術,是該公司對於GPGPU的正式名稱。透過這個技術,使用者可利用NVIDIA的GeForce 8以後的GPU和較新的Quadro GPU進行計算。亦是首次可以利用GPU作為C-編譯器的開發環境。NVIDIA行銷的時候,往往將編譯器與架構混合推廣,造成混亂。實際上,CUDA可以相容OpenCL或者自家的C-編譯器。無論是CUDA C-語言或是OpenCL,指令最終都會被驅動程式轉換成PTX代碼,交由顯示核心計算。
簡單來講,我習慣把CUDA就看成與OpenCL一樣的地位,基本上CUDA就是個C/C++的extend語法,使用者可以使用一些run time API去直接對GPU做操作,真正底層由nvcc compiler 把CUDA code轉成PTX code, 再由GPU driver將PTX 轉成binary code到GPU 硬體運算單元去執行,因此上面這段wiki最後面有點小錯誤,應該是compiler 轉成PTX code再讓driver去handle底層binary code,因為PTX code只是個pseudo-assembly language噢~

圖一: CUDA Software Stack




C qsort() using struct

#include <stdio.h>
#include <stdlib.h>

struct mytype
{
    struct mytype *next;
    int key;
};

struct mytype *mysort;


int cmpfunc (const void * a, const void * b)
{
    struct mytype* aa = (struct mytype*)a; 
    struct mytype* bb = (struct mytype*)b; 
   
    return (aa->key - bb->key);
}

int main()
{
    mysort = (struct mytype*)malloc(sizeof(struct mytype*)*10);
    int i;
    for( i = 0; i < 10; i++)
    {   
        mysort[i].key = 10-i;
    }   
   printf("before sorting\n");

    for( i = 0; i < 10; i++)
        printf("%d ", mysort[i].key);
    printf("\n");

    qsort(mysort, 10, sizeof(struct mytype), cmpfunc);

    printf("after sorting\n");
    for( i = 0; i < 10; i++)
        printf("%d ", mysort[i].key);
    printf("\n");


    return 0;
}

2014年5月8日 星期四

在GPU kernel function裡exit()

在CPU寫code我們可以用exit(1); 跳出 如果在GPU kernel function裡可以用asm("trap;");

blog如何嵌入程式碼

在HTML前面加這個:

<script src="https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js"></script>

把程式碼貼到: http://formatmysourcecode.blogspot.tw/ 格式轉完後貼到HTML裡 然後要加的tag這裡有寫: http://google-code-prettify.googlecode.com/svn/trunk/README.html

如何掛載Linux Module

hello module example
#include <linux/module.h> 
#include <linux/init.h> 
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void) 
{ 
    printk(KERN_ALERT "Hello, world/n"); 
    return 0;  
} 
static void hello_exit(void) 
{ 
    printk(KERN_ALERT "Goodbye, cruel world/n"); 
} 
module_init(hello_init); 
module_exit(hello_exit);


Makefile:
KVER = /lib/modules/`uname -r`/build
CURDIR = $(shell pwd)
# Kernel modules
obj-m := hello.o
build: kernel_modules
kernel_modules:
    $(MAKE) -C $(KVER) M=$(CURDIR) modules
clean:

    $(MAKE) -C $(KVER) M=$(CURDIR) clean




掛載:

# insmod hello.ko

查看是否有掛起來:
# lsmod |grep hello

卸載
# rmmod hello.ko






yum update出現 14: PYCURL ERROR 6 - "Couldn't resolve host 'mirrorlist.centos.org'"

[root@guest0 ~]# yum update
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=6&arch=x86_64&repo=os error was
14: PYCURL ERROR 6 - "Couldn't resolve host 'mirrorlist.centos.org'"
Error: Cannot find a valid baseurl for repo: base
解決方法

vi /etc/resolv.conf

nameserver 8.8.8.8
nameserver 8.8.4.4
nameserver 127.0.0.1

重啟網路就ok

QEMU網路問題解決

解決之前網路guest連不到host問題,

可設定開機啟動以下指令:
ip addr add 10.222.112.1 dev br0

ip route add 10.222.112.0/24 dev br0

修改iptables:

iptables -t nat -A POSTROUTING -o br0 -s 10.222.112.0/24 -j MASQUERADE

iptables -I INPUT -i br0 -p icmp -s 10.222.112.0/255.255.255.0 -j ACCEPT

修改:

/etc/qemu-ifup

#!/bin/sh
bridge=br0ifconfig $1 0.0.0.0 promisc up
brctl addif $bridge $1

/etc/qemu-ifdown

#!/bin/sh
bridge=br0
brctl delif $bridge $1 || true
ifconfig $1 down

指令:
qemu-system-x86_64 --enable-kvm image_file -m 2048 -smp 2 -netdev tap,id=mynet0 -device virtio-net-pci,netdev=mynet0

在guest內:



 vi /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0
HWADDR=52:54:00:12:34:56
IPADDR=10.222.112.2
GATEWAY=10.222.112.1
NETMASK=255.255.255.0
TYPE=Ethernet
UUID=3f979381-18b8-4a3e-8221-2f8379c8b79a
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=none