
2024.06.11 - [개발/c 언어] - 커널 소스 코드 분석 - socket 4 커널 소스 코드 분석 - socket 42024.06.07 - [개발/c 언어] - 커널 소스 코드 분석 - socket 3 커널 소스 코드 분석 - socket 32024.06.03 - [개발/리눅스] - 커널 소스 코드 분석 - socket 2 커널 소스 코드 분석 - socket 2이전 글:2024.05.30 - [개발/lhs9602.tistory.com 지금까지는 소켓의 구조체들을 할당 및 초기화 작업을 진행했다면, 이제부터는 만들어진 소켓을 fd테이블에 등록하는 동작을 실행한다.int __sys_socket(int family, int type, int protocol){ ... return sock_map_..
2024.06.07 - [개발/c 언어] - 커널 소스 코드 분석 - socket 3 커널 소스 코드 분석 - socket 32024.06.03 - [개발/리눅스] - 커널 소스 코드 분석 - socket 2 커널 소스 코드 분석 - socket 2이전 글:2024.05.30 - [개발/리눅스] - 커널 소스 코드 분석 - socket 1 커널 소스 코드 분석 - socket 1우리가 쓰는 리lhs9602.tistory.com tcp_v4_init_sock 함수를 분석하기 전에 저번 시간에서 넘아갔던 sock_init_data함수를 잠깐 살펴볼것이다.sock_init_datavoid sock_init_data(struct socket *sock, struct sock *sk){ kuid_t uid = ..
2024.06.03 - [개발/리눅스] - 커널 소스 코드 분석 - socket 2 커널 소스 코드 분석 - socket 2이전 글:2024.05.30 - [개발/리눅스] - 커널 소스 코드 분석 - socket 1 커널 소스 코드 분석 - socket 1우리가 쓰는 리눅스는 커널이라는 os로 관리하며, 이 커널에서 기본적인 함수나 매크로를 불러와서lhs9602.tistory.com inet_createstatic int inet_create(struct net *net, struct socket *sock, int protocol, int kern){ struct sock *sk; struct inet_protosw *answer; struct inet_sock *inet; struc..
이전 글:2024.05.30 - [개발/리눅스] - 커널 소스 코드 분석 - socket 1 커널 소스 코드 분석 - socket 1우리가 쓰는 리눅스는 커널이라는 os로 관리하며, 이 커널에서 기본적인 함수나 매크로를 불러와서 사용한다.또, 커널은 c언어로 구성되어 있기에, 소스 코드를 분석하면 c의 숙련도와 리눅스의lhs9602.tistory.com __sys_socket_createstatic struct socket *__sys_socket_create(int family, int type, int protocol){ struct socket *sock; int retval; BUILD_BUG_ON(SOCK_CLOEXEC != O_CLOEXEC); BUILD_BUG_ON((SOCK_MAX | S..
우리가 쓰는 리눅스는 커널이라는 os로 관리하며, 이 커널에서 기본적인 함수나 매크로를 불러와서 사용한다.또, 커널은 c언어로 구성되어 있기에, 소스 코드를 분석하면 c의 숙련도와 리눅스의 이해도를 높일 수 있다. 모든 부분을 전부 분석할 수는 없으므로, 필자가 가장 많이 쓰고 자신 있는 소켓 함수를 분석할 것이다.커널 버전은 가장 최신인 6.10이고, ipv4환경에서 tcp 소켓 통신을 기준으로 분석하겠다. 우선 socket 함수부터 시작하겠다. SYSCALL_DEFINE3 가장 먼저 볼 것은 리눅스에서 함수를 등록하는 매크로인 SYSCALL_DEFINEX이다. #define SYSCALL_DEFINE1(name, ...) SYSCALL_DEFINEx(1, _##name, __VA_ARGS__)#d..

이전글에서 이어서 진행하여 설명하겠습니다.2024.05.24 - [개발/리눅스] - 리눅스 - 파일 시스템 VFS 1(superblock, inode) 리눅스 - 파일 시스템 VFS 1(superblock,inode)2024.05.23 - [분류 전체보기] - 리눅스 - 모든 것은 파일이다 리눅스 - 모든 것은 파일이다리눅스를 배울 때 한번쯤은 듣는 말이 "리눅스의 모든 것은 파일"이라는 것이다.필자도 듣기로는 자주 들lhs9602.tistory.com file우리가 코드에서 파일을 읽고 쓸 때는, fopen() 함수를 통해 struct file 구조체에 파일을 할당합니다.이때, VFS에서 사용하는 file과 struct file 구조체는 같습니다.여기서 file은 전체 파일을 가리키는 게 아닌, ..

2024.05.23 - [분류 전체보기] - 리눅스 - 모든 것은 파일이다 리눅스 - 모든 것은 파일이다리눅스를 배울 때 한번쯤은 듣는 말이 "리눅스의 모든 것은 파일"이라는 것이다.필자도 듣기로는 자주 들었지만, 실제로 어떤 의미인지는 잘 와닫지 않았다.그냥 "리눅스에서 파일이 자주 쓰인lhs9602.tistory.com 이전 글에서 리눅스의 모든 것은 파일이다 라고 했다.그렇다면 리눅스에는 종류에 파일이 존재한다는 것인데 이것을 어떻게 관리할까? 심지어 내가 알기로는 네트워크 통신에 사용되는 소켓도 파일인데, 이렇게 다양한 종류의 파일들을 하나의 시스템에서 관리할 수 있을까? 정답은 각 파일 종류별로 지원하는 파일 시스템은 다르다는 것이다. 그럼 리눅스에서 파일 실행 시 어떻게 딱 맞는 파일 시스템..

리눅스를 배울 때 한번쯤은 듣는 말이 "리눅스의 모든 것은 파일"이라는 것이다.필자도 듣기로는 자주 들었지만, 실제로 어떤 의미인지는 잘 와닫지 않았다.그냥 "리눅스에서 파일이 자주 쓰인다" 정도로만 이해하고 넘어간 사람도 있을 것이다. 그러나 위에서 한 말은 사실 리눅스를 한 문장으로 요약한 말이나 다름이 없다."리눅스에서 모든 것이 파일이다"는 것은 어떤 비유나 은유가 아니다. 실제로 모든 것이 파일로 저장되기 때문에 나온 말이다. 리눅스 기본 디렉터리 구조"리눅스에서 모든 것이 파일이다" 이라는 리눅스의 기본 디렉터리 구조를 이해하면 확실히 알 수있다. 위 그림은 우리가 root에서 흔히 ls 명령어로 볼 수 있는 리눅스의 디렉터리들이다.평소에 그냥 지나치는 경우가 많은데, 사실 저 디렉터리들은 ..

프로젝트를 진행하면, 정말 다양한 버그와 오류가 생각치도 못한 곳에서 발생한다. 이를 해결하기 위해 코드를 수정하는 것을 유지보수라 한다. 이런 코드 유지보수을 위해 사용하는 것이 유닛 테스트이다. 쉽게 설명하면, 롤에서 가렌의 궁극기의 데미지가 안나오는 버그가 발생했다고 가정하자. 그럼 이를 수정 후 제대로 고쳐졌는지 확인해야하는 데, 게임에 접속해서 6렙까지 올리고 상대방에게 궁까지 써서 확인하는가? 필요한 것은 궁극기를 사용하는 것인데, 전 단계에 불필요한 과정이 많다는 것을 느낄 것이다. 이때 버튼만 딸깍하면 궁극기의 데미지가 나오는 코드가 있다면 얼마나 편리한가? 유닛 테스트는 이렇게 특정 코드를 테스트 할때, 실제 프로그램을 실행시켜 확인하는 게 아닌 테스트에 필요한 부분만 구현하고 이를 실행..

이번 글에서는 서로 어떻게 데이터를 주고 받았는 지를 서술할 것이다. 마스터 서버 transfer_header_t transfer_header; memset(&transfer_header, 0, sizeof(transfer_header_t)); // 파일 리스트 직렬화 update_header_set(file_list, &transfer_header, 1); file_list_serialized(&serialized_data, &transfer_header, file_list); // 직렬화 데이터 압축화 if (transfer_header.total_size > COMPRESS_BOUNDARY) { transfer_header.total_size = serialized_data_compress(&ser..