KVM 스위치 ATEN CS692 사용법

HDMI/USB/Keyboard/Audio 를 두개 연결해서 전환할 수 있는 KVM 스위치 ATEN CS692를 퇴사한 동료가 쓰던 것을 물려받아(?) 쓰고 있는데,

이상하게 특정 마우스만 꽂으면 이상하게 튀고, 웨이브 모양을 그리며 움직이는 거다;; 상하로 움직이는데 좌우로 움직이고 막… 다른 마우스 꽂으면 잘 되고.. -_-;;

그래서 접지나 호환성 문제가 있나 하고 넘어갔다가, 오늘 매뉴얼을 찾아 읽어보니 Mouse Emulation mode가 켜져 있으면 그렇더라. 끄니까 잘된다.

KVM에 핫키 설정이 있었다는 사실을 모르고, 스위치로만 눌렀더니…

어쩐지 컨트롤키랑 여러개 막 치다보면 키보드 램프가 돌아가며 깜박깜박하고, 어떨 땐 막 제멋대로 화면 전환이 되더라니… 램프 깜박거릴 때 ESC 누르기 귀찮았는데… 어쩐지… 어쩐지…

원래는 Scroll lock 두번 누르는 것으로 시작되는 명령 모드가, Scroll lock을 Ctrl로 변경할 수도 있어서, 이게 Ctrl로 변경되어 있어서.. Ctrl키를 많이 쓰다보면 막 제멋대로….

[Scroll lock], [Scroll lock], [Enter] 하면 다른 화면 전환.

[Scroll lock], [Scroll lock], m, [Enter] 하면 Mouse emulation mode Enable / Disable.

[Scroll lock], [Scroll lock], w, [Enter] 하면 Switching mouse-port 라던가. 암튼, 휠 버튼 더블클릭으로 마우스 전환. 이건 Mouse emulation mode가 켜져 있어야 동작한다고 한다. 누르면 근데 아마 저절로 Mouse emulation mode가 On되는 듯.

[Scroll lock], [Scroll lock], x, [Enter] 하면 Scroll lock 두번 누를 때 Scroll lock 대신 Ctrl키를 사용할 수 있다.


모르거나 이상하면 매뉴얼을 읽어보자.


도메인 기관 이전 완료

기존에 잘 사용하던 호스트웨이(www.hostway.co.kr)가 처음 쓸 때는 6900원이었다가 16000원쯤으로 올랐는데 귀찮아서 계속 쓰다가 오늘 호스팅케이알(hostring.kr) 로 기관 이전 신청했다. 사실 hostway 쓸 때 아이디를 그 쪽에서 그냥 만들었는지, 내가 평소에 쓰는 아이디가 아니라서 매번 로그인할 때마다 찾아야 했던 것도 불편하고..

하면서 알게 된 사실은 도메인 lock을 unlock 하더라도 propagation 하는데 시간이 좀 걸린다는 거. 어제 Unlock 하고 오늘 했더니 된다.

hostway 에서 인증 코드 얻는 것도 웹 상에서 얻을 수 있도록 잘 되어 있네~

DNS 설정도 바꿔야 하나, 하고 좀 귀찮은게 꺼려지지만, 그래도 일년에 커피 한잔 정도를 나에게 더 쓸 수 있겠다.

[Linux] Device driver 동시성 관련 함수 – Completion

현재 스레드 외부에다 작업을 시작하도록 지시하고 끝나기를 기다릴 때 사용. 세마포어를 LOCKED 상태로 하여 사용할 수도 있지만, 세마포어는 거의 항상 세마포어를 획득할 수 있을 때에 치중하여 최적화되어 왔다. 따라서 이럴 때는 completion 을 사용하는 것이 좋다. 구현은 kernel/sched.c 를 참조.

1. completion 초기화
<linux/completion.h>를 포함하여야 한다. 자료 타입은 struct completion.

1.1. Compile time 초기화

DECLARE_COMPLETION(my_completion);
1.2. Runtime 초기화

struct completion my_completion;
/* … */
init_completion(&my completion);

2. 완료 기다리기
인터럽트가 불가능한 대기(죽일 수 없는 프로세스를 만들 수도 있다)를 수행한다. LONG_MAX 만큼 대기.

void wait_for_completion(struct completion *c);
timeout 이 있는 인터럽트가 불가능한 대기. timeout 값을 리턴한다. 따라서 expire 되면 0을, 완료되면 남은 timeout 값(jiffies 값)을 리턴한다.

unsigned long wait_for_completion_timeout(struct completion *x, unsigned long timeout);
인터럽트가 가능한 대기를 수행한다.(추가필요:인터럽트 받으면 바로 리턴?)

int wait_for_completion_interruptible(struct completion *x);
인터럽트가 가능한 대기의 timeout 버전

unsigned long wait_for_completion_interruptible_timeout(struct completion *x, unsigned long timeout);
죽일 수 있는 대기(TASK_WAKEKILL | TASK_UNINTERRUPTIBLE)를 수행한다.(추가 필요:kill받으면 바로 리턴?)

int wait_for_completion_killable(struct completion *x);
Blocking 없는 wait_for_completion. complete 되지 않았으면 바로 0을 리턴한다.

bool try_wait_for_completion(struct completion *x);

3. 완료 이벤트 알리기
completion을 기다리는 스레드(waiter)가 있는지 확인한다. waiter가 있으면(wait_for_completion()이 진행 중이면) 0을, 없으면 1을 리턴한다.

bool completion_done(completion *x);
대기 중인 스레드 하나만 깨우기
void complete(struct completion *c);
모든 스레드 깨우기

void complete_all(struct completion *c);

4. 재사용을 위해 다시 초기화하기

INIT_COMPLETION(struct completion c);

5. 모듈 종료 함수에서 종료 후 완료를 기다리리고 알릴 때(나중에 추가하기:이 함수 없어졌나?)

void complete_and_exit(struct completion *c, long retval);

[Linux] Device driver 동시성 관련 함수 – Semaphore & Mutex

동시성 관련 함수에 대해서 다시 한번 정리하고 가자. Linux device driver 3판, 5장. “동시성과 경쟁 상태” 를 기준으로 정리한다.

공유 자원 접근을 위한 Lock 을 위해서 다음과 같은 것들을 사용한다.

1. 세마포어와 뮤텍스
Critical Section을 정의하기 위해서 세마포어를 사용한다. 일반적으로 P와 V 함수 쌍을 사용하는데, linux 에서는 P함수는 “down”, V 함수를 “up”이라 부른다. 단일 세마포어(공유 자원 개수를 1개로 정의)로 사용할 때 뮤텍스(Mutual Exclusion)라 부른다.

1.1. 세마포어 초기화
<asm/semaphore.h> 를 포함하여야 한다. 관련 Type은 struct semaphore.
1.1.1. 세마포어로 사용할 때 초기화


void sema_init(struct semaphore *sem, int val);

val 은 세마포어에 할당할 초기값.

1.1.2. Mutex로 사용할 때 초기화
정적 초기화


DECLARE_MUTEX(name); // 1로 초기화.
DECLARE_MUTEX_LOCKED(name); // 0으로 초기화.

실행 중 초기화


void init_MUTEX(struct semaphore *sem); // 1로 초기화.
void init_MUTEX_LOCKED(struct semaphore *sem); // 0으로 초기화


1.2. 세마포어 획득하기
세마포어 값을 감소시키고 필요한 만큼 기다린다.


void down(struct semaphore *sem);


세마포어 값을 감소시키고 필요한 만큼 기다리지만, 인터럽트 가능하다. 인터럽트를 받으면 0이 아닌 값을 반환하고, 세마포어를 쥐고 있지 않는다. 때문에 항상 반환값을 확인하여야 한다.


int down_interuptible(struct semaphore *sem);


세마포어를 획득할 수 없다면 바로 0이 아닌 값을 반환한다.


int down_ttylock(struct semaphore *sem);


1.3. 세마포어 반환


void up(struct semaphore *sem);

2. 읽기/쓰기 세마포어
읽기만 수행하는 스레드라면 여럿이 함께 접근해도 된다. 이럴 때 rwsem 이라는 특수 세마포어를 이용한다.
rwsem 을 사용하면 쓰기 스레드 하나가 잡고 있던가 읽기 스레드 여럿이 잡고 있던가 둘 중에 하나가 되는데 우선순위는 쓰기 스레드에게 있다. 쓰기 스레드가 임계구역에 접근하는 순간, 읽기 스레드는 모든 쓰기 스레드가 작업을 끝낼 때까지 기다려야 한다. 그래서 쓰기 스레드가 많을 경우 읽기 스레드가 오랫동안 접근 권한을 얻지 못할 수 있다. 따라서 쓰기 접근이 매우 드물고, 짧은 시간 동안에만 필요한 경우에 적당하다.

2.1. 읽기/쓰기 세마포어 초기화
<linux/resem.h> 를 포함하여야 한다. 관련 타입은 struct rw_semaphore. 런타임에 명시적으로 초기화되어야 한다.


void init_rwsem(struct rw_semaphore *sem);

2.2. 읽기 전용 세마포어 사용
읽기 전용 접근 권한을 제공한다. 다른 읽기 스레드와 동시 참조가 가능하다. 호출 프로세스를 D 상태(인터럽트가 불가능한 잠자기 상태)로 빠뜨릴 수 있다는 사실에 주의한다.


void_down_read(struct rw_semaphore *sem);

읽기를 수행할 수 없을 경우 기다리지 않는다. 접근이 가능하다면 0 이 아닌 값을, 이외에는 0을 반환한다. 다른 커널 함수는 대부분 성공일 때 0을 반환하지만 down_read_ttylock은 반대다.


int down_read_ttylock(struct rw_semaphore *sem);

읽기 전용 세마포어 해제


void up_read(struct rw_semaphore *sem);


2.2. 쓰기 전용 세마포어 사용
down_read 와 동일


void down_write(struct rw_semaphore *sem);

down_read_ttylock 과 동일


int down_write(struct rw_semaphore *sem);

up_read 와 동일


void up_write(struct rw_semaphore *sem);

잠시만 쓰기 락을 걸어 수정하고 한동안은 읽기 권한만 필요하다면


void downgrade_write(struct rw_semaphore *sem);