리눅스 커널 파일시스템 기본 [1]

이미지
파일시스템이란 하드디스크, SSD, 플래시 메모리와 같은 저장장치 위에 파일과 디렉터리를 체계적으로 정리(organize)하는 방법을 말합니다. 파일시스템의 종류는 매우 다양합니다 (FAT, ext4, btrfs, NTFS 등). 그리고 한 대의 컴퓨터에서 같은 파일시스템 종류가 여러 개 동시에 사용될 수도 있습니다. 파일시스템마다 파일과 디렉터리, 사용자 데이터, 그리고 내부적으로 사용하는 메타데이터를 관리하는 방식이 서로 다르긴 하지만, 거의 모든 파일시스템에 공통적으로 사용되는 몇 가지 기본 개념들이 있습니다 (이 중 일부 개념은 저장장치(storage)와 메모리 양쪽에 존재하고, 일부는 메모리에만 존재합니다.): 슈퍼블록(superblock) : 해당 파일시스템의 기본 정보를 담고 있습니다. 예를 들어 블록 크기, 루트 아이노드, 파일시스템 전체 크기 같은 정보죠. 슈퍼블록은 저장장치와 메모리 모두에 존재하는데, 메모리에는 속도 향상을 위한 캐싱 용도로 복사되어 있습니다. 파일(file) :현재 열려있는 파일에 관한 정보(예: 현재 읽기 위치 등)를 담고 있는데, 이 정보는 메모리에만 존재합니다. 아이노드(inode) : 아이노드는 디스크에 저장된 파일을 고유하게 식별하는 역할을 합니다. 아이노드는 파일 크기, 접근 권한, 파일 종류 등 다양한 속성도 함께 가지고 있죠. 이 아이노드는 저장장치와 메모리 양쪽에 존재하며, 메모리에는 캐시 목적 등으로 복사되어 있습니다. 덴트리(dentry) : 덴트리(dentry)는 파일 이름과 아이노드(inode)를 연결하는 역할을 합니다. 덴트리 역시 저장장치와 메모리 양쪽에 존재하며, 메모리에는 캐싱 목적으로 복사되어 있습니다. struct ext4_inode 내부의 i_block에서 스토리지의 각 block들을 가리킨다. EXT4_N_BLOCKS 크기는 15로 ext4가 지원하는 데이터 블록 주소 지정 방식의 표준 크기이며, 이를 통해 작은 파일부터 아주 큰 파일까지 효율적으로 저장 위치를 관리할 수 있습니...

[FPGA] Zedboard에 rocketchip (RISC-V) 올리기

0. 환경설정

리눅스의 config option에 CONFIG_USB_SERIAL과 CONFIG_USB_SERIAL_CYPRESS_M8 이 y 로 되어있어야 한다. m 으로 되어있다면 y로 바꿔주고 리눅스를 재컴파일하자. 내 리눅스 배포판은 우분투 14.04-4 이다. 커널은 3.18.30을 올렸다.

Vivado 2016-2 설치


로켓칩 설치


위 github 의 quick instructions 를 따라해보자.

1. Quick instructions


1) $ make fetch-images

2) $ make fetch-riscv-linux

3) SD카드에 이미지 카피
$ make load-sd SD=path_to_mounted_sdcard
나의 경우 $ make load-sd SD=/media/jsim/6910-C05B

4) minicom 실행

미니컴이 없다면 apt-get 으로 설치한다.

$ dmesg | grep tty
ttyACM0 가 있음을 확인

$ sudo minicom -s

serial port setup에서 A를 눌러서 Serial Device 이름을 /dev/ttyACM0 로 바꿔준다. serial port setup이 안보인다면 Ctrl-A Z 를 눌러서 커맨드 창을 불러와서 O를 누른다.

5) SD카드를 빼서 보드에 끼고 전원을 올린다.

시리얼 포트로 통신한다.


6) 부팅 시키기
zynq-uboot> boot

id 와 password는 root / root 이다.

7) fesvr-zynq 프로그램으로 소프트코어에서 프로그램을 돌릴 수 있다.
./fesvr-zynq pk hello

8) Mounting the SD Card on the Board

root@zynq:~# mkdir /sdcard
root@zynq:~# mount /dev/mmcblk0p1 /sdcard

할 일을 끝냈으면 unmount 한다.

root@zynq:~# umount /sdcard


Building Everthing from scratch

먼저 JDK와 SBT가 필요하다.

JDK 는 알아서 다운로드, SBT는 다음과 같이 다운로드한다.

echo "deb https://dl.bintray.com/sbt/debian /" | sudo tee -a /etc/apt/sources.list.d/sbt.list
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2EE0EA64E40A89B84B2DF73499E82A75642AC823
sudo apt-get update
sudo apt-get install sbt


아래 포스트는 무시할 것. 쓰다가 날라가서 내용이 정확하지 않습니다.
2. Pushing Your Rocket Modifications to the FPGA


1) Setting Up Workspace

rocket 카피가 없다면 다음 명령어로 클론한다.
$ cd [fpga-zynq dir]/zedboard
$ make init-rocket-submodule

쓴게 날라갔다.현재 https://github.com/riscv/riscv-tools#linuxman 에서

3.14.79 linux curl 까지 하고 집에 감.

Configuring the Linux Kernel 부터 해볼 것.

Linux configure 시에
$ make ARCH=riscv menuconfig
/ HTIF 의 다섯번째 옵션 HTIF_RFB 는 n으로 할 것

주의! busybox make menuconfig 시에
  • CONFIG_STATIC=y, listed as "Build BusyBox as a static binary (no shared libs)" in BusyBox Settings → Build Options
  • CONFIG_CROSS_COMPILER_PREFIX=riscv-linux-, listed as "Cross Compiler prefix" in BusyBox Settings → Build Options --> riscv64-unknown-linux-gnu- 로 바꿀 것.
  • CONFIG_FEATURE_INSTALLER=y, listed as "Support --install [-s] to install applet links at runtime" in BusyBox Settings → General Configuration
  • CONFIG_INIT=y, listed as "init" in Init utilities
  • CONFIG_ASH=y, listed as "ash" in Shells
  • CONFIG_ASH_JOB_CONTROL=n, listed as "Ash → Job control" in Shells
  • CONFIG_MOUNT=y, listed as "mount" in Linux System Utilities

댓글

이 블로그의 인기 게시물

[FPGA] Rocket Chip Generator

리눅스 커널 파일 시스템 [2] 코드 분석 - generic_file_read_iter()