#define spin_lock_init(_lock)
스핀락을 초기화한다

 

#define spin_lock_irqsave(lock, flags)
인터럽트를 disable하고 스핀락을 얻는다

 

void spin_unlock_irqrestore(spinlock_t *lock, unsigned long flags)
인터럽트를 restore하고 스핀락을 반환한다

출 처 : http://blog.naver.com/snoya00?Redirect=Log&logNo=60106221880 

[출처] [LINUX] spinlock_t|작성자 스노야


1. 기능 : 리눅스 기본 명령어들의 심볼릭 링크를 관리

2. option
-- config : 현재 심볼릭 링크를 변경하고자 할 때
-- list : 입력한 명령어 대신에 쓸 수 있는 다른 명령어들을 찾아준다.

3. 활용 예

# update-alternatives --config gcc


출 처 : http://blog.naver.com/yukino4u?Redirect=Log&logNo=98940260

from : http://ubuntuguide.net/how-to-install-and-setup-gcc-4-1g4-1-in-ubuntu-10-0410-10


The default gcc version in Ubuntu 10.04 LTS and 10.10 is gcc 4.4. However some programs depend on gcc 4.1.1 or gcc 4.1.2. Here’s how to install and setup gcc 4.1.3 in Ubuntu 10.04/10.10 which also works if one program need gcc 4.1.1/4.1.2 to run.

Install Gcc 4.1

gcc 4.1.3 is available default in Ubuntu 10.04/10.10 official repository, just run the command in Applications -> Accessories -> Terminal:


sudo
apt-get install gcc-4.1
 

If you absolutely want gcc 4.1.1, refer to ubuntuforums.org.

Set gcc 4.1 as default version

After that, use this command to list installed gcc in your Ubuntu:


ls /usr/bin/gcc*


and use this command to check which is default:


gcc -v


1.)
 Now, add alternatives for gcc:


sudo
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.4 40 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.1 30


run this command which lists available versions, then type a number to set default.


sudo update-alternatives --config gcc
 

There are 2 choices for the alternative gcc (providing /usr/bin/gcc).

Selection Path Priority Status
————————————————————
0 /usr/bin/gcc-4.4 40 auto mode
* 1 /usr/bin/gcc-4.1 30 manual mode
2 /usr/bin/gcc-4.4 40 manual mode


2.)
 add alternatives for g++, i486-linux-gnu-gcc, and i486-linux-gnu-g++ and set 4.1 as default:


update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.4 40 update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.1 30 update-alternatives --config g++

update-alternatives --install /usr/bin/i486-linux-gnu-gcc i486-linux-gnu-gcc /usr/bin/i486-linux-gnu-gcc-4.4 40 update-alternatives --install /usr/bin/i486-linux-gnu-gcc i486-linux-gnu-gcc /usr/bin/i486-linux-gnu-gcc-4.1 30 update-alternatives --config i486-linux-gnu-gcc

update-alternatives --install /usr/bin/i486-linux-gnu-g++ i486-linux-gnu-g++ /usr/bin/i486-linux-gnu-g++-4.4 40 update-alternatives --install /usr/bin/i486-linux-gnu-g++ i486-linux-gnu-g++ /usr/bin/i486-linux-gnu-g++-4.1 30 update-alternatives --config i486-linux-gnu-g++
sudo 명령어에 대한 설정을 하려면 /etc/sudoers 파일을 수정 하면 된다. 이 파일은 기본적으로 read-only 파일이며, root로 접속해서 수정 시에도 강제로 write 해야만 된다.

#

# This file MUST be edited with the 'visudo' command as root.

#

# Please consider adding local content in /etc/sudoers.d/ instead of

# directly modifying this file.

#

# See the man page for details on how to write a sudoers file.

#

Defaults    env_reset


# Host alias specification


# User alias specification


# Cmnd alias specification


# User privilege specification

root    ALL=(ALL:ALL) ALL


# Members of the admin group may gain root privileges

%admin ALL=(ALL) ALL


# Allow members of group sudo to execute any command

%sudo   ALL=(ALL:ALL) ALL


#includedir /etc/sudoers.d




이 설정은 root 유저에게 모든 호스트에서 모든 유저의 권한을 모든 명령어를 실행시킬 수 있다는 뜻이다.

root ALL=(ALL) ALL



sudo 명령어를 사용할 때 특정 사용자에게는 비밀번호를 묻지 않도록 한다.
/etc/sudoers에 아래와 같은 문구를 추가한다.

userID ALL=(ALL)NOPASSWD: ALL













container_of(ptr, type, member)

원형은 다음과 같다.
#define offsetof(type, member) ((size_t) &((type *)0)->member)
#define container_of(ptr, type, member) ({	\
		const typeof( ((type *)0)->member ) *__mptr = (ptr);	\
		(type *)( (char *)__mptr - offsetof(type,member) );})

ptr : 멤버의 포인터
type : 이 멤버를 포함하고 있는 컨테이너 스트럭쳐의 타입
member : type structure에 안에서 존재하는 멤버의 이름

결론적으로 얘기하자면 container_of 매크로는 구조체 멤버의 포인터를 이용하여 구조체의 시작 주소를 찾는 역할을 한다.

예제 코드)
#include <stdio.h>

#define offsetof(type, member) ((size_t) &((type *)0)->member)

#define container_of(ptr, type, member) ({      \
    const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
    (type *)( (char *)__mptr - offsetof(type,member) );})

struct type
{
    char ttt;
    int *member;
} con;

int main()
{
    printf("%p\n", &con);
    printf("%p\n", container_of(&(con.member), struct type, member));

    return 0;
}

결과)
0x80496ec
0x80496ec





This post will show how to upgrade from Debian 5.0.x “Lenny” to the latest stable Debian release 6.0 “Squeeze”. One of the reasons I’ve liked Debian in the first place was the advantage of being able to do a live, in place updates from one major release to another, usually in a safe way. As always, if you do this, please take some time to backup your system if you care of your data, as this is a major upgrade and things can go wrong. Squeeze brings in a few big changes and I will outline some of them, but I would recommend to read the release notes and look for any incompatibilities (hardware or software) or changed things that could affect your particular setup.

1. Update apt sources.list

The first thing we will do (after the backup of course) is to edit the /etc/apt/sources.list file and replace “lenny” with “squeeze“. Originally, this might look like this (for a system using the main US mirrors; your file might use a different local one):

deb http://ftp.us.debian.org/debian/ lenny main contrib non-free
deb-src http://ftp.us.debian.org/debian/ lenny main contrib non-free

deb http://security.debian.org/ etch/updates lenny contrib non-free

after replacing lenny with squeeze the file will look like this:

deb http://ftp.us.debian.org/debian/ squeeze main contrib non-free
deb-src http://ftp.us.debian.org/debian/ squeeze main contrib non-free

deb http://security.debian.org/ squeeze/updates main contrib non-free

2. Perform the system upgrade

After updating the sources file, you will have to refresh the indexes with:
aptitude update

Next let’s manually upgrade the core apt packages (this will pull in some extra dependencies, and this is perfectly fine):
aptitude install apt dpkg aptitude

And finally we will perform the bulk of package upgrades with:
aptitude safe-upgrade
this will take a while depending on what packages you have installed (that will need to be upgraded) and on your internet connection speed.

Here are some changes that you might want to pay special attention during the upgrade:
- dash: squeeze uses dash instead of /bin/sh as the default system shell. This is the recommended way and it is supposed to be faster and improve the system overall performance. I recommend to use it and accept this change.
- grub2: is the default in squeeze and the upgrade will recommend to upgrade from your existing grub. This is a major change and for this reason initially the boot loader will be chainloaded in the existing menu.lst to verify it works fine. If you want to upgrade I would recommend to do the chainload and test it with at least one reboot before removing grub legacy.
- sysv-rc: to improve the boot process the upgrade will offer to move to dependency-based sequencing. This is irreversible but highly recommended. I had no problem with it and don’t see why anyone would not want this.
- UUIDs: the installer will recommend to switch from regular disk devices (aka /dev/sda*) to disk IDs (aka UUID=c6ecae74-6754-4ad0-986d-98dd9cbfd293) in various configuration places like /etc/fstab, /boot/grub/menu.lst. I personally don’t like that, but didn’t want to take the risk for the device to change its name with the new kernel and went with the change. If you do the same pls. doublecheck the changed files before rebooting.

Now it is time to reboot your system for the first time into squeeze. Fingers crossed and in a few minutes you will be running squeeze (as always an out of band impi console is handy when doing such upgrades)

3. Complete the upgrade

If you upgraded to grub2 and want to remove the chainloaded grub-legacy you can remove it completely from the system with:
upgrade-from-grub-legacy
and the output will look like this:
0
Installation finished. No error reported.
Generating grub.cfg ...
Found linux image: /boot/vmlinuz-2.6.32-5-amd64
Found initrd image: /boot/initrd.img-2.6.32-5-amd64
Found linux image: /boot/vmlinuz-2.6.26-2-amd64
Found initrd image: /boot/initrd.img-2.6.26-2-amd64
done

You can now run:
aptitude full-upgrade
and this will complete some extra packages that were not straitforward and not seen as safe by the normal upgrade process (there might be none, depending on the state of your existing system). Evaluate them before moving forward. And finally once you are done reboot once more (to see that grub2 is working fine by itself) and you will be running the latest uptodate squeeze system.

4. (Optional) Convert your ext3 filesystems to ext4

This step is optional and if you are happy with the ext3 filesystem then you can safely skip it. Myself, I’ve done this most of the time so I thought it might be useful to add it here for anyone else interested to do the same.

First doublecheck if you are running the 2.6.32 squeeze kernel:
uname -a
Linux srv01 2.6.32-5-amd64 #1 SMP Wed Jan 12 03:40:32 UTC 2011 x86_64 GNU/Linux

Older than 2.6.28 kernels (like lenny 2.6.26 for example) don’t have native support for ext4, so this will fail for an older kernel. Because ext4 is backwards compatible with ext3, all we have to do is to change the mount definitions to ext4 in fstab:
vim /etc/fstab
and change the filesystem from ext3 to ext4 for any devices you might have. Make a note on the devices you change, and reboot the machine. After the reboot the machine will use the ext4 driver for the old filesystem even though it doesn’t take full advantage of the ext4 capabilities. To complete this and enable the extra ext4 features we will need to run for each filesystem:
tune2fs -O extents,uninit_bg,dir_index <device>
like, for example for /dev/sda1:
tune2fs -O extents,uninit_bg,dir_index /dev/sda1
this will only be activated when the filesystem is unmounted and we can achieve this with yet another reboot (especially for the root filesystem), and the system will auto fsck them (as the last command marked the filesystem as dirty) and perform the upgrade. I would highly recommend for this to have a remote console on the system as in most of the cases the auto fsck will fail and you will have to run it manually from the console.

Hopefully this howto will help you upgrade your debian system to squeeze with ext4. If you have encountered anything special during the upgrade feel free to share it with others using the comment box bellow.

 

출처 : http://www.ducea.com/2011/02/05/howto-upgrade-from-debian-lenny-to-squeeze/

zimage와 bzImage는 무슨 차이가 있는걸까? 필자는 처음에 z와 b의 의미 때문에 gzip으로 압축하거나 아니면 bzip2로 압축한 것의 차이인줄 알았지만 압축은 gzip으로 같고 단지 z는 압축했단 의미고 b는 'big kernel'이란 뜻인걸 알았다. 왜 이렇게 나눠졌는가?

이미 1.7절에서 언급했던 것 처럼 커널의 크기가 너무 커서 압축 후에도 일정 크기를 넘어가면 zImage 대신 bzImage를 사용해야한다고 했는데 이유는 다음과 같다.

pc가 처음 만들어질 땐 OS로 도스가 사용됐고 이 때 M$의 유명한 분이 640KB면 충분하다고 했단 소릴 들은적이 있을 것이다. 처음 PC가 만들어질 때의 CPU는 8086으로 16bit CPU 였다. 이 프로세서가 지원하는 최대의 메모리는 1MB였기 때문에 모든 어드레스 스페이스가 1MB 내로 제한됐다. 그러므로 램을 640kb 사용하고 나머지 영역엔 MGA, VGA와 같은 다른 디바이스를 할당해 줬다.

문제는 여기서 시작되는데 AT시절의 PC 기본 구조는 현재까지도 계속 유지되고 있기 때문에 PC가 처음 부팅되면 하위 1MB 만을 사용한다고 생각하면 된다. 보호모드라고 알고 있는 386 이상의 cpu가 가진 기능을 사용하지 않고 리얼모드란 8086 호환 모드를 사용하기 때문인데 이는 OS가 보호모드를 사용할 상태를 만들고 전환하기 전까지는 계속 리얼모드로 남아있기 때문이다.

리눅스 커널의 크기가 커서 커널을 읽어들이는 프로그램 크기나 시스템에서 사용되는 약간의 메모리를 제외한 나머지 램의 빈공간에 읽어 들이지 못하면 하위 1MB가 아니라 그 이상의 연속된 메모리에 커널을 읽어 들이고 압축을 푸는 등의 일을 해야할 것이다. 반대로 남은 용량에 커널이 들어갈 수 있다면 당연히 읽어 들이고 압축을 풀면 끝날 것이고...

이렇게 메모리에 처음 적재되고 압축 풀리고 하는 절차와 위치가 다르기 때문에 zImage와 bzImage오 나뉜 것이고 커널 이미지 파일의 앞부분 bootsect와 setup이 각각에 따라 맞는 것으로 합쳐지게된다. 그리고 bzimage의 경우 하위 1M는 사용하지 못하는데 리눅스에선 그렇다!

컴파일 단계에서 make zImage 했을 경우 System is too big. Try using bzImage or modules. 라고 에러가 난다면 더 많은 부분을 module로 만들거나 bzImage를 사용해야한다.


출 처 : http://blog.naver.com/hdalba?Redirect=Log&logNo=130002608246




kernel

태스크 관리자가 구현된 디렉토리. 문맥 교환(context switch)과 같은 하드웨어 종속적인 태스크 관리 부분은 arch/$(ARCH)$/kernel 디렉토리에 구현되어 있다.


arch

리눅스 커널 기능 중 하드웨어 종속적인 부분들이 구현된 디렉토리.


fs

리눅스에서 지원하는 다양한 파일시스템과 open(), read(), write() 등의 시스템 호출이 구현된 디렉토리. 현재 리눅스에는 약 50가지 정도의 파일시스템이 구현되어 있으며 계속 새로운 파일시스템이 개발중이다. 다양한 파일시스템을 일관된 인터페이스로 접근할 수 있도록 하기 위해 리눅스가 도입한 가상 파일시스템(virtual file system)도 이 디렉토리에 존재한다.


mm

메모리 관리자가 구현된 디렉토리.


driver

리눅스에서 지원하는 디바이스 드라이버가 구현된 디렉토리.


net

리눅스 커널 소스 중 상당히 많은 양을 차지하는 이 디렉토리는 리눅스가 지원하는 통신 프로토콜이 구현된 디렉토리다.


ipc

리눅스 커널이 지원하는 프로세스간 통신 기능이 구현된 디렉토리. 이 디렉토리에는 message passing, shared memory, semaphone가 구현되어 있다.
파이프는 fs 디렉토리에, 시그널은 kernel 디렉토리에, 소켓은 net 디렉토리에 구현되어 있다.


init

커널 초기화 부분, 즉 커널의 메인 시작 함수가 구현된 디렉토리. 하드웨어 종속적인 초기화가 arch/$(ARCH)$/kernel 디렉토리 하위에 있는 head.S와 mics.c에서 이뤄지고 나면, 이 디렉토리에 구현되어 있는 start_kernel() 이라는 C함수로 제어가 넘어 온다.


include

리눅스 커널이 사용하는 헤더 파일들이 구현된 디렉토리. 헤더 파일 중에서 하드웨어 독립적인 부분은 include/linux 하위 디렉토리에 정의되어 있으며, 하드웨어 종속적인 부분은 include/asm-$(ARCH) 디렉토리에 정의되어 있다.


others

Documentation - 리눅스 커널 및 명령어들에 대한 자세한 문서 파일들이 존재하는 디렉토리
lib - 커널 라이브러리 함수들이 구현된 디렉토리
scripts - 커널 구성 및 컴파일 시 이용되는 스크립트 들이 존재하는 디렉토리


APUE에 보니까 그 이유가 나와있네요.
pp. 411-413 까지에 mmap을 이용한 파일복사 예제가 나와있는데,
output 파일의 사이즈를 설정할 필요가 있다고 합니다.
파일의 사이즈를 설정한다고 하는 것이 제가 생각하기로는 그 파일을 위한 공간을 할당한다는 의미로 해석을 해야 하는 것 같습니다. (사용자가 파일연산을 통하지 않고 곧바로 stat 정보의 file size 를 변경할 수 없지 않나요?) 
포인터를 사용해서 strcpy() 를 할 때, 대상 포인터가 가리키는 영역이 미리 할당되어 있어야 하는 것과 비슷한 생각이 드는데요. 여기서 포인터가 mmap한 주소가 되겠고, 실제파일영역이 mmap을 통해서 가리키는 저장공간이 되겠죠.

테스트를 해 보기 위해서 a.out 을 a.out2 라는 파일로 복사해 보았습니다.
% cp a.out a.out2
% a.out a.out a.out2
=> Bus Error

코드 상에 O_TRUNC 가 있어서 cp를 통해 a.out 을 a.out2 로 복사해 놓아도 open이 되면 0 byte로 변하게 되어서 여전히 Bus Error가 발생했습니다.
open의 O_TRUNC를 빼고 다시 컴파일해서 수행했더니 정상수행됐습니다.

복사하려는 파일보다 더 큰 크기를 가지는 파일을 대상파일로 설정해 보았습니다. 이 경우도 O_TRUNC는 빼 놓았구요.

% cp biggerfile cli.d
% ls -al cli cli.d
...
-rwxr-xr-x 1 ... 9888 1월 5일 1853 cli
-rw------- 1 ... 23720 3월 29일 1619 cli.d
% a.out cli cli.d
...
-rwxr-xr-x 1 ... 9888 1월 5일 1853 cli
-rw------- 1 ... 23720 3월 29일 1619 cli.d

정상수행됐지만 대상파일의 크기가 이전파일크기를 그대로 유지하네요. 예상됐던 결과지요. 아마 cli.d 의 앞쪽 9888 바이트만큼은 cli와 동일하겠죠?

결론. 
정상 수행을 위해서는 O_TRUNC 옵션을 빼면 안 되겠고, 
대상 파일크기 설정을 위해서는 대상파일이 원본파일만큼 크기를 가지도록 보장해 주어야 하겠고, lseek() 후 맨 끝에 한바이트 써주는 식으로 해주면 된다.

해당 원문입니다. 참조하세요.

Program 12.14 copies a file (similar to the cp(1) command) using memory mapped I/O. We first open both files and then call fstat to obtain the size of the input file. We need this size fo the call to mmap for the input file, plus we need to set the size of the output file. We call lseek and then write one byte to set the size of the output file. If we don't set the output file's size, the call to mmap for the output file is OK, but the fist reference to the associated memory region generates SIGBUS. ...

출 처 : http://kldp.org/node/1575

+ Recent posts