Linux 커널의 예외 정보: Oops에 대한 자세한 설명
Oops는 Linux 커널의 특수 오류 메시지로 널 포인터 역참조, 불법 메모리 액세스, 0으로 나누기 오류 등 커널에서 치명적이지 않은 예외가 발생했음을 나타내는 데 사용됩니다. Oops가 발생한다는 것은 일반적으로 커널에 버그가 있거나 드라이버에 문제가 있어 시스템이 불안정하거나 충돌을 일으킬 수 있음을 의미합니다. 이번 글에서는 웁스의 형식, 내용, 이유, 분류 등 리눅스 커널에서의 웁스의 원리와 특징을 소개하고, 사용법과 주의사항에 대한 예를 들어보겠습니다.
Linux 커널 개발에서 Oops란 무엇인가요? 사실 말하는 주인공이 리눅스가 된다는 점 외에는 위의 설명과 본질적인 차이는 없다. 좀 더 치명적인 문제가 발생하면 Linux 커널은 "죄송합니다. 제가 망쳤습니다."라고 변명하듯이 말할 것입니다. 커널 패닉이 발생하면 Linux 커널은 Oops 정보를 인쇄하고 현재 레지스터 상태, 스택 콘텐츠 및 전체 호출 추적을 표시하여 오류를 찾는 데 도움이 됩니다.
이제 예를 살펴보겠습니다. 이 기사의 주인공인 앗, 이 예제의 유일한 기능은 널 포인터 참조 오류를 생성하는 것입니다.
으아아아분명히 오류는 8번째 줄입니다.
다음으로 이 모듈을 컴파일하고 insmod를 사용하여 커널 공간에 삽입했습니다. 예상대로 Oops가 나타났습니다.
“
[ 100.243737] 버그: (null)
에서 커널 NULL 포인터 역참조를 처리할 수 없습니다.[100.244985] IP: [] hello_init+0x5/0x11 [안녕]
[ 100.262266] *pde = 00000000
[100.288395] 이런: 0002 [#1] SMP
[ 100.305468] 마지막 sysfs 파일: /sys/devices/virtual/sound/timer/uevent
[ 100.325955] 연결된 모듈: hello(+) vmblock vsock vmmemctl vmhgfs acpiphp snd_ens1371 gameport snd_ac97_codec ac97_bus snd_pcm_oss snd_mixer_oss snd_pcm snd_seq_dummy snd_seq_oss snd_se q_mid i snd_rawmidi snd_seq_midi_event snd_seq snd_timer snd_seq_device ppdev psmouse serio_raw fbcon 타일블릿 글꼴 bitblit Softcursor snd parport_pc soundcore snd_page_alloc vmci i2c_piix4 vga16fb vgastate intel_agp agpgart shpchp lp parport 플로피 pcnet32 mii mptspi mptscsih mptbase scsi_transport_spi vmxnet
[ 100.472178] [ 100.494931] Pid: 1586, comm: insmod 오염되지 않음 (2.6.32-21-generic #32-Ubuntu) VMware 가상 플랫폼
[100.540018] EIP: 0060:[] EFLAGS: 00010246 CPU: 0
[ 100.562844] EIP는 hello_init+0x5/0x11 [hello]에 있습니다.
[ 100.584351] EAX: 00000000 EBX: ffffffffc ECX: f82cf040 EDX: 00000001
[ 100.609358] ESI: f82cf040 EDI: 00000000 EBP: f1b9ff5c ESP: f1b9ff5c
[ 100.631467] DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068
[ 100.657664] insmod 프로세스(pid: 1586, ti=f1b9e000 task=f137b340 task.ti=f1b9e000)
[100.706083] 스택:
[ 100.731783] f1b9ff88 c0101131 f82cf040 c076d240 fffffffc f82cf040 0072cff4 f82d2000
[ 100.759324]fffffffc f82cf040 0072cff4 f1b9ffac c0182340 f19638f8 f137b340 f19638c0
[100.811396]00000004 09cc9018 09cc9018 00020000 f1b9e000 c01033ec 09cc9018 00015324
[100.891922] 통화 추적:
[ 100.916257] [] ? do_one_initcall+0x31/0x190
[ 100.943670] [] ? hello_init+0x0/0x11 [안녕]
[ 100.970905] [] ?sys_init_module+0xb0/0x210
[ 100.995542] [] ?syscall_call+0x7/0xb
[ 101.024087] 코드: 05 00 00 00 00 01 00 00 00 5d c3 00 00 00 00 00 00 00 00 00 00
[ 101.079592] EIP: [] hello_init+0x5/0x11 [hello] SS:ESP 0068:f1b9ff5c
[101.134682] CR2: 0000000000000000
[ 101.158929] —[ 추적 종료 e294b69a66d752cb ]—
”
앗, 이게 어떤 버그인지 먼저 설명한 뒤, 버그가 발생한 위치를 지적했는데, "IP: [] hello_init+0x5/0x11 [hello]" 입니다.
여기서 문제 분석에 도움이 되는 보조 도구인 objdump를 사용해야 합니다. objdump를 사용하여 디스어셈블할 수 있으며 명령 형식은 다음과 같습니다.
“
objdump -S hello.o
”
下面是hello.o反汇编的结果,而且是和C代码混排的,非常的直观。
hello.o: file format elf32-i386 Disassembly of section .init.text: 00000000 : #include #include static int __init hello_init(void) { 0: 55 push %ebp int *p = 0; *p = 1; return 0; } 1: 31 c0 xor %eax,%eax #include #include static int __init hello_init(void) { 3: 89 e5 mov %esp,%ebp int *p = 0; *p = 1; 5: c7 05 00 00 00 00 01 movl $0x1,0x0 c: 00 00 00 return 0; } f: 5d pop %ebp 10: c3 ret Disassembly of section .exit.text: 00000000 : static void __exit hello_exit(void) { 0: 55 push %ebp 1: 89 e5 mov %esp,%ebp 3: e8 fc ff ff ff call 4 return; } 8: 5d pop %ebp 9: c3 ret
对照Oops的提示,我们可以很清楚的看到,出错的位置hello_init+0x5的汇编代码是:
5:c7 05 00 00 00 00 01 movl $0x1,0x0
这句代码的作用是把数值1存入0这个地址,这个操作当然是非法的。
我们还能看到它对应的c代码是:
*p = 1;
Bingo!在Oops的帮助下我们很快就解决了问题。
我们再回过头来检查一下上面的Oops,看看Linux内核还有没有给我们留下其他的有用信息。
“
Oops: 0002 [#1]
”
这里面,0002表示Oops的错误代码(写错误,发生在内核空间),#1表示这个错误发生一次。
Oops的错误代码根据错误的原因会有不同的定义,本文中的例子可以参考下面的定义(如果发现自己遇到的Oops和下面无法对应的话,最好去内核代码里查找):
“
* error_code:
* bit 0 == 0 means no page found, 1 means protection fault
* bit 1 == 0 means read, 1 means write
* bit 2 == 0 means kernel, 1 means user-mode
* bit 3 == 0 means data, 1 means instruction”
有时候,Oops还会打印出Tainted信息。这个信息用来指出内核是因何种原因被tainted(直译为“玷污”)。具体的定义如下:
“
1: ‘G’ if all modules loaded have a GPL or compatible license, ‘P’ if any proprietary module has been loaded. Modules without a MODULE_LICENSE or with a MODULE_LICENSE that is not recognised by insmod as GPL compatible are assumed to be proprietary.
2: ‘F’ if any module was force loaded by “insmod -f”, ‘ ‘ if all modules were loaded normally.
3: ‘S’ if the oops occurred on an SMP kernel running on hardware that hasn’t been certified as safe to run multiprocessor. Currently this occurs only on various Athlons that are not SMP capable.
4: ‘R’ if a module was force unloaded by “rmmod -f”, ‘ ‘ if all modules were unloaded normally.
5: ‘M’ if any processor has reported a Machine Check Exception, ‘ ‘ if no Machine Check Exceptions have occurred.
6: ‘B’ if a page-release function has found a bad page reference or some unexpected page flags.
7: ‘U’ if a user or user application specifically requested that the Tainted flag be set, ‘ ‘ otherwise.
8: ‘D’ if the kernel has died recently, i.e. there was an OOPS or BUG.
9: ‘A’ if the ACPI table has been overridden.
10: ‘W’ if a warning has previously been issued by the kernel. (Though some warnings may set more specific taint flags.)
11: ‘C’ if a staging driver has been loaded.
12: ‘I’ if the kernel is working around a severe bug in the platform firmware (BIOS or similar).”
기본적으로 이 Tainted 정보는 커널 개발자를 위해 예약되어 있습니다. 사용자가 Linux를 사용할 때 Oops를 발견하면 디버깅을 위해 Oops의 내용을 커널 개발자에게 보낼 수 있습니다. 이 Tainted 정보를 기반으로 커널 개발자는 커널 패닉이 발생할 때 커널이 실행되는 환경을 결정할 수 있습니다. 우리가 자체 드라이버를 디버깅한다면 이 정보는 의미가 없을 것입니다.
이 문서의 예는 매우 간단합니다. 발생한 후 다운타임이 발생하지 않았으므로 dmesg에서 전체 정보를 볼 수 있습니다. 그러나 이러한 오류 메시지는 파일에 저장될 시간이 없으며 전원을 끄면 더 이상 볼 수 없습니다. 손으로 쓰거나 사진을 찍는 등 다른 방법으로만 기록할 수 있습니다.
더 나쁜 상황이 있습니다. 정보가 너무 많으면 한 페이지의 화면이 완전히 표시되지 않습니다. 전체 내용을 어떻게 볼 수 있나요? 첫 번째 방법은 grub에서 vga 매개변수를 사용하여 화면에 더 많은 콘텐츠를 표시할 수 있도록 더 높은 해상도를 지정하는 것입니다. 분명히 이 방법은 너무 많은 문제를 해결할 수 없습니다. 두 번째 방법은 두 대의 시스템을 사용하여 직렬 포트를 통해 디버깅 시스템의 죄송합니다 정보를 호스트 화면에 인쇄하는 것입니다. 그러나 현재 대부분의 노트북에는 직렬 포트가 없으며 이 솔루션에도 큰 제한이 있습니다. 세 번째 방법은 오류가 발생할 때 커널 덤프 도구 kdump를 사용하여 파일에 메모리 및 CPU 레지스터의 내용을 덤프하는 것입니다. 문제를 분석하기 위해 gdb를 사용합니다.
커널 드라이버를 개발하는 과정에서 마주칠 수 있는 문제는 종류가 다양하고, 디버깅 방법도 다양합니다. 이런, 리눅스 커널이 우리에게 주는 알림인데 우리는 이를 잘 활용해야 합니다.
이 글을 통해 우리는 커널의 문제를 진단하고 디버그하는 데 사용할 수 있는 Linux 커널의 Oops의 원리와 특성에 대해 배웠습니다. 실제 요구 사항에 따라 적절한 도구를 선택하고 Oops 정보 저장 및 분석, 기호 테이블 및 소스 코드를 사용하여 문제 찾기, 모듈 매개 변수 및 커널 매개 변수를 사용하여 커널 동작 조정 등과 같은 몇 가지 기본 원칙을 따라야 합니다. 죄송합니다. Linux 커널의 일반적인 오류 메시지는 커널의 상태와 예외를 반영할 수 있으며 커널의 품질과 안정성을 향상시킬 수도 있습니다. 이 글이 여러분에게 도움이 되고 영감을 줄 수 있기를 바랍니다.
위 내용은 Linux 커널의 예외 정보: Oops에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

Linux의 주요 용도에는 다음이 포함됩니다. 1. 서버 운영 체제, 2. 임베디드 시스템, 3. 데스크탑 운영 체제, 4. 개발 및 테스트 환경. Linux는이 분야에서 뛰어나 안정성, 보안 및 효율적인 개발 도구를 제공합니다.

인터넷은 단일 운영 체제에 의존하지 않지만 Linux는 이에 중요한 역할을합니다. Linux는 서버 및 네트워크 장치에서 널리 사용되며 안정성, 보안 및 확장 성으로 인기가 있습니다.

Linux 운영 체제의 핵심은 명령 줄 인터페이스이며 명령 줄을 통해 다양한 작업을 수행 할 수 있습니다. 1. 파일 및 디렉토리 작업 LS, CD, MKDIR, RM 및 기타 명령을 사용하여 파일 및 디렉토리를 관리합니다. 2. 사용자 및 권한 관리는 UserAdd, Passwd, CHMOD 및 기타 명령을 통해 시스템 보안 및 리소스 할당을 보장합니다. 3. 프로세스 관리는 PS, Kill 및 기타 명령을 사용하여 시스템 프로세스를 모니터링하고 제어합니다. 4. 네트워크 운영에는 Ping, Ifconfig, SSH 및 기타 명령이 포함되어 있으며 네트워크 연결을 구성하고 관리합니다. 5. 시스템 모니터링 및 유지 관리 Top, DF, Du와 같은 명령을 사용하여 시스템의 작동 상태 및 리소스 사용을 이해합니다.

소개 Linux는 유연성과 효율성으로 인해 개발자, 시스템 관리자 및 전원 사용자가 선호하는 강력한 운영 체제입니다. 그러나 길고 복잡한 명령을 자주 사용하는 것은 지루하고 응급실이 될 수 있습니다.

Linux는 서버, 개발 환경 및 임베디드 시스템에 적합합니다. 1. 서버 운영 체제로서 Linux는 안정적이고 효율적이며 종종 고 대전성 애플리케이션을 배포하는 데 사용됩니다. 2. 개발 환경으로서 Linux는 효율적인 명령 줄 도구 및 패키지 관리 시스템을 제공하여 개발 효율성을 향상시킵니다. 3. 임베디드 시스템에서 Linux는 가볍고 사용자 정의 가능하며 자원이 제한된 환경에 적합합니다.

소개 : Linux 기반의 윤리적 해킹으로 디지털 프론티어 보안 점점 더 상호 연결된 세상에서 사이버 보안이 가장 중요합니다. 윤리적 해킹 및 침투 테스트는 취약점을 적극적으로 식별하고 완화하는 데 필수적입니다.

기본 Linux 학습 방법은 다음과 같습니다. 1. 파일 시스템 및 명령 줄 인터페이스 이해, 2. LS, CD, MKDIR, 3. 파일 생성 및 편집과 같은 파일 작업 배우기, 4. 파이프 라인 및 GREP 명령과 같은 고급 사용법, 5. 연습 및 탐색을 통해 지속적으로 기술을 향상시킵니다.

Linux는 서버, 임베디드 시스템 및 데스크탑 환경에서 널리 사용됩니다. 1) 서버 필드에서 Linux는 안정성 및 보안으로 인해 웹 사이트, 데이터베이스 및 응용 프로그램을 호스팅하기에 이상적인 선택이되었습니다. 2) 임베디드 시스템에서 Linux는 높은 사용자 정의 및 효율성으로 인기가 있습니다. 3) 데스크탑 환경에서 Linux는 다양한 사용자의 요구를 충족시키기 위해 다양한 데스크탑 환경을 제공합니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

mPDF
mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

Eclipse용 SAP NetWeaver 서버 어댑터
Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

WebStorm Mac 버전
유용한 JavaScript 개발 도구

MinGW - Windows용 미니멀리스트 GNU
이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

VSCode Windows 64비트 다운로드
Microsoft에서 출시한 강력한 무료 IDE 편집기
