คำถามติดแท็ก linux-kernel

แท็กนี้มีไว้สำหรับคำถามเกี่ยวกับภายในของเคอร์เนล Linux โดยเฉพาะอย่างยิ่งเกี่ยวกับการเขียนโค้ดที่ทำงานภายในบริบทของเคอร์เนล (เช่นโมดูลเคอร์เนลหรือไดรเวอร์) โดยทั่วไปคำถามเกี่ยวกับการเขียนรหัส userspace ใน Linux ควรติดแท็ก [linux] แทน เนื่องจากภายในของเคอร์เนลลินุกซ์มีการเปลี่ยนแปลงอยู่ตลอดเวลาจึงเป็นประโยชน์ที่จะรวมเวอร์ชันเคอร์เนลที่แม่นยำที่คุณสนใจ

3
หากเธรดใช้ PID เดียวกันจะระบุได้อย่างไร
ฉันมีคำถามเกี่ยวกับการใช้เธรดใน Linux Linux ไม่มีการสนับสนุนเธรดที่ชัดเจน ใน userspace เราอาจใช้เธรดไลบรารี (เช่น NPTL) สำหรับการสร้างเธรด ตอนนี้ถ้าเราใช้ NPTL จะรองรับการทำแผนที่ 1: 1 เคอร์เนลจะใช้clone()ฟังก์ชันเพื่อใช้เธรด สมมติว่าฉันสร้าง 4 เธรด จากนั้นก็หมายความว่า: จะมี 4 task_struct. ภายในจะมีการจัดหาทรัพยากรที่ใช้ร่วมกันตามข้อโต้แย้งในการโคลนtask_struct(CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND) ตอนนี้ฉันมีคำถามต่อไปนี้: 4 เธรดจะมี PID เดียวกันหรือไม่? หากมีใครสามารถอธิบายได้อย่างละเอียดจะมีการแบ่งปัน PID อย่างไร มีการระบุเธรดต่างๆอย่างไร มีแนวคิด TID (thread ID) บ้างไหม

2
อ่าน / เขียนไฟล์ภายในโมดูลเคอร์เนล Linux
ฉันรู้การอภิปรายทั้งหมดเกี่ยวกับสาเหตุที่ไม่ควรอ่าน / เขียนไฟล์จากเคอร์เนลแทนที่จะใช้/ procหรือnetlinkเพื่อทำเช่นนั้น ฉันต้องการอ่าน / เขียนต่อไป ฉันได้อ่าน Driving Me Nuts - สิ่งที่คุณไม่ควรทำในเคอร์เนลด้วย แต่ปัญหาก็คือว่า 2.6.30 sys_read()ไม่ได้ส่งออก SYSCALL_DEFINE3แต่มันอยู่ในห่อ ดังนั้นหากฉันใช้มันในโมดูลของฉันฉันจะได้รับคำเตือนต่อไปนี้: WARNING: "sys_read" [xxx.ko] undefined! WARNING: "sys_open" [xxx.ko] undefined! เห็นได้ชัดว่าinsmodไม่สามารถโหลดโมดูลได้เนื่องจากการเชื่อมโยงเกิดขึ้นไม่ถูกต้อง คำถาม: วิธีอ่าน / เขียนภายในเคอร์เนลหลังจาก 2.6.22 (โดยที่ sys_read() / sys_open()ไม่ถูกส่งออก) โดยทั่วไปจะใช้การเรียกระบบที่ห่อด้วยมาโครSYSCALL_DEFINEn()จากภายในเคอร์เนลได้อย่างไร?

14
วิธี "จำศีล" กระบวนการใน Linux โดยการจัดเก็บหน่วยความจำลงดิสก์และกู้คืนในภายหลัง
เป็นไปได้ไหมที่จะ 'จำศีล' กระบวนการใน linux? เช่นเดียวกับ 'จำศีล' ในแล็ปท็อปฉันจะเขียนหน่วยความจำทั้งหมดที่ใช้โดยกระบวนการลงในดิสก์เพิ่ม RAM จากนั้นในภายหลังฉันสามารถ 'ดำเนินการต่อ' ได้คืออ่านข้อมูลทั้งหมดจากหน่วยความจำและนำกลับไปที่ RAM แล้วฉันจะดำเนินการต่อได้หรือไม่

3
บริบทจะเปลี่ยนช้าลงมากในเมล็ดลินุกซ์ใหม่
เรากำลังต้องการอัพเกรดระบบปฏิบัติการบนเซิร์ฟเวอร์ของเราจาก Ubuntu 10.04 LTS เป็น Ubuntu 12.04 LTS น่าเสียดายที่ดูเหมือนว่าเวลาในการตอบสนองในการรันเธรดที่รันได้นั้นเพิ่มขึ้นอย่างมีนัยสำคัญจาก 2.6 เคอร์เนลเป็น 3.2 เคอร์เนล ในความเป็นจริงตัวเลขเวลาแฝงที่เราได้รับนั้นยากที่จะเชื่อ ให้ฉันเจาะจงมากขึ้นเกี่ยวกับการทดสอบ เรามีโปรแกรมที่ทำงานสองเธรด เธรดแรกได้รับเวลาปัจจุบัน (ในเห็บโดยใช้ RDTSC) แล้วส่งสัญญาณตัวแปรเงื่อนไขวินาทีละครั้ง เธรดที่สองรอตัวแปรเงื่อนไขและตื่นขึ้นมาเมื่อมีการส่งสัญญาณ จากนั้นจะได้รับเวลาปัจจุบัน (ในเห็บโดยใช้ RDTSC) ความแตกต่างระหว่างเวลาในเธรดที่สองและเวลาในเธรดแรกจะถูกคำนวณและแสดงบนคอนโซล หลังจากนี้เธรดที่สองจะรอตัวแปรเงื่อนไขอีกครั้ง เธรดแรกจะส่งสัญญาณอีกครั้งหลังจากผ่านไปประมาณหนึ่งวินาที ดังนั้นโดยสรุปเราจะได้รับการสื่อสารแบบเธรดต่อเธรดผ่านการวัดเวลาแฝงตัวแปรเงื่อนไขหนึ่งวินาทีเป็นผล ในเคอร์เนล 2.6.32 เวลาแฝงนี้อยู่ที่ใดที่หนึ่งตามลำดับของ 2.8-3.5 us ซึ่งสมเหตุสมผล ในเคอร์เนล 3.2.0 เวลาแฝงนี้เพิ่มขึ้นเป็นที่ใดที่หนึ่งตามลำดับ 40-100 เรา ฉันได้ยกเว้นความแตกต่างใด ๆ ในฮาร์ดแวร์ระหว่างโฮสต์ทั้งสอง พวกเขาทำงานบนฮาร์ดแวร์ที่เหมือนกัน (โปรเซสเซอร์ซ็อกเก็ตคู่ X5687 {Westmere-EP} ที่ทำงานที่ 3.6 GHz พร้อมกับไฮเปอร์เธรดความเร็วขั้นตอนและสถานะ …

6
จะหลีกเลี่ยงคำเตือน transparent_hugepage / defrag จาก mongodb ได้อย่างไร?
ฉันได้รับคำเตือนต่อไปนี้จาก mongodb เกี่ยวกับ THP 2015-03-06T21:01:15.526-0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'. 2015-03-06T21:01:15.526-0800 I CONTROL [initandlisten] ** We suggest setting it to 'never' แต่ฉันจัดการปิด THP ด้วยตนเอง frederick@UbuntuVirtual:~$ cat /sys/kernel/mm/transparent_hugepage/enabled always madvise [never] frederick@UbuntuVirtual:~$ cat /sys/kernel/mm/transparent_hugepage/defrag always madvise [never] ฉันไม่หลอกลวงโดยการเพิ่มtransparent_hugepage=neverการGRUB_CMDLINE_LINUX_DEFAULTใน/etc/default/grubและการเพิ่ม if test -f /sys/kernel/mm/transparent_hugepage/defrag; then echo never > /sys/kernel/mm/transparent_hugepage/defrag fi …

2
คืออะไร = ใน Makefile
KDIR ?= $(shell uname -r) ความหมายของ?=อะไร? ฉันได้เข้าใจความแตกต่างระหว่าง:=, +=และ=จากหัวข้ออื่นที่มีอยู่ในกองมากเกิน ?=แต่ไม่สามารถหาคำอธิบายสำหรับ

2
vdso และ vsyscall คืออะไร?
ฉันทำ sudo cat /proc/1/maps -vv ฉันพยายามทำความเข้าใจกับผลลัพธ์ฉันเห็นไลบรารีที่แชร์จำนวนมากถูกแมปกับเซ็กเมนต์การแมปหน่วยความจำตามที่คาดไว้ 7f3c00137000-7f3c00179000 r-xp 00000000 08:01 21233923 /lib/x86_64-linux-gnu/libdbus-1.so.3.5.8 7f3c00179000-7f3c00379000 ---p 00042000 08:01 21233923 /lib/x86_64-linux-gnu/libdbus-1.so.3.5.8 7f3c00379000-7f3c0037a000 r--p 00042000 08:01 21233923 /lib/x86_64-linux-gnu/libdbus-1.so.3.5.8 7f3c0037a000-7f3c0037b000 rw-p 00043000 08:01 21233923 /lib/x86_64-linux-gnu/libdbus-1.so.3.5.8 7f3c0037b000-7f3c00383000 r-xp 00000000 08:01 21237216 /lib/x86_64-linux-gnu/libnih-dbus.so.1.0.0 7f3c00383000-7f3c00583000 ---p 00008000 08:01 21237216 /lib/x86_64-linux-gnu/libnih-dbus.so.1.0.0 7f3c00583000-7f3c00584000 r--p 00008000 08:01 21237216 /lib/x86_64-linux-gnu/libnih-dbus.so.1.0.0 7f3c00584000-7f3c00585000 rw-p …
89 c  linux  linux-kernel  kernel  vdso 

3
การใช้ gdb กับโค้ดแอสเซมบลีขั้นตอนเดียวที่นอกเหนือจากปฏิบัติการที่ระบุทำให้เกิดข้อผิดพลาด“ ไม่พบขอบเขตของฟังก์ชันปัจจุบัน”
ฉันอยู่นอกเป้าหมายปฏิบัติการของ gdb และฉันไม่มีสแต็กที่ตรงกับเป้าหมายนั้นด้วยซ้ำ ฉันต้องการทำทีละขั้นตอนเพื่อที่ฉันจะได้ตรวจสอบว่าเกิดอะไรขึ้นในรหัสแอสเซมบลีของฉันเพราะฉันไม่ใช่ผู้เชี่ยวชาญในการประกอบ x86 น่าเสียดายที่ gdb ปฏิเสธที่จะทำการดีบักระดับแอสเซมบลีอย่างง่ายนี้ ช่วยให้ฉันสามารถตั้งค่าและหยุดบนเบรกพอยต์ที่เหมาะสมได้ แต่ทันทีที่ฉันพยายามทำทีละขั้นตอนเป็นต้นไป gdb รายงานข้อผิดพลาด "ไม่พบขอบเขตของฟังก์ชันปัจจุบัน" และ EIP จะไม่เปลี่ยนแปลง รายละเอียดเพิ่มเติม: รหัสเครื่องถูกสร้างขึ้นโดยคำสั่ง gcc asm และฉันคัดลอกไปยังตำแหน่งหน่วยความจำเคอร์เนลที่มันทำงานจากเอาต์พุตของ objdump -d ฉันไม่รังเกียจวิธีง่ายๆในการใช้ตัวโหลดเพื่อโหลดรหัสออบเจ็กต์ของฉันไปยังที่อยู่ที่ย้ายตำแหน่ง แต่จำไว้ว่าการโหลดจะต้องทำในโมดูลเคอร์เนล ฉันคิดว่าอีกทางเลือกหนึ่งคือการสร้างโมดูลเคอร์เนลปลอมหรือไฟล์ข้อมูลการดีบักเพื่อมอบให้กับ gdb เพื่อทำให้เชื่อว่าพื้นที่นี้อยู่ในโค้ดโปรแกรม gdb ทำงานได้ดีบนเคอร์เนลที่รันได้เอง (สำหรับผู้ที่ต้องการทราบจริงๆฉันกำลังแทรกโค้ดที่รันไทม์ลงในพื้นที่ข้อมูลเคอร์เนลของลินุกซ์ภายใน VMware VM และทำการดีบักจาก gdb รีโมตดีบักเคอร์เนลผ่าน gdb ในตัวของ VMware Workstation หมายเหตุฉันไม่ได้เขียนเคอร์เนล หาประโยชน์ฉันเป็นนักศึกษาระดับบัณฑิตศึกษาด้านความปลอดภัยที่เขียนต้นแบบ) (ฉันสามารถตั้งค่าเบรกพอยต์สำหรับแต่ละคำสั่งภายในแอสเซมบลีของฉันได้ซึ่งใช้งานได้ แต่จะค่อนข้างลำบากหลังจากนั้นสักครู่เนื่องจากขนาดของคำแนะนำการประกอบ x86 จะแตกต่างกันไปและตำแหน่งของการประกอบจะเปลี่ยนไปทุกครั้งที่รีบูต)

4
ความต้องการของวงเล็บปีกกาว่างเปล่า '{}' ในตอนท้ายของอาร์เรย์ struct คืออะไร?
ฉันกดรหัสc ใน Linux kernel: static struct ctl_table ip_ct_sysctl_table[] = { { .procname = "ip_conntrack_max", .maxlen = sizeof(int), .mode = 0644, .proc_handler = proc_dointvec, }, // ... { .procname = "ip_conntrack_log_invalid", .maxlen = sizeof(unsigned int), .mode = 0644, .proc_handler = proc_dointvec_minmax, .extra1 = &log_invalid_proto_min, .extra2 = &log_invalid_proto_max, }, { } }; …

2
การส่ง TCP พื้นที่ผู้ใช้ที่ไม่มีการคัดลอกของหน่วยความจำที่แมป dma_mmap_coherent ()
ฉันใช้ Linux 5.1 บน Cyclone V SoC ซึ่งเป็น FPGA ที่มีสอง ARMv7 cores ในหนึ่งชิป เป้าหมายของฉันคือการรวบรวมข้อมูลจำนวนมากจากอินเทอร์เฟซภายนอกและสตรีม (ส่วนหนึ่ง) ข้อมูลนี้ผ่านทางซ็อกเก็ต TCP ความท้าทายที่นี่คืออัตราข้อมูลสูงมากและอาจเข้าใกล้อินเทอร์เฟซ GbE ที่อิ่มตัว ฉันมีการนำไปใช้งานที่ใช้การwrite()เรียกไปยังซ็อกเก็ต แต่มันใช้งานได้ที่ 55MB / s; ประมาณครึ่งหนึ่งของขีด จำกัด GbE ตามทฤษฎี ตอนนี้ฉันกำลังพยายามให้การส่ง TCP เป็นศูนย์คัดลอกเพื่อเพิ่มปริมาณงาน แต่ฉันชนกำแพง เพื่อให้ได้ข้อมูลจาก FPGA ลงในพื้นที่ผู้ใช้ Linux ฉันได้เขียนไดรเวอร์เคอร์เนล ไดรเวอร์นี้ใช้บล็อก DMA ใน FPGA เพื่อคัดลอกข้อมูลจำนวนมากจากอินเทอร์เฟซภายนอกไปยังหน่วยความจำ DDR3 ที่ต่ออยู่กับแกน ARMv7 จัดสรรโปรแกรมควบคุมหน่วยความจำนี้เป็นพวงของบัฟเฟอร์ 1MB ต่อเนื่องกันเมื่อตรวจสอบโดยใช้dma_alloc_coherent()กับGFP_USERและ exposes …

1
เหตุใดจึงกำหนดแมโครให้กับฟังก์ชันด้วยชื่อเดียวกัน
ฉันพบรหัสด้านล่างในhttps://github.com/torvalds/linux/blob/master/arch/x86/include/asm/atomic.h static __always_inline bool arch_atomic_sub_and_test(int i, atomic_t *v) { return GEN_BINARY_RMWcc(LOCK_PREFIX "subl", v->counter, e, "er", i); } #define arch_atomic_sub_and_test arch_atomic_sub_and_test สิ่งที่#defineทำจริงๆ? เมื่อใดที่จำเป็นต้องทำ
12 c  linux-kernel 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.