'linux'에 해당되는 글 4건

  1. 2012.03.02 GOT (Global Offset Table)
  2. 2012.01.30 system vs exec
  3. 2011.08.17 JBD error message "barrier-based sync failed"
  4. 2011.05.01 커널 스레드
리눅스2012. 3. 2. 18:02

출처: Secure Coding in C and C++


Linux 의 기본 바이너리 포맷은 ELF(Executable and Linking Format)이다.  ELF는 원래 UNIX System Laboratories(USL)에 의해 ABI(Application Binary Interface)의 일환으로 개발되었다.


ELF 파일의 프로세스 공간은 GOT(Global Offset Table)을 포함하고 있는데, 이 GOT는 절대 주소값을 가지고 있다.  이렇게 절대 주소값을 가지고 있을 경우, 코드 영역의 위치여부나 공유여부에 상관없이 사용 할 수 있게 된다.


실제 테이블의 내용이나 형태는 프로세서의 종류에 따라 다를 수 있지만,   기본적으로 GOT는 다이나믹 링킹 프로세스를 지원하는데 있다.


프로그램에 의해 사용되는 모든 라이브러리 함수는 GOT에 실제 함수의 주소를 가진 엔트리를 가지고 있으며, 이는 라이브러리가 쉽게 프로세스 메모리 안에서 재배치될 수 있게 한다.  프로그램이 실제로 함수를 처음으로 사용하기 전까지는, GOT의 엔트리에는 RTL(RunTime Linker)의 주소를 가지고 있다.  만약 프로그램에 의해 함수가 호출되면, RTL에게 제어는 넘어가며, 함수의 실제 주소가 GOT에 등록된다.  차후의 함수 호출은 RTL을 거칠 필요 없이 GOT를 통해서 호출된다.


GOT 엔트리의 주소는 EFL 파일의 고정된 위치에 있고, 결과적으로 모든 실행 프로세스 이미지들에게 공통적인 주소에 있게 된다.  GOT 엔트리의 위치를 알려면, 'objdump' 커맨드를 사용하여 확인 할 수 있다.
 



'리눅스' 카테고리의 다른 글

ext4분석  (0) 2012.04.10
EXT4 파일 시스템 굽기(2)  (0) 2012.03.18
리눅스 배포판 이름 버젼 알아내기  (0) 2012.03.02
/bin, /sbin, /usr/bin, /usr/sbin, /usr/local/bin, /usr/local/sbin, /opt  (0) 2012.02.24
Linux: umask  (0) 2012.01.03
Posted by code cat
프로그래밍/C2012. 1. 30. 08:07

system 으로 쉘 명령어를 실행시키거나 프로세스를 실행시키는건 대체적으로 좋지 않은 방법이다. 

이는 system 이 동작하기 위해 먼저 쉘을 실행시키기 때문이다. 이렇게 시작된 쉘은 각 설치된 쉘의 환경등에 따라 다른 동작성을 보일 수 있기 때문이다. 


그래서 보통 대체적으로 쓰이는 것이, exec 이며 exec 계열은 다음과 같이 나뉘어진다. 
execl, execle, execlp
execv, execve, execvp

그러나 이런 exec 또한 프로세스를 실행시킨 뒤 에러가 나지 않는 한 리턴되지 않는다.

즉,우리가 처음 시작한 프로세스에서 여러개의 프로세스를 실행시키기에는 부적합하다는 것이다. 


그래서 대신 자식 프로세스를 생성하거나 쓰레드를 생성하는 것이다

'프로그래밍 > C' 카테고리의 다른 글

enum vs #define vs const  (0) 2012.02.05
enum 타입 c vs c++  (0) 2012.02.04
process & signal  (0) 2012.01.25
error: invalide storage class for function 'xxxx'  (0) 2011.11.29
대상체의 기억수명  (0) 2011.11.29
Posted by code cat
리눅스2011. 8. 17. 14:21
출처: http://www.novell.com/support/search.do?cmd=displayKC&sliceId=SAL_Public&externalId=3907838
 

JBD: barrier-based sync failed on mmcblkxxx -diabling barriers

JBD = 저널링 블록 디바이스
이 메세지를 끌라면, barrier=off 라는 매게변수를 커널에 넘겨주면 된다. GRUB의 경우에는 /boot/grub/menu.lst에 넣으면 되겠다.  이렇게 하면 커널은 transaction barrier 메카니즘을 사용하지 않게된다.

기본적으로 리눅스 커널은 transaction barrier를 사용하는데, 이는 데이터의 보전성을 유지하기 위한 부가적인 메카니즘이다.
많은 저장 서브시스템은 data의 write 퍼포먼스를 높이기 위해 캐시나 쓰는 order를 변경하는데, 이는 저널링 파일 시스템안에서 관리되는 저널된 데이터에겐 좋지 않다.  저널링은 실제 데이터가 쓰여지기 전에 메타데이터를 씀으로서 크래시 리커버리를 구현한다.  위의 에러(?) 메세지는 그러한 transaction barrier를 지원하지 않는다는 소리이며, 전혀 해로울것은 없지만, barrier는 일반적으로 퍼포먼스를 높여준다.

Posted by code cat
리눅스/커널2011. 5. 1. 01:23
커널 스레드와 일반 프로세스와 다른 점 중 가장 두드러진 부분은 커널 스레드는 어드레스 스페이스가 없다는 것이다(mm 포인터 = NULL)

커널 스레드는 커널 스페이스에서만 실행되며 유저공간으로 컨텍스트 스위칭 하지 않는다. 하지만 일반 프로세스와 같이 스케쥴되고 선점 가능하다.

대표적인 커널 스레드로는 flush 와 ksoftirqd가 있으며 ps -ef 로 커널 스레드 리스트를 확인할 수 있다. 커널 스레드는 오직 다른 커널 스레드만이 생성 할 수 있다


iPhone 에서 작성된 글입니다.

'리눅스 > 커널' 카테고리의 다른 글

Linux 3.0 Kernel  (0) 2011.07.31
커널선점  (0) 2011.05.01
커널 초기화  (0) 2011.04.20
시스템콜 (미완성)  (0) 2011.04.18
asmlinkage 에 대한 설명  (0) 2011.04.15
Posted by code cat