Notes
main
main
  • Introduction
  • linuxKernel
    • tips
    • make_help
    • old linux
      • compile_linux0.11
      • TestEnvironment
      • load_setup
      • get_hard_data
    • list
    • plist
    • fifo
    • idr
    • xarray
    • rbtree
    • maple_tree
    • syscall
    • bitmap
    • page
    • page_flags
    • page_size
    • page mapcount
    • page refcount
    • folio
    • slub
      • proc_slabinfo
      • slub_theory
      • kmalloc_kfree
      • kmem_cache
      • slab_alloc
      • slab_free
      • proc_meminfo_SReclaimable_SReclaimable
    • vmalloc
    • brk
    • mmap
    • mremap
    • mprotect
    • madvise
    • read
    • write
    • shmem
    • huge_page
    • page_fault
    • rmap
    • lru
    • multi-gen-LRU
    • page_reclaim
    • page_cache
    • page_table
    • rcu
    • kvm
    • aarch64_boot
    • tracing_system
    • cache_coherence_and_memory_consistency
    • cpu_speculates
    • mmap_lock
    • per-vma_lock
    • cgroup
    • symbol
    • campact
    • page_ext
    • mempool
    • kernelstack
    • filesystem
    • io_stack
    • workingset
    • ioremap
    • sched_period
  • linuxDebug
    • openocd_openjtag
    • i2c_tools
    • objdump
    • addr2line
    • gdb_useage
    • debug_linux_kernel_via_gdb
    • debug_linux_module_via_gdb
    • early_boot
    • sequentially_execute
    • dynamic_debug
    • research_linuxKernel_by_patch
    • tracefs
    • ebpf
    • bpftrace
    • perf
    • flame_graph
    • crash
    • ASAN_HWASAN_MTE_check_mem_bug
    • page_owner
    • vmtouch
    • fio
    • benchmark
  • linuxSystem
    • common
      • system_version
      • procfs
      • proc_sys_vm
      • cmd_ps
      • makefile
      • file_descriptor
      • psi
      • ulimit
      • top
      • delay_accounting
    • ubuntu
      • custom_kernel
      • get_cmd_src
      • record_ssh_info
      • log
      • run_custom_script
      • repo
      • cockpit
      • nfs
      • tftp
      • misc
    • fedora
      • system_upgrade
      • custom_kernel
      • lvextend
      • yt-dlp
      • jellyfin
  • linuxDriver
    • i2c_peripherals_driver
    • spi_peripherals_driver
    • gpio_subsystem
    • IRQ_driver
    • blockIO_unblockIO_async
    • linux_own_driver
    • misc_device
    • input_device
    • timer
    • atomic_spinlock_semaphore_mutex
    • lcd
    • touch_screen
    • debugfs
    • v4l2
    • mmap
  • hardware
    • paging_mmu_pt
    • iommu
  • process_thread_scheduler
    • scheduler01
    • scheduler02
    • scheduler03
    • scheduler04
    • scheduler05
    • scheduler06
  • memory_management
    • mm1
    • mm2
    • mm3
    • mm4
    • mm5
  • input_output_filesystem
    • io_fs_01
    • io_fs_02
    • io_fs_03
    • io_fs_04
  • lock_and_lockup_detector
    • general_lock
    • hung_task
    • softLockup_hardLockup
    • crash_experiment
  • MIT_6.S081
    • 6.S081_Operating_System_Engineering
    • Schedule.md
    • Class
      • Overview
      • Administrivia
    • Labs
      • Tools
      • Guidance
      • startup
      • syscall
      • page_table
      • Calling_Convention
      • traps
    • xv6
      • xv6
    • References.md
  • qemu
    • qemu_buildroot
    • qemu_busybox.md
    • Serial.md
    • demo_mini2440
      • 0_compilation_error_summary
      • 1_compilation_steps
      • 2_operation_mode
      • 3_transplant_tools_libraries
      • 4_tools_use
      • reference_website
  • tools
    • getKernelSourceCodeList
    • nat
    • shell
    • translating
    • YouCompleteMe
    • cscope
    • global
    • vscode
    • vim
    • binary
    • markdown
    • draw
    • git
    • tig
    • tmux
    • mail_client
    • download_patchset_from_LKML
    • minicom
    • clash
  • other
    • interview
    • interview_c_base
    • know_dontknow
    • Stop-Ask-Questions-The-Stupid-Ways
    • How-To-Ask-Questions-The-Smart-Way
    • docker
    • buildroot
    • rv32_to_rv64
Powered by GitBook
On this page

Was this helpful?

  1. linuxKernel

bitmap

简介

base linux-5.4

bitmap

实践

头文件

#include <linux/bitmap.h>

与/或/非/异或/与非操作

void bitmap_test(void)
{
	unsigned long dst, src1, src2;
	unsigned int nbits;

	src1 = 0x2345;
	src2 = 0xff;
	nbits = 12;

	bitmap_and(&dst, &src1, &src2, nbits); // 与操作
	printk("bitmap: 0x%lx and 0x%lx\t = 0x%lx\n", src1, src2, dst);

	bitmap_or(&dst, &src1, &src2, nbits);  // 或操作
	printk("bitmap: 0x%lx or 0x%lx\t = 0x%lx\n", src1, src2, dst);

	bitmap_xor(&dst, &src1, &src2, nbits); // 异或操作
	printk("bitmap: 0x%lx xor 0x%lx\t = 0x%lx\n", src1, src2, dst);

	bitmap_complement(&dst, &src2, nbits); // 非操作
	printk("bitmap: 0x%lx complement\t = 0x%lx\n", src2, dst);

	nbits = 16;
	bitmap_andnot(&dst, &src1, &src2, nbits); // 与非操作
	printk("bitmap: 0x%lx andnot 0x%lx\t = 0x%lx\n", src1, src2, dst);
}

执行后,如下:

bitmap: 0x2345 and 0xff  = 0x45
bitmap: 0x2345 or 0xff   = 0x23ff
bitmap: 0x2345 xor 0xff  = 0x23ba
bitmap: 0xff complement  = 0xffffff00
bitmap: 0x2345 andnot 0xff       = 0x2300

置位、清零、填充操作

void bitmap_test(void)
{
	unsigned long dst, src1, src2;
	unsigned int nbits, start;

	src2 = 0xff;
	start = 9;
	nbits = 4;
	bitmap_set(&src2, start, nbits); // 置位操作
	printk("bitmap: 0xff set 9~12 bits\t = 0x%lx\n", src2);

	src2 = 0xff;
	start = 5;
	nbits = 3;
	bitmap_clear(&src2, start, nbits); // 清零操作
	printk("bitmap: 0xff clear 5~7 bits\t = 0x%lx\n", src2);

	src2 = 0x20;
	nbits = 32;
	bitmap_fill(&src2, nbits);         // 填充操作
	printk("bitmap: 0x20 fill\t = 0x%lx\n", src2);
}

执行后,如下:

bitmap: 0xff set 9~12 bits       = 0x1eff
bitmap: 0xff clear 5~7 bits      = 0x1f
bitmap: 0x20 fill        = 0xffffffff

位移操作

void bitmap_test(void)
{
	unsigned long dst, src1, src2;
	unsigned int nbits, shift;

	src2 = 0x12345678;
	nbits = 32;
	shift = 4;
	bitmap_shift_left(&dst, &src2, shift, nbits); // 左移操作
	printk("bitmap: 0x%lx shift left 4 bits\t = 0x%lx\n", src2, dst);
	bitmap_shift_right(&dst, &src2, shift, nbits); // 右移操作
	printk("bitmap: 0x%lx shift right 4 bits\t = 0x%lx\n", src2, dst);
}

执行后,如下:

bitmap: 0x12345678 shift left 4 bits     = 0x23456780
bitmap: 0x12345678 shift right 4 bits    = 0x1234567

遍历操作

void bitmap_test(void)
{
	unsigned long dst, src1, src2, bit;
	unsigned int nbits;

	src2 = 0xf0;
	nbits = 8;
	bit = 0 ;
	for_each_clear_bit(bit, &src2, nbits) // 遍历清零位操作
		printk("bitmap: 0x%lx bit %ld is 0\n", src2, bit);
	for_each_set_bit(bit, &src2, nbits)   // 遍历置位操作
		printk("bitmap: 0x%lx bit %ld is 1\n", src2, bit);
}

执行后,如下:

bitmap: 0xf0 bit 0 is 0
bitmap: 0xf0 bit 1 is 0
bitmap: 0xf0 bit 2 is 0
bitmap: 0xf0 bit 3 is 0
bitmap: 0xf0 bit 4 is 1
bitmap: 0xf0 bit 5 is 1
bitmap: 0xf0 bit 6 is 1
bitmap: 0xf0 bit 7 is 1

其余操作

void bitmap_test(void)
{
	unsigned long dst, src1, src2;
	unsigned int nbits;

	src2 = 0xff00;
	nbits = 8;
	if(bitmap_empty(&src2, nbits)) // 判断是否为空
		printk("bitmap: 0x%lx low %d bits is empty\n", src2, nbits);
	else
		printk("bitmap: 0x%lx low %d bits isn't empty\n", src2, nbits);

	src1 = 0x1234;
	src2 = 0xff34;
	nbits = 8;
	if(bitmap_equal(&src1, &src2, nbits)) // 判断是否相等
		printk("bitmap: 0x%lx compare 0x%lx, low %d bits is equal\n",
               src1, src2, nbits);
	else
		printk("bitmap: 0x%lx compare 0x%lx, low %d bits isn't equal\n",
               src1, src2, nbits);
}

执行后,如下:

bitmap: 0xff00 low 8 bits is empty
bitmap: 0x1234 compare 0xff34, low 8 bits is equal
PrevioussyscallNextpage

Last updated 3 years ago

Was this helpful?