리눅스 드라이버의 물리주소와 가상 주소

출처: http://chammoru.egloos.com/v/4168312

다른 프로세스의 메모리 공간 접근
프로세스가 시스템 호출을 통해 커널 모드로 진입하면 프로세스 메모리 공간은 커널의 메모리 공간으로 바뀐다. 커널 모드 상태의 프로세스는 수퍼바이저 권한을 갖기 때문에 시스템 내의 모든 메모리 공간에 접근할 수 있다. 그래서 이 경우에는 다른 프로세스의 메모리 공간에 접근할 수 있는데, 이때 직접 접근은 안 되고, VM에서 제공하는 특정 함수를 통해 접근할 수 있다.

리눅스 메모리 관리
. PGD (Page Directory) : pgt_t
. PMD (Page Mid level Directory) : pmd_t
. PTE (Page Table Entry) : pte_t
* 참고 : PMD는 대부분의 리눅스 시스템에 형식적으로만 존재.

물리 주소 공간을 커널 주소 공간으로 매핑
Memory Mapped I/O 방식의 물리적 주소 공간을 커널에서 사용 가능한 가상 주소로 매핑하거나 해제할 때는 다음과 같은 함수 사용한다.

// 아래 두 함수가 성공적으로 mapping되면 가상 주소의 선두 주소가 반환
void * ioremap(unsigned long offset, unsigned long size); // offset이 물리주소, size는 PAGE_SIZE의 배수
void * ioremap_nocache(unsigned long offset, unsigned long size); // offset이 물리주소, size는 PAGE_SIZE의 배수
void iounmap(void * addr); // addr은 가상주소

I/O 물리 주소와 가상 주소간의 변환 함수
리눅스 커널은 부팅 단계에서 시스템을 제어하기 위해 사용하는 시스템의 모든 I/O 제어 물리 주소나 램 영역의 물리 주소를 MMU 테이블로 미리 작성한다. 이렇게 부팅 단계에서 고정되어 할당된 메모리 주소 영역을 예약 영역(reserved area)이라고 한다. 예약된 물리 주소 영역은 PAGE_OFFSET 매크로 상수값을 이용해 물리 주소와 가상 주소간에 변환을 한다. 상수 연산만으로 물리 주소를 가상 주소로 만들기 위해 사용하는 상수와 매크로는 #include 에 정의된다.

부팅 시 예약된 주소 공간 이외에 ioremap(), kmalloc() 함수에서 반환하는 가상 주소도 PAGE_OFFSET을 이용해 물리 주소와 가상 주소로 변한된다. 이 매크로 상수를 이용하여 주소 변환을 하는 함수들은 다음과 같다.

unsigned long virt_to_phys(volatile void * address);
void * phys_to_virt(unsigned long address);
unsigned long virt_to_bus(volatile void * address);
void * bus_to_virt(unsigned long address);

virt_to_phys(), phys_to_virt()
virt_to_phys() 함수는 가상 주소를 물리 주소로 바꾸고, phys_to_virt() 함수는 물리 주소를 가상 주소로 바꾼다. 그러나 phys_to_virt() 함수는 ioremap()함수와 같은 기능을 수행하지 않는다. ioremap()함수는 요구된 물리 주소로 시작하는 영역을 커널 모드에서 사용할 수 있도록 가상 주소 공간으로 등록하지만, phys_to_virt()함수는 PAGE_OFFSET과 같은 값을 이용하여 변환 처리만 하기 때문이다. 그래서 virt_to_phys()와 phys_to_virt()함수는 커널에서 사용할 수 있도록 등록된 가상 주소와 물리 주소에 대해 사용해야 한다.

virt_to_phys(), phys_to_virt()
virt_to_phys()와 virt_to_bus() 함수는 대부분의 커널이 동작하는 시스템에 대해 동일한 기능을 수행한다. phys_to_virt()와 bus_to_virt()함수 역시 같은 기능을 수행한다. 그러나 시스템에 따라 두 함수를 구별하여 사용하는 경우는 극히 드물지만 존재한다. 그래서 리눅스에서는 이 두 종류의 함수를 구별하여 사용해야 한다. DMA와 관련된 루틴에서는 virt_to_bus()와 bus_to_virt()함수를 사용하기를 권장하고, 램이나 비디오와 같은 메모리 관련 주소 공간에는 virt_to_phys()와 phys_to_virt() 함수를 사용하기를 권장한다. 가급적 이 규칙을 지켜야 여러 시스템과 호환되는 디바이스 드라이버로 포팅할 수 있다.

yum을 통한 rpm만 다운로드 받기

그니까.. 설치는 필요 없고.. rpm 파일만 다운로드 받고자 하는 경우가 있음.

% yum install yum-plugin-downloadonly
% yum install --downloadonly --downloaddir=/tmp memcached
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package memcached.x86_64 0:1.4.4-3.el6 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

===========================================================================================
 Package                           Arch                           Version                             Repository                    Size
===========================================================================================
Installing:
 memcached                         x86_64                         1.4.4-3.el6                         base                          68 k

Transaction Summary
===========================================================================================
Install       1 Package(s)

Total download size: 68 k
Installed size: 147 k
Is this ok [y/N]: y
Downloading Packages:
memcached-1.4.4-3.el6.x86_64.rpm                                                                                  |  68 kB     00:01


exiting because --downloadonly specified

RHEL 공식 repository 대신 CentOS repository 사용하기

yum을 통한 패키지 설치시..
RHEL 공식 repository에 접근할수 없는 경우..
RHEL의 쌍둥이.. CentOS의 repository를 이용하는 방법이 있음.

% cd /etc/yum.repos.d
% cp rhel.repo centos.repo
% vim centos.repo
[base]
name=CentOS-$releasever - Base
baseurl=http://mirror.centos.org/centos/6/os/$basearch/
gpgcheck=1
 
[update]
name=CentOS-$releasever - Updates
baseurl=http://mirror.centos.org/centos/6/updates/$basearch/
gpgcheck=1

% rpm --import http://mirror.centos.org/centos/6/os/x86_64/RPM-GPG-KEY-CentOS-6
% yum list

rtorrent install on CentOS 6.5

리눅스 콘솔 기반의 torrent client 프로그램

다운로드: http://libtorrent.rakshasa.no/

% yum install make gcc gcc-c++ kernel-devel libcurl-devel.x86_64
% wget http://libtorrent.rakshasa.no/downloads/libtorrent-0.13.4.tar.gz
% tar xvfz libtorrent-0.13.4.tar.gz
% cd libtorrent-0.13.4
% configure; make; make install
% cd ..
% wget http://libtorrent.rakshasa.no/downloads/rtorrent-0.9.4.tar.gz
% tar xvfz rtorrent-0.9.4.tar.gz
% cd rtorrent-0.9.4
% ./configure; make; make install

단축키:

Ctrl+o 다운로드 디렉토리를 새로 지정한다.
Ctrl+s 토렌트를 시작한다.
Ctrl+d 활성화된 토렌트를 정지시킨다. 이미 정지가 되어있다면 삭제를 한다.
Ctrl+k 활성화된 토렌트를 정지시키고 그 파일을 닫는다.
Ctrl+r 해시 체크를 시작한다.
Ctrl+q rtorrent를 종료한다.

백그라운드로 돌리기:

# You can use screen to start the program, so when you logout it will not stop.
% screen rtorrent
# Then pressing Ctrl-A+D will detach the screen and you can logout. Running
% screen -r
# will show you the detached screen sessions and you can resume the one you want running:

Xvfb 테스트

Xvfb (X Virtual Frame Buffer)는 디스플레이 하드웨어와 물리적 입력 장치가 없는
기계 상에서 실행되는 X 서버. Xvfb는 가상 메모리를 사용하여 단순 프레임버퍼를
시뮬레이트하며, 어떠한 장치도 열지않고 X 디스플레이처럼 실행됨.
Xvfb는 일반적으로 서버를 테스트하는데 사용됨.

% Xvfb :99 -screen 0 1024x768x24 +extension GLX +render -noreset &
% export DISPLAY=:99
% firefox
% killall Xvfb

아래는.. Xvfb 서비스 스크립트 (/etc/init.d/xvfb).

#!/bin/bash

XVFB=/usr/bin/Xvfb
XVFBARGS="$DISPLAY -ac -screen 0 1024x768x16"
PIDFILE=${HOME}/xvfb_${DISPLAY:1}.pid
case "$1" in
  start)
    echo -n "Starting virtual X frame buffer: Xvfb"
    /sbin/start-stop-daemon --start --quiet --pidfile $PIDFILE --make-pidfile --background --exec $XVFB -- $XVFBARGS
    echo "."
    ;;
  stop)
    echo -n "Stopping virtual X frame buffer: Xvfb"
    /sbin/start-stop-daemon --stop --quiet --pidfile $PIDFILE
    echo "."
    ;;
  restart)
    $0 stop
    $0 start
    ;;
  *)
  echo "Usage: /etc/init.d/xvfb {start|stop|restart}"
  exit 1
esac
exit 0
% export DISPLAY=:99
% service xvfb start
# or /etc/init.d/xvfb start
% service xvfb stop
# or /etc/init.d/xvfb stop

xvfb-run 스크립트는 Xvfb의 wrapper인데..
옵션중 –auto-servernum 를 사용하여 사용가능한 display number를 자동 할당 할 수 있음.

또한.. xvfb-run 수행시 아래의 에러가 발생하면..

xvfb-run: error: Xvfb failed to start
Fatal server error:
Could not create server lock file: /tmp/.X99-lock

아래와 같이 해볼 것.

sudo xvfb-run -e /dev/stdout [mycommand]

사용 가능한 display number 를 찾는 방법.
Find a free X11 display number – Stack Overflow.pdf
http://stackoverflow.com/questions/2520704/find-a-free-x11-display-number

CentOS 6.x 에 xpra 설치하기

xpra는 Java, Python으로 개발되었으며..
attach, detach 기능이 추가된 Xvfb보다 진보된 Display를 위한 Virual Buffer 임.
CentOS 6.x 버전에서 다음과 같이 설치.

Xpra is ‘screen for X’, and more: it allows you to run X programs, usually on a remote host and direct their display to your local machine. It also allows you to display existing desktop sessions remotely.
Xpra is “rootless” or “seamless”, and sessions can be accessed over SSH, or password protected and encrypted over plain TCP sockets.
Xpra adapts to bandwidth constraints and is fully open-source.

% su 
% rpm --import http://winswitch.org/gpg.asc
% cd /etc/yum.repos.d/
% curl -O https://winswitch.org/downloads/CentOS/winswitch.repo
% yum install xpra

다음과 같이 테스트..

$ xpra start :7
$ export DISPLAY=:7
$ firefox &
# $ xpra stop :7

더 자세한 사용법은 아래에..
https://wiki.archlinux.org/index.php/Xpra

자세한 설치법은 여길 참고. Building – Xpra.pdf

오픈소스 LSF 기반의 스케쥴러 openlava

openlava_logo_slogan

1. openlava 를 다운 받는다.
http://www.openlava.org/download/download.html

openlava-2.2.tar.gz

% cd ~
% mkdir LSF
% cd LSF
% tar xvfz openlava-2.2.tar.gz 
% cd openlava-2.2
% ./configure

1

Tcl 없이는 빌드 할수 없다한다.

2. Tcl 설치

http://tcl.tk

2

% tar xvfz tcl8.5.17-src.tar.gz 
% cd tcl8.5.17/unix
% ./configure --enable-threads
% make
% su
% make install
% exit

이제 다시 openlava를 빌드한다.

3. openlave 빌드

% cd ~/LSF/openlava-2.2
% ./configure
% make
% su
% make install

4. openlave 셋팅

% cd ~/LSF/openlava-2.2
% cd config
% su
% cp lsb.hosts lsb.params lsb.queues lsb.users lsf.cluster.openlava lsf.conf lsf.shared openlava.* /opt/openlava-2.2/etc
% useradd -r openlava
% chown -R openlava:openlava /opt/openlava-2.2
% cp /opt/openlava-2.2/etc/openlava /etc/init.d
% cp /opt/openlava-2.2/etc/openlava.* /etc/profile.d
% chkconfig openlava on
% cd /opt/openlava-2.1/etc
% vim lsf.cluster.openlava

아래 부분의 호스트 이름을 수정한다.

Begin   Host
HOSTNAME          model          type  server  r1m  RESOURCES
# yourhost                  IntelI5      linux   1      3.5    (cs)
End     Host

위를 아래 처럼..

Begin   Host
HOSTNAME             model          type  server  r1m  RESOURCES
ihmin                !              !     1       -       -
End     Host

다음 host를 추가한다.

% vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.0.6 ihmin localhost localhost.localdomain

5. openlava 데몬을 실행

% . /etc/profile.d/openlava.sh
% vim /etc/init.d/openlava

# This is the root of openlava installation
# change it if installed somewhere else.
export OPENLAVA_TOP=/opt/openlava-2.2
# 아래의 라인을 추가
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

% service openlava start
Starting daemons...
lim started
res started
sbatchd started

% vim /etc/bashrc

# 끝 부분에 아래를 추가
export PATH=$PATH:/opt/openlava-2.2/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

% source /etc/bashrc
% bjobs
No unfinished job found

이제 bjobs가 제대로 실행된다.

6. submit 테스트

% vim test.job
find / -name "*.so"

# 아래와 같이 queue 이름과 CPU 갯수, 프로젝트 이름, 로그 파일 이름을 지정
% bsub -q normal -n 1 -P test -o test.log < test.job
Job <104> is submitted to queue <normal>.
$ bsub -q normal -n 1 -P test -o test.log < test.job
Job <105> is submitted to queue <normal>.
$ bsub -q normal -n 1 -P test -o test.log < test.job
Job <106> is submitted to queue <normal>.
$ bsub -q normal -n 1 -P test -o test.log < test.job
Job <107> is submitted to queue <normal>.
$ bsub -q normal -n 1 -P test -o test.log < test.job
Job <108> is submitted to queue <normal>.

$ bjobs
JOBID   USER    STAT  QUEUE      FROM_HOST   EXEC_HOST   JOB_NAME   SUBMIT_TIME
105     ihmin   RUN   normal     ihmin       ihmin       *me "*.so" Jan 16 11:51
106     ihmin   PEND  normal     ihmin                   *me "*.so" Jan 16 11:51
107     ihmin   PEND  normal     ihmin                   *me "*.so" Jan 16 11:51
108     ihmin   PEND  normal     ihmin                   *me "*.so" Jan 16 11:51

openlava를 통해서 스케쥴링이 잘 되는것을 확인할 수 있다.

이 외에도 LSF와 호환되기에 LSF의 커맨드를 그대로 이용가능하다..

cd /opt/openlava-2.2/bin/
$ ls
badmin   bkill    bqueues   bsub     lam-mpirun  lsid       lsrcp
bbot     bmgroup  brequeue  bswitch  lsacct      lsinfo     lsrmhost
bchkpnt  bmig     brestart  btop     lsaddhost   lsload     lsrun
bhist    bmod     bresume   bugroup  lsadmin     lsloadadj  mpich2-mpiexec
bhosts   bparams  brun      busers   lseligible  lsmon      mpich-mpirun
bjobs    bpeek    bstop     esync    lshosts     lsplace    openmpi-mpirun

VMWare상에서 CentOS 삼바 설정

현재 guest OS로 CentOS 5.8이 설치되어 있음.
호스트 윈도우즈에서 guest ubuntu를 네트웍 드라이브로 잡고 싶음.

$ yum install -y samba
$ smbpasswd -a ihmin  <-- ihmin 계정의 삼바 패스워드를 셋팅.
&#91;/cpp&#93;

삼바 설정 파일 열어서 아래부분을 파일의 끝에 추가해주고..

&#91;cpp&#93;
$ sudo vim /etc/samba/smb.conf

&#91;ihmin&#93;  <-- 접속시 id
comment=CentOS 5.8 64bit SAMBA Server <-- 코맨트
path=/home/ihmin  <-- 공유할 폴더 (윈도우즈에서 접속시 보일 디렉토리)
read only = no
writable = yes
printable = no
public = yes
browsable = yes
guest ok=no
&#91;/cpp&#93;

workgroup을 Windows 와 동일한 이름으로 지정한다.

&#91;cpp&#93;
workgroup = WORKGROUP
&#91;/cpp&#93;

<a href="http://blog.tcltk.co.kr/wp-content/uploads/2012/07/3.png"><img src="http://blog.tcltk.co.kr/wp-content/uploads/2012/07/3-300x165.png" alt="" title="3" width="300" height="165" class="alignnone size-medium wp-image-2974" /></a>

이제 삼바를 재시작.


% /sbin/service smb restart
Shutting down SMB services:                                [  OK  ]
Shutting down NMB services:                                [  OK  ]
Starting SMB services:                                     [  OK  ]
Starting NMB services:                                     [  OK  ]

다음 guest OS의 ip를 확인한다.

% /sbin/ifconfig
eth0      Link encap:Ethernet  HWaddr 00:0C:29:D5:89:61  
          inet addr:192.168.0.6  Bcast:192.168.0.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fed5:8961/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:3886 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3737 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:620700 (606.1 KiB)  TX bytes:777383 (759.1 KiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:1999 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1999 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:3643186 (3.4 MiB)  TX bytes:3643186 (3.4 MiB)

이제 윈도우즈 탐색기에서 \\192.168.0.6\ihmin 을 입력하면 계정과 패스워드를 묻는데 ihmin과 위에서 입력한 패스워드를 입력하면 접속된다.

이제 윈도우즈 탐색기에서 guest OS의 파일을 자유롭게 접근가능.
네트웍 드라이브로 잡던지해서 사용하면 편함.

만약.. 삼바 접속이 안되면.. CentOS 에서 Selinux와 삼바의 방화벽을 해제함.

삼바를 체크하여 방화벽 예외처리를 한다.

SELinux를 Disable 시킨다.

만약.. 호스트 PC 운영체제가 Windows 7 이면.. 위와 같이 했음에도..
삼바 접속이.. 안될때가 있을것임.

우선 아래를 실행.

다음 로컬 정책 -> 보안 옵션을 선택후 아래를 선택.

다음 아래와 같이 선택후.. 확인.

이후 네트웍 드라이브 연결 다시 시도.