2008年9月21日 星期日

Implement mmap( ) in driver

其實實作mmap很簡單, 只要先知道幾個structure:task_struct, mm_struct, vm_area_struct. 然後想想mmap應該會做些什麼事情.
首先, 要map一個file必須先打開一個file, 然後想把某一段在這個device可控管的memory給user用到, 要填page table的對應, 其實只要知道user的virtual address, 及要被map的physical address, size就可以做到 ; 而這也就是remap_pfn_range()所做的事.
然而physical address 要怎麼得到呢?
這就要看要被map給user的memory是怎麼得來的, 而且這一段實體位置也必須是連續的, 所以當memory是不連續的時候就不能用remap_pfn_range()了.
kmalloc, get_free_page要到的都是連續的logical address, 所以可以用virt_to_phys來轉換拿到physical address. 而vmalloc則不適用.
IO的話, 其實在driver知道要access的實體位置, 所以也是用這個function時做就可以了.
例子 :
我有一個character device, 掌管4kbtyes的資料, 要給user去寫.
struct simple_dev{
unsigned int* data;
struct cdev scdev;
};
我在initialize的時候跟kernel要memory:
SimpleDevs[0].data = kmalloc(4096, GFP_KERNEL);
memset(SimpleDevs[0].data, 0, 4096);
然後open的時候, 把simple_dev填到file的private data:
dev = container_of(inode->i_cdev, struct simple_dev, scdev);
filp->private_data = dev;
mmap時, 就可以從file descriptor拿到device的data了, 把physical address轉換出來當remap_pfn_range的參數, 就可以map給user了:
dev = filp->private_data;
vma->vm_pgoff = (virt_to_phys(dev->data)) >> PAGE_SHIFT;

if (remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff,
vma->vm_end - vma->vm_start,
vma->vm_page_prot))
return -EAGAIN;

vma->vm_private_data = filp->private_data;
vma->vm_ops = &simple_remap_vm_ops;
simple_vma_open(vma);

2008年8月31日 星期日

Setting up Linux on ARM platform

1. booting from tftp
a. install atftp, configure conf.d/atftp(Root mode = 777)
b. setting uboot.
bootcmd = tftpboot 0x7fc0 uImage ; bootm

2. NFSRoot
a. download full_cramfs from ARM office website
http://www.arm.com/products/os/linux_download.html
b. mount -t cramfs -o loop "filename" /mnt
c. copy "bin, dev, etc, lib, root, sbin, usr, var" to ARMRoot
d. creating "home, proc, opt, sys, tmp"
e. configure nfs server
/etc/exports: /home/armroot 192.169.77.0/24(rw, no_root_sqush, subtree_check)
f. setting uboot.
bootargs = root=/dev/nfs rw,iocharset=cp950 nfsroot=serverip:/home/armroot ip=localip(can be dhcp)
mem=128M console=ttyAMA0

3. developing driver
a. download kernel source and patch from above website.
b. build it.

P.S.
rebuild linux kernel --
http://www.arm.com/support/faqdev/14409.html

2008年7月29日 星期二

Gentoo linux on PS3

想用來練習parallel programming及研究SPUFS,
灌的方式非常簡單, 這都要感謝已經很多人的努力 (這些人真的很厲害ㄋㄟ) :^.^
http://overlays.gentoo.org/proj/cell

由於office的螢幕還沒來, 所以要先灌完在拿過去; 又由於office只有DHCP, DHCP下不能設兩個ip...
Darling就在local.start裡面設定我要的static ip就解決沒螢幕連進去的問題哩!!
local.start是開機程序裡最後執行的檔案~~~

灌的過程中也學習到原來有很多分支gentoo portage......叫做Overlay..

安裝Cell的SDK(multi-core acceleration)

toolchain都包成rpm形式 (有binary也有source):
http://www.bsc.es/projects/deepcomputing/linuxoncell/

而在 alphawork中經過認證下載的.iso裡面主要是example跟寫好的一些library
http://www-128.ibm.com/developerworks/power/cell/pkgdownloads.html

2008年2月14日 星期四

linux直立螢幕該怎麼設定

分成兩個部份:
1.xorg
看driver有沒有支援。nvidia有支援,所以很好設,可以man nv得到說明。
2.console
設定framebuffer,kernel要編,nvidia的是nvidiafb。
在menu.lst上設定成
kernel /boot/vmlinuz root=/dev/hda2 video=nvidiafb:1280x1024 fbcon=rotate:3
解析度目前設定不成功,但rotate有成功。

2008年1月16日 星期三

Deadlock的問題

面試很愛的問題之ㄧ~
之前都不會回答 , 實在是沒什麼感覺 :P

直到前幾天, 我可愛的minix 一值hang在某各位置, 看assembly發現它schedule到idle,
這表示qeueue裡面沒有東西可以跑了, 表示大家都跑去睡覺了........表示Deadlock了!!

pg->tty->pg(睡覺中).....tty也去睡覺....然後deadlock....

2008年1月13日 星期日

performance update

100000 times fork(241):
15.68 1.00 7.93
15.41 1.35 7.78
15.51 1.06 8.08
15.63 1.16 7.95
15.75 1.33 7.85
==============================
重新安裝minix,全部重測
(3.1.2a):
fork:
10.26 real 0.11 user 8.38 sys 33.45 0.43 27.63
10.30 real 0.20 user 8.40 sys 33.40 0.46 27.70
10.28 real 0.13 user 8.53 sys 33.46 0.53 27.66
10.30 real 0.13 user 8.56 sys 33.28 0.75 26.96
10.31 real 0.13 user 8.45 sys 33.28 0.48 27.98
10.30 real 0.15 user 8.28 sys
10.31 real 0.13 user 8.48 sys
matrix:
33.43 real 33.33 user 0.10 sys
33.41 real 33.40 user 0.01 sys
33.66 real 33.60 user 0.06 sys
33.65 real 33.61 user 0.03 sys
(v170 3.1.2ar0):
fork:
11.33 real 0.26 user 8.81 sys 38.46 0.83 31.26
11.31 real 0.21 user 9.00 sys 38.61 0.68 31.21
11.28 real 0.26 user 8.86 sys 38.36 0.68 30.98
11.28 real 0.18 user 9.13 sys 38.40 0.95 31.11
11.31 real 0.16 user 8.98 sys 38.40 0.63 31.56
matrix:
33.58 real 33.55 user 0.03 sys
33.56 real 33.55 user 0.01 sys
33.56 real 33.53 user 0.03 sys
(v182 3.1.2ar1)
fork:
12.73 real 0.45 user 10.36 sys 42.40 1.61 34.31
12.73 real 0.40 user 10.18 sys 42.41 1.31 34.31
12.75 real 0.36 user 10.25 sys 42.45 1.75 34.35
12.75 real 0.40 user 10.33 sys 42.46 1.26 35.40
12.76 real 0.38 user 10.18 sys 42.51 1.13 34.75
matrix
33.35 real 33.35
33.36 33.36
33.41 33.41
(nophys 3.1.2ar2) (nophys 3.1.2ar216)
fork: 100000 times:
4.63 real 0.30 user 2.48 sys
4.65 real 0.30 user 2.30 sys
4.66 real 0.26 user 2.45 sys
4.56 real 0.33 user 2.28 sys
4.65 real 0.30 user 2.06 sys
matrix
33.86 real 33.75 user 0.11 sys
33.86 real 33.81 user 0.05 sys
33.86 real 33.76 user 0.10 sys

==========================================================
今天發現wbinvd跟page內部的cache disable在我的程式中都是不必要的存在><"
拿掉wbinvd(release/3.1.2ar88 ,把大部分copy都交給pg做....)
30000 times fork()
real user sys
4.91 0.36 2.51
5.00 0.40 2.60
4.90 0.25 2.75
4.91 0.38 2.38
4.93 0.25 2.56
matrix
real user sys
33.35 33.18 0.15
33.43 33.36 0.06
33.45 33.40 0.05
33.51 33.26 025

===================================================
30000 times fork
pager+MM server:
1:17.76 5.81 41.81

matrix
36.03 34.03 1.96