레이블이 arm인 게시물을 표시합니다. 모든 게시물 표시
레이블이 arm인 게시물을 표시합니다. 모든 게시물 표시

raspberry pi linux kernel compile

raspberry pi linux kernel compile

라즈베리파이에서 디바이스 드라이버를 작성하거나 커널을 수정하기 위해서는 라즈베리파이의 커널 소스를 참조하여 컴파일하기 때문에 라즈베리파이의 커널 소스를 다운 받아야한다.

라즈베리파이의 커널소스와 툴은 github에서 다운받을 수 있다.

git clone http://github.com/raspberrypi/linux.git
git clone http://github.com/raspberrypi/tools

나는 작업디렉터리를 $HOME으로 홈으로 설정하고 홈밑에 linux, tools디렉터리를 받았다.

먼저 커널컴파일과 드라이버컴파일등에 필요한 라즈베리파이커널용 컴파일러를 PATH에 등록하여 사용하기 쉽게 해보자.


/home/dorkiz/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin
의 경로에 가면 툴들이 있다.

~/ 경로에 .bashrc파일에 이 툴들의 경로를 추가해준다.


그러면 환경변수에 설정되어 바로 참조할 수 있다.

그리고 라즈베리파이에 맞는 커널 컴파일 설정을 해준다.
arm-linux-gnueabi-gcc를 찾을수 없다는 에러가 떳었는데 워크피시 리눅스를 32비트 바꾸고 해결 할 수 있었다.


컴파일 설정을 해주고나면 make로 커널을 컴파일 할 수 있다.


컴파일 과정은 한 15분정도 걸린다.
컴파일이 완료되면 /home/dorkiz/linux/arch/arm/boot 디렉터리가 생성된다.


커널 Image와 압축된 zImage가 있다
컴파일된 커널 Image 파일은 바로 사용할 수 없기 때문에 kernel.img로 바꾸어 주어야한다.
이전에 받은 툴중에 로드가능한 라즈베리 파이용 커널 이미지를 만드는 툴이 있다.


/home/dorkiz/tools/mkimages/imagetool-uncompressed.py
를 사용하여 /home/dorkiz/linux/arch/arm/boot/zImage를 kernel.img로 바꾸어준다.

이제 라즈비언이 설치되어있는 SD카드 안에 kernel.img를 방금 만든 kernel.img로 교체하고 SD카드를 부팅하면 내가 컴파일된 kernel.img가 로드되게 된다.
Read more

ARM assembly 공부, bof

ARM assembly를 공부하기 위해서 bof redhat 원정대 1번 문제를 ARM환경에서 컴파일하고 단순하게 어셈블리어만 라인바이라인으로 분석해보고 x86 리눅스에서와 어떤식으로 다른지 확인 해 보았다.

bof 1번 문제의 c코드


strcpy에서 버퍼의 크기를 확인하지 않아 버퍼오버플로우가 발생 될 것으로 예상된다.

c코드 바이너리의 어셈블리어코드


서브루틴으로 진입시 r11, rl 을 사용하여 분기오피코드와 서브함수의 PUSH {r11, lr}로 SFP와 RET를 백업 한다. argv는 r0. r1로 전달한다.
함수를 빠져 나올때는 POP {r11, pc}로 스택프레임과 돌아갈 주소를 복귀시켜준다.
여기서 POP되는 스택을 조작하면 이전처럼 pc를 조작 할 수 있을것 같다.


첫번째 네모가 r11로 팝될 놈이고 두번째 네모가 pc로 팝될 놈이다.
두번째 네모를 덮어 pc를 조작 할 수 있어 보이나 안해봐서 확실하지 않다ㅋ
Read more