修改核心來定位系統僵死的問題

2021-09-24 10:14:55 字數 3934 閱讀 3840

然後將修改過的timer.c拷貝到核心中,重新編譯:

e:\linux-2.6.22.6\arch\arm\plat-s3c24xx\

/work/system/linux-2.6.22.6/arch/arm/plat-s3c24xx

然後重新編譯,並且將核心拷貝到網路檔案系統中以新的核心重新啟動開發板

(注意一點,修改核心後一般出現錯誤的原因都是因為修改而出現的問題,看看錯誤資訊,仔細監測修改的地方)

cd /work/system/linux-2.6.22.6/

make uimage

cp arch/arm/boot/uimage /work/nfs_root/uimage_timer

reboot

qnfs 30000000 192.168.1.100:/work/nfs_root/uimage_timer

在不做任何事的情況下會列印下列資訊:

這個可能只是核心的一種狀態,因為在核心中沒有pid = 0 的程序, ps:

pid uid vsz stat command

1 0 3092 s init

2 0 sw< [kthreadd]

3 0 swn [ksoftirqd/0]

4 0 sw< [watchdog/0]

5 0 sw< [events/0]

6 0 sw< [khelper]

53 0 sw< [kblockd/0]

54 0 sw< [ksuspend_usbd]

57 0 sw< [khubd]

59 0 sw< [kseriod]

71 0 sw [pdflush]

72 0 sw [pdflush]

73 0 sw< [kswapd0]

74 0 sw< [aio/0]

708 0 sw< [mtdblockd]

723 0 sw< [kmmcd]

738 0 sw< [rpciod/0]

747 0 3096 s -sh

748 0 3096 r ps

安裝驅動程式,並且對其進行測試:

insmod first_drv.ko

./firstdrvtest

然後可以看到列印資訊:

s3c2410_timer_interrupt : pid = 751, task_name = firstdrvtest

這個說明是卡在程序firstdrvtest

但是這個不能體現具體卡在程序的具體位置,所以還要知道具體卡在程序的哪個地方了

原理: 系統中斷的時候具體的執行方式是:儲存現場 -> 執行中斷 -> 恢復現場 -> 儲存現場 -> 執行中斷 -> 恢復現場

儲存現場,儲存的是各個暫存器的值,所以列印出各個暫存器的值,列印出pc的值就知道系統卡死在什麼地方

pc暫存器所儲存的值是應用程式或者驅動程式執行到哪個地方的時候被打斷時儲存的值

中斷的時候,程式就會強行跳到0xffff0018的位置執行中斷程式(嵌入式linux應用開發),入口函式是asm_do_irq(不同的核心可能入口函式不一樣)

asmlinkage void asm_do_irq(int irq, struct pt_regs *regs)

struct pt_regs ;

#define arm_cpsr uregs[16]

#define arm_pc uregs[15]

pt_regs的作用主要是存放儲存現場存放的資訊。uregs[15]裡面存放的就是pc的值,將其列印出來就可以了。

在s3c2410_timer_init中可以看到中斷號是14 + 16 = 30;

#define irq_timer4 s3c2410_irq(14)

#define s3c2410_irq(x) ((x) + s3c2410_cpuirq_offset)

或者cat /proc/interrupts 可以看到中斷號是 :

30: 8990 s3c s3c2410 timer tick

恢復之前的s3c2410_timer_interrupt函式

在中斷的入口函式作如下修改:

asmlinkage void asm_do_irq(int irq, struct pt_regs *regs)

else

if(cnt == 10 * hz)

}........

然後重新編譯,以新的核心啟動,具體的操作就不寫了,和上面的一樣。

e:\linux-2.6.22.6\arch\arm26\kernel\

/work/system/linux-2.6.22.6/arch/arm/plat-s3c24xx

arch/arm/kernel/irq.c:213: error: syntax error at end of input,213行根本就不在irq.c裡面,後面沒有修改,

所以應該是irq.c**現了錯誤,檢查後發現是少了乙個}的原因。

下面是編譯核心的時候出現的錯誤提示資訊:

arch/arm/kernel/irq.c:145: warning: unsigned int format, long int arg (arg 2)

arch/arm/kernel/irq.c:199: warning: iso c90 forbids mixed declarations and code

arch/arm/kernel/irq.c:213: error: syntax error at end of input

scripts/makefile.build:202: recipe for target 'arch/arm/kernel/irq.o' failed

過程就不詳述了,直接寫出結果:

asm_do_irq =>> s3c2410_timer_interrupt : pid = 751, task_name = firstdrvtest

pc = bf00000c

這個就是輸出資訊。

後面怎麼分析就非常簡單了,在之前的根據pc值找出錯誤的地方已經說的非常清楚了,所以只是簡單分析下就行了:

根據pc值確定是載入的模組出現了錯誤,僵死

重啟開發板

nfs 30000000 192.168.1.100:/work/nfs_root/uimage_timer

bootm 30000000

insmod first_drv.ko

cat /proc/kallsyms > /kallsyms.txt

bf000000 t first_drv_open [first_drv]

arm-linux-objdump -d first_drv.ko > first_drv.dis

00000000 :

0: e1a0c00d mov ip, sp

4: e92dd800 s***b sp!,

8: e24cb004 sub fp, ip, #4 ; 0x4

c: ea000001 b 18 pc = bf00000c

所以出錯的就是: c: ea000001 b 18 假設核心出錯就簡單了,可以這樣:

vi system.map //檢視是不是核心的範圍

arm-linux-objdump -d vmlinux.ko > vmlinux.dis

然後就可以看看彙編知道哪兒出錯了

分布式系統的核心問題

分布式系統的核心問題 主要內容 一致性問題 共識問題 一致性 分布式集群中多個服務節點,對給定的操作,根據給定的協議,對處理結果對外保持一致.不在乎結果是否正確,而是保證對外呈現的狀態一致.所有節點失敗也是一種一致.引起不一致的因素 節點間網路通訊的不可靠,訊息延遲,訊息亂序,內容錯誤.節點處理時間...

時間戳和修改系統時間的問題

1.date currdate new date system.currenttimemillis long stamp currdate.gettime 當前系統時間戳,單位是毫秒 2.string time 2011 10 20 05 10 10 dateformat formatter new...

核心啟動無法掛載根檔案系統的問題

這類問題很常見,先總體介紹一下解決思路。能出現讓人激動的的控制台,那麼系統移植已經接近完成 但是不少人在最後一步出現問題。要點如下 1.在正確的位置燒寫正確格式的檔案系統映象 2.核心支援這種檔案系統格式 3.檔案系統的內容要完備 上面說得簡單,乙個個介紹。1.在正確的位置燒寫正確的檔案系統映象 a...