커 널 명령 처리
매우 고전적 인 문장
http://book.opensourceproject.org.cn/embedded/embeddedprime/index.html?page=opensource/0136130550/ch05lev1sec3.html
이 글 은 오리지널 이 니 출처 를 밝 혀 주 십시오. 감사합니다!
본 논문 분석 대상: arm Liux 2.6.29
0 처리 모델
Linux kernel 의 시작 은 많은 구성 요소 의 초기 화 와 관련 설정 을 포함 합 니 다. 이 설정 매개 변 수 는 보통 command line 을 통 해 설정 합 니 다.후속 분석 을 하기 전에 command line 의 처리 모델 을 이해 합 니 다.
처리 할 대상 은 문자열 입 니 다. 다양한 설정 정 보 를 포함 하고 있 습 니 다. 보통 각 설정 간 에 빈 칸 을 통 해 분 리 됩 니 다. 각 설정 의 표현 형식 은 param = value 1, value 2 또는 간단 한 rw 입 니 다.
그러면 kernel 은 이 매개 변 수 를 처리 하 는 처리 함수 목록 을 제공 해 야 합 니 다.매개 변수의 역할 과 집행 기의 선후 에 따라 이런 처리 함 수 는 서로 다른 단락 으로 정의 된다.모든 인자 에 대해 Kernel 은 해당 세그먼트 에서 해당 하 는 처리 함 수 를 찾 아 각 구성 요소 의 설정 을 합 니 다.
1 설정 형식
다음 과 같은 일반적인 설정 형식:
console=ttySAC0,115200 root=nfs nfsroot=192.168.1.9:/source/rootfs initrd=0x10800000,0x14af47
2 설정 방식
2.1 부 트 로 더 동적 설정
bootloader 에서 매개 변 수 를 설정 합 니 다. command line 은 atag 로 합 니 다.list 의 한 노드 가 Kernel 에 전 달 됩 니 다.
2.2 커 널 정적 설정
make menuconfig 를 통 해 설정: 실행 후 boot options - > Default kernel command string 을 설정 합 니 다.이 설정 은 커 널 에 정적 으로 컴 파일 됩 니 다. 변 수 를 통 해 defaultcommand_라인 접근.
3 설정 분석
3.1 관련 정의
실 행 된 우선 순위 에 따라 처리 함 수 를 세 가지 유형 으로 나 눌 수 있 습 니 다. 그들 은 각각 다음 세 단계 에 존재 합 니 다 (top / arch / arm / kernel / vmlinux. lds 참조).
__setup_start = .; *(.init.setup) __setup_end = .;
__early_begin = .; *(.early_param.init) __early_end = .;
__start___param = .; *(__param) __stop___param = .;
이 세 단락 안에 저 장 된 것 은 매개 변수 가 아니 라 command line 매개 변수 에 필요 한 처리 함수 입 니 다.
3.1.1 .early_param. init 세그먼트
". early param. init" 가 정의 하 는 처 리 는 상대 적 으로 앞 에 있 습 니 다. 처리 하 는 매개 변 수 는 initrd =, cachepolicy =, nocache, nowb, ecc =, vmalloc =, mem = 등 입 니 다.
이 처리 함수 들 은early_param 매크로 가 정의 합 니 다. 예 를 들 어:
static void __init early_initrd(char **p)
{ …… }
__early_param("initrd=", early_initrd);
매크로 에 대해early_param, top / arch / arm / include / asm / setup. h 에서 다음 과 같은 정 의 를 찾 을 수 있 습 니 다.
struct early_params {
const char *arg;
void (*fn)(char **p);
};
#define __early_param(name,fn) /
static struct early_params __early_##fn __used /
__attribute__((__section__(".early_param.init"))) = { name, fn }
3.1.2 .init.setup
세그먼트
". init. setup" 이 정의 하 는 처 리 는 뒤로 해 야 합 니 다. 예 를 들 어 nfsroot =, ip =, 등등.
이 처리 함수 들 은setup 매크로 가 정의 합 니 다. 예 를 들 어:
static int __init nfs_root_setup(char *line)
{ …… }
__setup("nfsroot=", nfs_root_setup);
매크로 에 대해setup, top / include / linux / Init. h 에서 볼 수 있 습 니 다:
#define __setup_param(str, unique_id, fn, early) /
static char __setup_str_##unique_id[] __initdata __aligned(1) = str; /
static struct obs_kernel_param __setup_##unique_id /
__used __section(.init.setup) /
__attribute__((aligned((sizeof(long))))) /
= { __setup_str_##unique_id, fn, early }
#define __setup(str, fn) /
__setup_param(str, fn, fn, 0)
/* NOTE: fn is as per module_param, not __setup! Emits warning if fn
* returns non-zero. */
#define early_param(str, fn) /
__setup_param(str, fn, fn, 1)
잘 보시 면 또 하나의 홍 얼 리 가 있 습 니 다.param, 그것 과 宏setup 의 정 의 는 비슷 하지만 마지막 매크로 인 자 는 0 이 아니 라 1 입 니 다.1. 미리 처리 해 야 할 매개 변 수 를 나타 낸다.
3.1.3 __param 세그먼트
이 단락 에 저 장 된 것 은 build - in 형식 module 의 설정 인자 입 니 다.이 매크로 는 필요 한 변 수 를 직접 수식 하 는 데 사 용 됩 니 다.
3.2 해석 하 다.
3.2.1 관련 변수
관련 변 수 는 다음 과 같 습 니 다.
default_command_line :
memuconfig 설정 의 인 자 를 저장 합 니 다. bootloader 가 명령 행 인 자 를 입력 하면 이 새로운 설정 은 이 변수 에 업 데 이 트 됩 니 다.
boot_command_line :
. init. data 세그먼트 에 존재 합 니 다.처음에는 defaultcommand_라인 복사.
command_line :
. init. data 세그먼트 에 존재 합 니 다.parse 에서cmdline () 에서 할당 되 었 습 니 다. 데이터 원본 은 default 입 니 다.command_line 。
saved_command_line :
처리 되 지 않 은 명령 행 인 자 를 저장 하 는 데 사 용 됩 니 다. boot 입 니 다.caommand_라인 복사.
static_command_line :
command 입 니 다.라인 복사.
3.2.2 주요 함수
함수 명: parsecmdline()
조작 데이터: defaultcommand_line 。
함수 목록:. earlyparam. init 세그먼트 ( early begin 과 early end 사이).
함수 기능: 함수 목록 에 따라 defaultcommand_line 의 매개 변 수 를 처리 합 니 다.
함수 명: parseearly_param()
조작 데이터: bootcommand_line 。
함수 목록:. init. setup 세그먼트 중 ( setup start 와 setup end 사이) 은 주로 매크로 early 를 통 해param 정의 부분.
함수 기능: 함수 목록 에 따라 bootcommand_line 의 매개 변 수 를 처리 합 니 다.
주의 parse원 () 의 네 번 째 입 참 은 0 이 고 다섯 번 째 인 자 는 NULL 입 니 다.여기 인자 대기 열 이 없습니다. bootcommand_line 의 모든 매개 변 수 는 매개 변수 대기 열 에서 비교 하여 찾 는 것 이 아니 라 do 에 직접 있 습 니 다.early_param () 에서 조건 판단 을 하고 아래 의 조건 을 만족 시 키 면 이 매개 변 수 를 대응 하 는 작업 을 합 니 다.
if ((p->early && strcmp(param, p->str) == 0) ||
(strcmp(param, "console") == 0 &&
strcmp(p->str, "earlycon") == 0)
)
함수 명: parseargs()
조작 데이터: staticcommand_line 。
함수 목록:param 세그먼트 ( start param 과 stop param 사이).
함수 기능: 이 조작 은 함수 목록 에 따라 staticcommand_line 의 매개 변 수 는 상응하는 조작 을 한다.이 조작 은 parseone () 의 첫 번 째 부분 코드 완성:
for (i = 0; i < num_params; i++) {
if (parameq(param, params[i].name)) {
DEBUGP("They are equal! Calling %p/n",
params[i].set);
return params[i].set(val, ¶ms[i]);
}
}
다음은 이 목록 에서 지원 하지 않 는 인자 에 대해 서 는 unknownbootoption () 에서 처리 합 니 다.재 unknownbootoption () 에 서 는 주로 obsoletechecksetup () 의 동작 입 니 다.
함수 명: obsoletechecksetup()
조작 데이터: staticcommand_line 。
함수 목록:. init. setup 세그먼트 에서 ( setup start 와 setup end 사이) 주로 매크로setup 정의 부분.
함수 기능: 이 조작 은 함수 목록 에 따라 staticcommand_line 의 매개 변 수 는 상응하는 조작 을 한다.parse 라면early_param () 에서 처 리 된 동작 입 니 다. 여 기 는 더 이상 처리 하지 않 습 니 다.찾 은 항목 에 조작 함수 가 없다 면, 이것 은 오래된 데이터 정의 (일부 초기 코드, 이 함 수 를 정의 하지 않 았 음) 를 나타 낸다.상기 두 가지 상황 이 아니라면 찾 은 함 수 를 이용 하여 매개 변 수 를 처리 합 니 다.
3.2.3 도시
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
용감한 바로 가기 및 우분투 응용 프로그램안녕하세요 여러분, 이 기사에서는 모든 사이트에서 pwa를 생성하고 실행기 응용 프로그램으로 추가하는 방법을 설명하고 싶습니다. 일부 웹사이트는 PWA로 설치를 허용하지 않지만 유사한 애플리케이션을 원합니다. 1. ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.