![写入字符设备文件导致 list_del 或 list_add 损坏。我如何解决它?](https://linux22.com/image/228306/%E5%86%99%E5%85%A5%E5%AD%97%E7%AC%A6%E8%AE%BE%E5%A4%87%E6%96%87%E4%BB%B6%E5%AF%BC%E8%87%B4%20list_del%20%E6%88%96%20list_add%20%E6%8D%9F%E5%9D%8F%E3%80%82%E6%88%91%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3%E5%AE%83%EF%BC%9F.png)
我正在关注LDD3。我已经实现了 scull 模块的读写功能。每当我运行echo hello > /dev/scull0
测试写入函数时,我都会收到 list_add / list_del 损坏和堆栈跟踪。
这是我的代码:
#include <linux/module.h>
#include <linux/init.h>
#include <linux/moduleparam.h>
#include <linux/stat.h>
#include <linux/types.h>
#include <linux/fs.h>
#include <linux/cdev.h>
#define SCULL_DEV_NO 4
MODULE_LICENSE("Dual BSD/GPL");
static int scull_major = 0;
static int scull_minor = 0;
static int scull_nr_devs = 4;
static int scull_qset_val = 1000;
static int scull_quantum_val = 4000;
module_param(scull_major, int, S_IRUGO);
static dev_t dev = 0;
struct scull_qset{
void **data;
struct scull_qset * next;
};
struct scull_dev{
struct cdev cdev;
struct scull_qset *data;
int qset;
unsigned long size;
int quantum;
unsigned int access_key;
struct semaphore sem;
};
int scull_trim(struct scull_dev *dev){
struct scull_qset *dptr, *next;
int i;
int qset = dev->qset;
for (dptr = dev->data; dptr; dptr = next){
if (dptr->data){
for(i = 0; i < qset; i++){
kfree(dptr->data[i]);
}
kfree(dptr->data);
dptr->data = NULL;
}
next = dptr->next;
kfree(dptr);
}
dev->data = NULL;
dev->qset = scull_qset_val;
dev->size = 0;
dev->quantum = scull_quantum_val;
return 0;
}
int scull_open(struct inode * inode, struct file * filp){
struct scull_dev * dev;
dev = container_of(inode->i_cdev, struct scull_dev, cdev);
filp->private_data = dev;
if((filp->f_flags & O_ACCMODE) == O_WRONLY){
scull_trim(dev);
}
printk(KERN_INFO "scull: Opened device %d\n", iminor(inode));
return 0;
}
int scull_release(struct inode * inode, struct file * filp){
printk(KERN_INFO "scull: Released device %d\n", iminor(inode));
return 0;
}
struct scull_qset* scull_follow(struct scull_dev *dev, int item){
struct scull_qset* ptr = dev->data;
struct scull_qset* rptr = NULL;
for(int i=0; i<item+1; i++){
pr_info("DEBUG: ptr = %p, ptr->next = %p\n", ptr, ptr ? ptr->next : NULL);
if(ptr == NULL){
ptr = kmalloc(sizeof(struct scull_qset), GFP_KERNEL);
if (ptr == NULL)
return NULL;
memset(ptr, 0, sizeof(struct scull_qset));
ptr->data = NULL;
ptr->next = NULL;
}
rptr = ptr;
ptr = ptr->next;
}
return rptr;
}
ssize_t scull_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos){
ssize_t retval = 0;
struct scull_dev *dev = filp->private_data;
struct scull_qset *dptr;
int quantum = dev->quantum, qset = dev->qset;
int itemsize = quantum * qset;
int item, s_pos, q_pos, rest;
if (down_interruptible(&dev->sem))
return -ERESTARTSYS;
if (*f_pos >= dev->size)
goto out;
if (*f_pos + count > dev->size)
count = dev->size - *f_pos;
item = (long)*f_pos / itemsize;
rest = (long)*f_pos % itemsize;
s_pos = rest / quantum; q_pos = rest % quantum;
dptr = scull_follow(dev, item);
if (dptr == NULL || !dptr->data || !dptr->data[s_pos])
goto out;
if (count > quantum - q_pos)
count = quantum - q_pos;
if (copy_to_user(buf, dptr->data[s_pos] + q_pos, count)){
return -EFAULT;
goto out;
}
*f_pos += count;
retval = count;
out:
up(&dev->sem);
return retval;
}
ssize_t scull_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos){
struct scull_dev *dev = filp->private_data;
struct scull_qset *dptr;
int quantum = dev->quantum, qset = dev->qset;
int itemsize = quantum * qset;
int item, s_pos, q_pos, rest;
ssize_t retval = -ENOMEM;
if (down_interruptible(&dev->sem))
return -ERESTARTSYS;
item = (long)*f_pos / itemsize;
rest = (long)*f_pos % itemsize;
s_pos = rest / quantum; q_pos = rest % quantum;
dptr = scull_follow(dev, item);
if (dptr == NULL)
goto out;
if (!dptr->data){
dptr->data = kmalloc(sizeof(char *) * dev->qset, GFP_KERNEL);
if (!dptr->data)
goto out;
memset(dptr->data, 0, qset * sizeof(char *));
}
if (!dptr->data[s_pos]){
dptr->data[s_pos] = kmalloc(dev->quantum, GFP_KERNEL);
if (!dptr->data[s_pos])
goto out;
}
if (count > quantum - q_pos)
count = quantum - q_pos;
if (copy_from_user(dptr->data[s_pos] + q_pos, buf, count)){
retval = -EFAULT;
goto out;
}
*f_pos += count;
retval = count;
if (dev->size < *f_pos)
dev->size = *f_pos;
out:
up(&dev->sem);
return retval;
}
static struct scull_dev scull_devp_array[SCULL_DEV_NO];
struct file_operations scull_fops = {
.owner = THIS_MODULE,
.open = scull_open,
.release = scull_release,
.read = scull_read,
.write = scull_write
};
static void scull_setup_cdev(struct scull_dev *dev, int index){
dev_t dev_no = MKDEV(scull_major, scull_minor + index);
cdev_init(&dev->cdev, &scull_fops);
dev->cdev.owner = THIS_MODULE;
printk(KERN_INFO "scull: Initialized Major: %d, Minor: %d\n", scull_major, scull_minor + index);
int result = cdev_add(&dev->cdev, dev_no, 1);
if (result < 0){
printk(KERN_ERR "scull: Failed to add Major: %d, Minor: %d\n", scull_major, scull_minor + index);
}
}
static void scull_rm_cdev(struct scull_dev *dev){
printk(KERN_INFO "scull: Removing cdev\n");
cdev_del(&dev->cdev);
}
static int __init scull_init(void){
printk(KERN_INFO "scull: Allocating char device...\n");
int result;
if(scull_major){
dev = MKDEV(scull_major, scull_minor);
result = register_chrdev_region(dev, scull_nr_devs, "scull");
}
else{
result = alloc_chrdev_region(&dev, scull_minor, scull_nr_devs, "scull");
scull_major = MAJOR(dev);
}
if (result < 0){
printk(KERN_WARNING "scull: can't get major %d\n", scull_major);
return result;
}
printk(KERN_INFO "scull: Major is %d", scull_major);
for(int i = scull_minor; i < scull_nr_devs; i++){
scull_setup_cdev(&scull_devp_array[i], i);
}
return 0;
}
static void __exit scull_exit(void){
printk(KERN_INFO "scull: Exiting...\n");
unregister_chrdev_region(dev, scull_nr_devs);
printk(KERN_INFO "scull: Unregistered device\n");
for(int i = scull_minor; i < scull_nr_devs; i++){
scull_rm_cdev(&scull_devp_array[i]);
printk(KERN_INFO "scull: Freeing scull_dev %d\n", i);
}
}
module_init(scull_init);
module_exit(scull_exit);
我跑了echo hello > /dev/scull0
。 dmesg 日志显示list_add corruption. prev is NULL
运行该命令的情况。当我退出Ctrl + C
并再次运行该命令时,dmesg 日志显示 2 个错误,第一个是 a list_del corruption
,第二个是 a list_add corruption
。这是 3 个错误的 dmesg 日志:
[43170.630743] scull: Opened device 0
[43170.630761] ------------[ cut here ]------------
[43170.630764] list_add corruption. prev is NULL.
[43170.630773] WARNING: CPU: 6 PID: 57011 at lib/list_debug.c:25 __list_add_valid_or_report+0x42/0xa0
[43170.630784] Modules linked in: scull(OE) ntfs3 snd_seq_dummy snd_hrtimer snd_seq ccm nvidia_drm(POE) nvidia_uvm(POE) nvidia_modeset(POE) nvidia(POE) vfat fat intel_rapl_msr intel_rapl_common edac_mce_amd kvm_amd iwlmvm kvm mac80211 irqbypass mousedev snd_usb_audio joydev crct10dif_pclmul crc32_pclmul polyval_clmulni polyval_generic snd_usbmidi_lib snd_ump snd_hda_codec_realtek snd_rawmidi snd_hda_codec_generic snd_seq_device ledtrig_audio gf128mul snd_hda_codec_hdmi mc ghash_clmulni_intel sha512_ssse3 sha256_ssse3 sha1_ssse3 aesni_intel snd_hda_intel snd_intel_dspcfg snd_intel_sdw_acpi snd_hda_codec libarc4 snd_hda_core btusb btrtl btintel iwlwifi btbcm snd_hwdep btmtk snd_pcm bluetooth cfg80211 snd_timer snd r8169 crypto_simd cryptd ecdh_generic rapl soundcore realtek sp5100_tco mdio_devres k10temp libphy rfkill i2c_piix4 video ccp gigabyte_wmi wmi_bmof pcspkr acpi_cpufreq gpio_amdpt wmi mac_hid gpio_generic i2c_dev crypto_user loop fuse dm_mod nfnetlink ip_tables x_tables ext4 crc32c_generic crc16 mbcache jbd2
[43170.630928] usbhid nvme nvme_core crc32c_intel xhci_pci xhci_pci_renesas nvme_auth
[43170.630941] Unloaded tainted modules: scull(OE):13 [last unloaded: scull(OE)]
[43170.630951] CPU: 6 PID: 57011 Comm: bash Tainted: P R D W OE 6.7.0-arch3-1 #1 29ada86f174bb9983ea57568622d66509982ed7e
[43170.630957] Hardware name: Gigabyte Technology Co., Ltd. B450M DS3H WIFI/B450M DS3H WIFI-CF, BIOS F52 01/07/2021
[43170.630960] RIP: 0010:__list_add_valid_or_report+0x42/0xa0
[43170.630966] Code: 75 41 4c 8b 02 49 39 c0 75 4c 48 39 fa 74 60 49 39 f8 74 5b b8 01 00 00 00 e9 fa 05 77 00 48 c7 c7 d0 c7 2a 92 e8 fe 24 a5 ff <0f> 0b 31 c0 e9 e5 05 77 00 48 c7 c7 f8 c7 2a 92 e8 e9 24 a5 ff 0f
[43170.630970] RSP: 0018:ffffad82c1e9bcf8 EFLAGS: 00010082
[43170.630975] RAX: 0000000000000000 RBX: 7fffffffffffffff RCX: 0000000000000027
[43170.630979] RDX: ffff89f40e9a16c8 RSI: 0000000000000001 RDI: ffff89f40e9a16c0
[43170.630982] RBP: ffffad82c1e9bd68 R08: 0000000000000000 R09: ffffad82c1e9bb80
[43170.630985] R10: 0000000000000003 R11: ffff89f41f32b368 R12: ffffffffc24b87c8
[43170.630989] R13: 0000000000000001 R14: 0000000000000000 R15: ffffffffc24b87d0
[43170.630992] FS: 00007747f80d6740(0000) GS:ffff89f40e980000(0000) knlGS:0000000000000000
[43170.630997] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[43170.631000] CR2: 0000563ef7be1000 CR3: 00000001c487c000 CR4: 0000000000350ef0
[43170.631004] Call Trace:
[43170.631008] <TASK>
[43170.631011] ? __list_add_valid_or_report+0x42/0xa0
[43170.631016] ? __warn+0x81/0x130
[43170.631025] ? __list_add_valid_or_report+0x42/0xa0
[43170.631030] ? report_bug+0x171/0x1a0
[43170.631037] ? prb_read_valid+0x1b/0x30
[43170.631043] ? srso_return_thunk+0x5/0x5f
[43170.631050] ? handle_bug+0x3c/0x80
[43170.631057] ? exc_invalid_op+0x17/0x70
[43170.631063] ? asm_exc_invalid_op+0x1a/0x20
[43170.631074] ? __list_add_valid_or_report+0x42/0xa0
[43170.631080] ? __list_add_valid_or_report+0x42/0xa0
[43170.631084] __down_common+0x71/0x230
[43170.631095] down_interruptible+0x52/0x60
[43170.631101] scull_write+0x4c/0x200 [scull bd55e810425245067618b333771c8e3ae1dc9535]
[43170.631114] vfs_write+0xf2/0x400
[43170.631127] ksys_write+0x6f/0xf0
[43170.631135] do_syscall_64+0x64/0xe0
[43170.631140] ? srso_return_thunk+0x5/0x5f
[43170.631145] ? syscall_exit_to_user_mode+0x2b/0x40
[43170.631150] ? srso_return_thunk+0x5/0x5f
[43170.631155] ? do_syscall_64+0x70/0xe0
[43170.631159] ? srso_return_thunk+0x5/0x5f
[43170.631164] ? do_syscall_64+0x70/0xe0
[43170.631169] ? srso_return_thunk+0x5/0x5f
[43170.631174] ? exc_page_fault+0x7f/0x180
[43170.631180] entry_SYSCALL_64_after_hwframe+0x6e/0x76
[43170.631186] RIP: 0033:0x7747f8254034
[43170.631209] Code: c7 00 16 00 00 00 b8 ff ff ff ff c3 66 2e 0f 1f 84 00 00 00 00 00 f3 0f 1e fa 80 3d 35 c3 0d 00 00 74 13 b8 01 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 54 c3 0f 1f 00 48 83 ec 28 48 89 54 24 18 48
[43170.631213] RSP: 002b:00007fffe0667af8 EFLAGS: 00000202 ORIG_RAX: 0000000000000001
[43170.631218] RAX: ffffffffffffffda RBX: 0000000000000006 RCX: 00007747f8254034
[43170.631222] RDX: 0000000000000006 RSI: 0000563ef7bde970 RDI: 0000000000000001
[43170.631225] RBP: 0000563ef7bde970 R08: 0000000000000073 R09: 0000000000000001
[43170.631228] R10: 0000000000000000 R11: 0000000000000202 R12: 0000000000000006
[43170.631232] R13: 00007747f83295c0 R14: 00007747f8326f20 R15: 0000000000000000
[43170.631241] </TASK>
[43170.631244] ---[ end trace 0000000000000000 ]---
[43188.138981] ------------[ cut here ]------------
[43188.138987] list_del corruption, ffffad82c1e9bd10->next is NULL
[43188.138999] WARNING: CPU: 6 PID: 57011 at lib/list_debug.c:52 __list_del_entry_valid_or_report+0x5d/0xe0
[43188.139009] Modules linked in: scull(OE) ntfs3 snd_seq_dummy snd_hrtimer snd_seq ccm nvidia_drm(POE) nvidia_uvm(POE) nvidia_modeset(POE) nvidia(POE) vfat fat intel_rapl_msr intel_rapl_common edac_mce_amd kvm_amd iwlmvm kvm mac80211 irqbypass mousedev snd_usb_audio joydev crct10dif_pclmul crc32_pclmul polyval_clmulni polyval_generic snd_usbmidi_lib snd_ump snd_hda_codec_realtek snd_rawmidi snd_hda_codec_generic snd_seq_device ledtrig_audio gf128mul snd_hda_codec_hdmi mc ghash_clmulni_intel sha512_ssse3 sha256_ssse3 sha1_ssse3 aesni_intel snd_hda_intel snd_intel_dspcfg snd_intel_sdw_acpi snd_hda_codec libarc4 snd_hda_core btusb btrtl btintel iwlwifi btbcm snd_hwdep btmtk snd_pcm bluetooth cfg80211 snd_timer snd r8169 crypto_simd cryptd ecdh_generic rapl soundcore realtek sp5100_tco mdio_devres k10temp libphy rfkill i2c_piix4 video ccp gigabyte_wmi wmi_bmof pcspkr acpi_cpufreq gpio_amdpt wmi mac_hid gpio_generic i2c_dev crypto_user loop fuse dm_mod nfnetlink ip_tables x_tables ext4 crc32c_generic crc16 mbcache jbd2
[43188.139153] usbhid nvme nvme_core crc32c_intel xhci_pci xhci_pci_renesas nvme_auth
[43188.139166] Unloaded tainted modules: scull(OE):13 [last unloaded: scull(OE)]
[43188.139175] CPU: 6 PID: 57011 Comm: bash Tainted: P R D W OE 6.7.0-arch3-1 #1 29ada86f174bb9983ea57568622d66509982ed7e
[43188.139182] Hardware name: Gigabyte Technology Co., Ltd. B450M DS3H WIFI/B450M DS3H WIFI-CF, BIOS F52 01/07/2021
[43188.139186] RIP: 0010:__list_del_entry_valid_or_report+0x5d/0xe0
[43188.139191] Code: 48 8b 01 48 39 f8 75 67 48 8b 72 08 48 39 c6 75 74 b8 01 00 00 00 e9 32 05 77 00 48 89 fe 48 c7 c7 f8 c8 2a 92 e8 33 24 a5 ff <0f> 0b 31 c0 e9 1a 05 77 00 48 89 fe 48 c7 c7 20 c9 2a 92 e8 1b 24
[43188.139196] RSP: 0018:ffffad82c1e9bcf8 EFLAGS: 00010082
[43188.139200] RAX: 0000000000000000 RBX: 7fffffffffffffff RCX: 0000000000000027
[43188.139204] RDX: ffff89f40e9a16c8 RSI: 0000000000000001 RDI: ffff89f40e9a16c0
[43188.139208] RBP: ffffad82c1e9bd68 R08: 0000000000000000 R09: ffffad82c1e9bb80
[43188.139211] R10: 0000000000000003 R11: ffff89f41f32b368 R12: ffffffffc24b87c8
[43188.139214] R13: 0000000000000001 R14: 0000000000000001 R15: ffff89f270b10000
[43188.139217] FS: 00007747f80d6740(0000) GS:ffff89f40e980000(0000) knlGS:0000000000000000
[43188.139222] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[43188.139225] CR2: 00007740023bd698 CR3: 00000001c487c000 CR4: 0000000000350ef0
[43188.139229] Call Trace:
[43188.139233] <TASK>
[43188.139236] ? __list_del_entry_valid_or_report+0x5d/0xe0
[43188.139241] ? __warn+0x81/0x130
[43188.139248] ? __list_del_entry_valid_or_report+0x5d/0xe0
[43188.139253] ? report_bug+0x171/0x1a0
[43188.139261] ? prb_read_valid+0x1b/0x30
[43188.139267] ? srso_return_thunk+0x5/0x5f
[43188.139274] ? handle_bug+0x3c/0x80
[43188.139280] ? exc_invalid_op+0x17/0x70
[43188.139286] ? asm_exc_invalid_op+0x1a/0x20
[43188.139298] ? __list_del_entry_valid_or_report+0x5d/0xe0
[43188.139304] ? __list_del_entry_valid_or_report+0x5d/0xe0
[43188.139308] __down_common+0xdb/0x230
[43188.139318] down_interruptible+0x52/0x60
[43188.139325] scull_write+0x4c/0x200 [scull bd55e810425245067618b333771c8e3ae1dc9535]
[43188.139338] vfs_write+0xf2/0x400
[43188.139350] ksys_write+0x6f/0xf0
[43188.139358] do_syscall_64+0x64/0xe0
[43188.139363] ? srso_return_thunk+0x5/0x5f
[43188.139368] ? syscall_exit_to_user_mode+0x2b/0x40
[43188.139373] ? srso_return_thunk+0x5/0x5f
[43188.139378] ? do_syscall_64+0x70/0xe0
[43188.139382] ? srso_return_thunk+0x5/0x5f
[43188.139387] ? do_syscall_64+0x70/0xe0
[43188.139392] ? srso_return_thunk+0x5/0x5f
[43188.139397] ? exc_page_fault+0x7f/0x180
[43188.139403] entry_SYSCALL_64_after_hwframe+0x6e/0x76
[43188.139409] RIP: 0033:0x7747f8254034
[43188.139432] Code: c7 00 16 00 00 00 b8 ff ff ff ff c3 66 2e 0f 1f 84 00 00 00 00 00 f3 0f 1e fa 80 3d 35 c3 0d 00 00 74 13 b8 01 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 54 c3 0f 1f 00 48 83 ec 28 48 89 54 24 18 48
[43188.139436] RSP: 002b:00007fffe0667af8 EFLAGS: 00000202 ORIG_RAX: 0000000000000001
[43188.139442] RAX: ffffffffffffffda RBX: 0000000000000006 RCX: 00007747f8254034
[43188.139445] RDX: 0000000000000006 RSI: 0000563ef7bde970 RDI: 0000000000000001
[43188.139448] RBP: 0000563ef7bde970 R08: 0000000000000073 R09: 0000000000000001
[43188.139452] R10: 0000000000000000 R11: 0000000000000202 R12: 0000000000000006
[43188.139455] R13: 00007747f83295c0 R14: 00007747f8326f20 R15: 0000000000000000
[43188.139464] </TASK>
[43188.139467] ---[ end trace 0000000000000000 ]---
[43188.139503] scull: Released device 0
[43189.594736] scull: Opened device 0
[43189.594753] ------------[ cut here ]------------
[43189.594757] list_add corruption. prev is NULL.
[43189.594766] WARNING: CPU: 6 PID: 57011 at lib/list_debug.c:25 __list_add_valid_or_report+0x42/0xa0
[43189.594777] Modules linked in: scull(OE) ntfs3 snd_seq_dummy snd_hrtimer snd_seq ccm nvidia_drm(POE) nvidia_uvm(POE) nvidia_modeset(POE) nvidia(POE) vfat fat intel_rapl_msr intel_rapl_common edac_mce_amd kvm_amd iwlmvm kvm mac80211 irqbypass mousedev snd_usb_audio joydev crct10dif_pclmul crc32_pclmul polyval_clmulni polyval_generic snd_usbmidi_lib snd_ump snd_hda_codec_realtek snd_rawmidi snd_hda_codec_generic snd_seq_device ledtrig_audio gf128mul snd_hda_codec_hdmi mc ghash_clmulni_intel sha512_ssse3 sha256_ssse3 sha1_ssse3 aesni_intel snd_hda_intel snd_intel_dspcfg snd_intel_sdw_acpi snd_hda_codec libarc4 snd_hda_core btusb btrtl btintel iwlwifi btbcm snd_hwdep btmtk snd_pcm bluetooth cfg80211 snd_timer snd r8169 crypto_simd cryptd ecdh_generic rapl soundcore realtek sp5100_tco mdio_devres k10temp libphy rfkill i2c_piix4 video ccp gigabyte_wmi wmi_bmof pcspkr acpi_cpufreq gpio_amdpt wmi mac_hid gpio_generic i2c_dev crypto_user loop fuse dm_mod nfnetlink ip_tables x_tables ext4 crc32c_generic crc16 mbcache jbd2
[43189.594923] usbhid nvme nvme_core crc32c_intel xhci_pci xhci_pci_renesas nvme_auth
[43189.594936] Unloaded tainted modules: scull(OE):13 [last unloaded: scull(OE)]
[43189.594945] CPU: 6 PID: 57011 Comm: bash Tainted: P R D W OE 6.7.0-arch3-1 #1 29ada86f174bb9983ea57568622d66509982ed7e
[43189.594951] Hardware name: Gigabyte Technology Co., Ltd. B450M DS3H WIFI/B450M DS3H WIFI-CF, BIOS F52 01/07/2021
[43189.594955] RIP: 0010:__list_add_valid_or_report+0x42/0xa0
[43189.594960] Code: 75 41 4c 8b 02 49 39 c0 75 4c 48 39 fa 74 60 49 39 f8 74 5b b8 01 00 00 00 e9 fa 05 77 00 48 c7 c7 d0 c7 2a 92 e8 fe 24 a5 ff <0f> 0b 31 c0 e9 e5 05 77 00 48 c7 c7 f8 c7 2a 92 e8 e9 24 a5 ff 0f
[43189.594964] RSP: 0018:ffffad82c1e9bd28 EFLAGS: 00010086
[43189.594970] RAX: 0000000000000000 RBX: 7fffffffffffffff RCX: 0000000000000027
[43189.594973] RDX: ffff89f40e9a16c8 RSI: 0000000000000001 RDI: ffff89f40e9a16c0
[43189.594977] RBP: ffffad82c1e9bd98 R08: 0000000000000000 R09: ffffad82c1e9bbb0
[43189.594980] R10: 0000000000000003 R11: ffff89f41f32b368 R12: ffffffffc24b87c8
[43189.594983] R13: 0000000000000001 R14: 0000000000000000 R15: ffffffffc24b87d0
[43189.594987] FS: 00007747f80d6740(0000) GS:ffff89f40e980000(0000) knlGS:0000000000000000
[43189.594991] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[43189.594995] CR2: 00007740023bd698 CR3: 00000001c487c000 CR4: 0000000000350ef0
[43189.594999] Call Trace:
[43189.595003] <TASK>
[43189.595006] ? __list_add_valid_or_report+0x42/0xa0
[43189.595011] ? __warn+0x81/0x130
[43189.595020] ? __list_add_valid_or_report+0x42/0xa0
[43189.595026] ? report_bug+0x171/0x1a0
[43189.595033] ? prb_read_valid+0x1b/0x30
[43189.595038] ? srso_return_thunk+0x5/0x5f
[43189.595046] ? handle_bug+0x3c/0x80
[43189.595052] ? exc_invalid_op+0x17/0x70
[43189.595058] ? asm_exc_invalid_op+0x1a/0x20
[43189.595069] ? __list_add_valid_or_report+0x42/0xa0
[43189.595075] ? __list_add_valid_or_report+0x42/0xa0
[43189.595079] __down_common+0x71/0x230
[43189.595090] down_interruptible+0x52/0x60
[43189.595096] scull_write+0x4c/0x200 [scull bd55e810425245067618b333771c8e3ae1dc9535]
[43189.595109] vfs_write+0xf2/0x400
[43189.595117] ? srso_return_thunk+0x5/0x5f
[43189.595122] ? syscall_exit_to_user_mode+0x2b/0x40
[43189.595127] ? srso_return_thunk+0x5/0x5f
[43189.595131] ? do_syscall_64+0x70/0xe0
[43189.595136] ? srso_return_thunk+0x5/0x5f
[43189.595141] ? filp_flush+0x52/0x80
[43189.595149] ksys_write+0x6f/0xf0
[43189.595157] do_syscall_64+0x64/0xe0
[43189.595162] ? do_syscall_64+0x70/0xe0
[43189.595166] ? syscall_exit_to_user_mode+0x2b/0x40
[43189.595171] ? srso_return_thunk+0x5/0x5f
[43189.595175] ? do_syscall_64+0x70/0xe0
[43189.595180] ? srso_return_thunk+0x5/0x5f
[43189.595184] ? syscall_exit_to_user_mode+0x2b/0x40
[43189.595189] ? srso_return_thunk+0x5/0x5f
[43189.595194] ? do_syscall_64+0x70/0xe0
[43189.595199] entry_SYSCALL_64_after_hwframe+0x6e/0x76
[43189.595205] RIP: 0033:0x7747f8254034
[43189.595228] Code: c7 00 16 00 00 00 b8 ff ff ff ff c3 66 2e 0f 1f 84 00 00 00 00 00 f3 0f 1e fa 80 3d 35 c3 0d 00 00 74 13 b8 01 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 54 c3 0f 1f 00 48 83 ec 28 48 89 54 24 18 48
[43189.595232] RSP: 002b:00007fffe0667af8 EFLAGS: 00000202 ORIG_RAX: 0000000000000001
[43189.595237] RAX: ffffffffffffffda RBX: 0000000000000006 RCX: 00007747f8254034
[43189.595241] RDX: 0000000000000006 RSI: 0000563ef7bde970 RDI: 0000000000000001
[43189.595244] RBP: 0000563ef7bde970 R08: 0000000000000073 R09: 0000000000000001
[43189.595247] R10: 0000000000000000 R11: 0000000000000202 R12: 0000000000000006
[43189.595250] R13: 00007747f83295c0 R14: 00007747f8326f20 R15: 0000000000000000
[43189.595260] </TASK>
[43189.595263] ---[ end trace 0000000000000000 ]---
scull_follow
我通过删除 write 函数中的所有内容并仅使用down_interruptible
和来测试是否是该函数的问题,printk
看看是否是这种情况。我遇到了同样的问题。我假设该问题与信号量有关。请指导我该怎么做。